Il collo di bottiglia I / O di Linux con i dispositivi di trasferimento dei dati

Ho una macchina a 24 core con 94.6GiB RAM che esegue server Ubuntu 10.04. La casella si trova ad alta percentuale di iowait, a differenza di un altro server che abbiamo (4 core) che esegue gli stessi tipi e quantità di processi. Entrambe le macchine sono collegate a un file server VNX Raid, la macchina a 24 corpi tramite 4 tabs FC e l'altra tramite 2 gigabit Ethernet. La macchina a 4 corpi attualmente supera la potenza del 24-core, ha un utilizzo più elevato della CPU e più basso il% del valore.

Nei giorni di impiego di 9 giorni,% iowait raggiunge il 16%, ed è normalmente superiore al 30%. La maggior parte del tempo l'utilizzo della CPU è molto basso, circa il 5% (a causa dell'elevato livello). Vi è abbondanza di memory libera.

  • Dove è il file syslog.conf su ubuntu 10
  • allocazione della memory Java in Linux
  • perdita di memory? RHEL 5.5. RSS sembra ok, quasi nessuna memory libera sinistra, swap usato fortemente
  • C'è un modo per forzare la mia casella di Linux per sempre avviarsi con un indirizzo IP auto-assegnato?
  • Utilizzo di Linux LVM, posso cambiare il numero di strisce e "riequilibrare" il volume logico?
  • Buon modo per eseguire comandi sul computer remoto senza un proprio indirizzo IP (Linux Centos)
  • Una cosa che non capisco è il motivo per cui tutti i dati sembrano passare attraverso il dispositivo sdc anziché passare direttamente dai dispositivi di trasferimento dei dati:

    avg-cpu: %user %nice %system %iowait %steal %idle 6.11 0.39 0.75 16.01 0.00 76.74 Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn sda 0.00 0.00 0.00 1232 0 sdb 0.00 0.00 0.00 2960 0 sdc 1.53 43.71 44.54 36726612 37425026 dm-0 0.43 27.69 0.32 23269498 268696 dm-1 1.00 1.86 7.74 1566234 6500432 dm-2 0.96 1.72 5.97 1442482 5014376 dm-3 0.49 9.57 0.18 8040490 153272 dm-4 0.00 0.00 0.00 1794 24 dm-5 0.00 0.00 0.00 296 0 

    Un altro pezzo del puzzle è che le attività spesso entrano in modalità di rest intriggersbile (in cima), anche probabilmente a causa del holdup di io.

    Cosa posso vedere per aiutare a diagnosticare il problema? Perché tutti i dati passano attraverso / dev / sdc? È normale?

    AGGIORNARE:

    La connessione di networking e la capacità di lettura / scrittura VNX sono state escluse come strozzature. Possiamo raggiungere velocità di 800 MB / s con 4 NIC collegate (round-robin). Le tabs di canale in fibra non sono ancora utilizzate. Il VNX è in grado di gestire i dischi IO (RAID6, 30x2TB 7.2kRPM per pool in due pool (60 dischi totali), circa il 60% di lettura).

    Ignorare sopra circa dm e sdc, sono tutti dischi interni e non parte del problema.

    Penso che il problema potrebbe essere con i supporti nfs o TCP (abbiamo 5 supporti a 5 partizioni sul VNX), ma non so cosa esattamente. Qualche consiglio?

  • applicazione web che raggiunge limiti di posta elettronica - qual è il passo successivo?
  • Come risolvere i problemi di performance lente su AWS EC2 / RDS?
  • Come determinare i colli di bottiglia nell'ambiente Ubuntu LAMP
  • Quali valori iowait sono ok?
  • Trovare il collo di bottiglia: disco I / O in Windows XP
  • Flush-0: n processi causando massiccio collo di bottiglia
  • 6 Solutions collect form web for “Il collo di bottiglia I / O di Linux con i dispositivi di trasferimento dei dati”

    Prima di tutto se le vostre CPU (e dannatamente !, che è molto 24) mangiare dati più velocemente di quello che può fornire la memorizzazione dei dati, allora si ottiene iowait. Questo è quando il kernel interrompe un process durante un block io (una lettura che viene troppo lenta o una scrittura a sincronia).
    Controllare quindi che l'archiviazione possa fornire un sufficiente throughput per 24 core.

    Ad esempio, supponiamo che la tua archiviazione possa fornire un throughput di 500 MB / s, che si è connessi tramite una linea di 2 Gigabit Ethernet (bond), la networking limita già il throughput massimo a qualcosa di circa 100-180 MB / s. Se il process consuma dati alla velocità di 50 MB / s e si esegue 4 thread sulla tua macchina a 4 core: 4 x 50 MB / s = 200 MB / s consumato. Se la networking può sostenere i 180 MB / s, allora non avnetworking molto latenza e le CPU saranno caricate. La networking qui è un piccolo collo di bottiglia.
    Ora se si scalare fino a 24 core e 24 thread, è necessario 1200 MB / s, anche se si cambia il cablaggio per consentire tale throughput, il sistema di memorizzazione non fornisce più di 500 MB / s, diventa un collo di bottiglia.

    Quando si tratta di aspettare, le strozzature possono essere ovunque. Non solo sugli strati fisici, ma anche sui buffer di software e del kernel. Dipende in realtà dai templates di utilizzo. Ma poiché i colli di bottiglia del software sono molto più difficili da identificare, di solito è preferibile controllare il throughput teorico sull'hardware prima di indagare sugli stack software.

    Come detto, un iowait si verifica quando un process fa una lettura e i dati richiedono tempo per arrivare o quando effettua una scrittura di sincronizzazione e la conferma di modifica dei dati prende il tempo. Durante una scrittura a sincronizzazione, il process entra in sleep interrotto in modo che i dati non vengano danneggiati. C'è un pratico strumento per vedere quale chiamata fa appendere un process: latencytop . Non è l'unico del suo genere, ma puoi provarlo.

    Nota: per le tue informazioni, dm rappresenta il mapper del dispositivo e non i movimenti di dati.

    Prima di tutto, l'inferno sacro è un sacco di ferro! 🙂

    Purtroppo dal momento che il tuo setup sembra molto complesso, non credo che qualcuno sarà in grado di fornire un diritto "c'è il tuo problema!" risposta, a less che non abbiano fatto qualcosa con un'impostazione estremamente simile o identica e che hanno riscontrato lo stesso problema. Così, mentre questo text è etichettato da SU come "Risposta", probabilmente dovresti considerarlo più come un "Suggerimento". E non posso metterlo nei commenti perché sono troppe parole. :S

    Senza sapere come l'hardware viene mappato ai dispositivi, è difficile dire perché l'I / O sta andando in un posto e non in un altro. Come si dispone dei dispositivi montati? I tuoi programmi accedono direttamente ai dispositivi sd* o sono tutti i file system montati sui dispositivi dm e tutti gli accessi di file si verificano da lì?

    Altre cose che devo chiedere:

    • Che tipo di RAID è? Se stai calcolando bit di parità con RAID5 o RAID6, si spera che si prenda cura degli hardware del raid server … se non, i server di elaborazione stanno facendo quello …. che è suboptimale e può causare la latenza di I / O se fatto in software.

    • Hai eliminato una delle differenze principali tra i due server nel tuo messaggio. Uno sta utilizzando il canale in fibra e uno sta utilizzando ethernet. Il canale della fibra dovrebbe fornire una migliore latenza e una width di banda, ma forse anche questo è un problema: se fornisce un sacco di produttività, potrebbe rendere il server RAID molto occupato e la congestione port a riempire buffer / cache aumenta la latenza, il che provoca maggiori attesi I / O.

    È quasi come se tu possa avere un problema di block del buffer con i tuoi arrays di dischi – lo sai? I controller RAID hardware normalmente hanno una grande quantità di cache a bordo, vero? Così come I / O ai media viene fatta in cima e le cache vengono piene di pagine sporche, alla fine tutta la cosa è satura (se l'accumulo meccanico non riesce a tenere il passo con il carico) e la latenza scorre attraverso il tetto … sicuramente puoi produrre più carico con 24 core + FC che con 4 core + GbE 🙂 Controllare il server RAID e vedere come sono occupati i dischi … un sacco di "I / O" può essere solo pacchetti di controllo ecc. Non sono sicuro di come funziona FC, ma se è qualcosa di simile a TCP, vedrai ritrasmesse se le latenze sono troppo alte.

    Come se si chiede a qualcuno una domanda sul telefono e non rispondono per alcuni secondi, si dice "Ciao?" – i protocolli di networking (e FC è solo un protocollo di networking) fanno la stessa cosa, solo in tempi più brevi. Ma naturalmente questo extra "Ciao?" è costoso nel context della networking perché aggiunge ancora più dati a un pipe già congestionato.

    In chiusura, un suggerimento generale:

    Quando il debug di latenza / IO attende / problemi di throughput, misura sempre. Misurare ovunque. Misurare sul filo, misurare i programmi stessi, misurare alla fine del process, misurare sul server RAID, ecc. Non solo guardarla da una prospettiva – cercare di considerare each singolo componente del sistema che è responsabile per l'elaborazione, la lettura o la scrittura di tutti i dati contenuti nella pipeline. Separare una transazione o un'unità di lavoro discreta e analizzare esattamente il path che esegue attraverso il tuo hardware e misurare in each componente distinto per vedere se ci sono strozzature o luoghi where c'è latenza indebita, ecc. Un mio amico ha definito questo "peeling torna indietro la cipolla "e ho usato la frase da allora per fare riferimento al task di eseguire il debug di un stream di dati.

    Una piccola aggiunta. In questo caso potresti voler guardare il tuo tuning a livello di block e gli I / O scheduler. Non ho familiarità con Ubuntu, ma ci sono una buona quantità di manopole per la memorizzazione delle performance per eseguire il tweak. Ciò vale sicuramente nel caso di archiviazione SAN e database.

    • Date un'occhiata al pianificatore di I / O del sistema . Il CFQ è l'impostazione predefinita, ma la manopola e la scadenza sono scelte comuni per i carichi di lavoro del database.
    • Vedi questo link per alcuni altri parametri di sintonizzazione che possono aiutare.
    • Si parla di NFS e blocca l'archiviazione. Se il block, quali file system sono in uso? I / O attesa suona come una situazione di block di scrittura da qui. Sono abilitate le barriere di scrittura? Rimontare i filesystem con nobarrier . ( Suggerimento per Ubuntu )

    Alcuni collegamenti per errore di server …

    Linux – tuning del controller hardware RAID del mondo reale (scsi e cciss)

    Grazie a tutti per le idee e gli input. Il problema era legato a una combinazione di configuration non legata all'assemblaggio di ethernet, combinata con un module di I / O difettoso sul VNX stesso. Il tasso di I / O è ora vicino a where lo aspettiamo. È interessante notare che i test di scrittura e lettura dei file dd e i benchmark di iozone non sono stati in grado di rilevare questo e potrebbero leggere e scrivere quasi quanto veloce come previsto.

    Modificherò presto con più informazioni, ma innanzitutto vorrei dire che non devi lasciare che l'output dm- * di iostat ti confonda. Device-mapper è un dispositivo passthru in-kernel proprio come md * (md0, md1, ecc.) In modo che ti interessa solo i dispositivi sottostanti. Tutti i dati che passano ai tuoi dischi passano dm / md sul modo e i totali effettivi (byte, secondi, ecc.) Sono accurati, ma l'util è fuorviante.

    Inoltre, questa è una grande quantità di memory. Le cose divertenti iniziano a succedere che alto (io stesso esegue 2x64s e 2x96s), soprattutto se si dispone di un process che occupa più della metà della ram. Leggi questo articolo per ulteriori informazioni . L'articolo menziona mysql ma si prega di notare che non è specifico mysql. Ogni process software inciderà penalizzazioni per la memory di accesso di un altro processre fisico – pensa che 48gb appartiene ad un proc, 48 all'altro. Il process può appartenere solo a un proc e per raggiungere l'altra memory dei procs (dopo che il proprio 48GB è esaurito), deve decidere di memorizzare un po 'di 48 in swap o pagare un prezzo enorme per arrivare da & la memory di altri proc. L'articolo suggerisce di eseguire un command numbersco per obbligare il software a non scambiarsi e invece di pagare la penalità. Ho personalmente visto miglioramenti massicci da questo. In altre parole – controlla per vedere se alcuni dei tuoi I / O stanno andando a scambiare! Utilizza free -m (o simile) per questo. Se hai abbondanza di memory libera, ma una quantità non troppo piccola di swappage (ad esempio il 10% più), questo potrebbe essere il tuo problema.

    Guardando questo dal punto di vista dello storage, hai un modo per misurare la latenza di scsi? Il tempo di attesa di OS che include un sacco di cose al di fuori del controllo dell'immagazzinaggio, ma quando entrò nella mia casella di archiviazione e vedo la latenza di IO a 2ms, so che, indipendentemente da ciò che il server sta ottenendo internamente, i comandi di scsi sono stati risposti a rapidamente, e posso eliminare l'archiviazione come variabile.

    Suggerimenti per Linux e Windows Server, quali Ubuntu, Centos, Apache, Nginx, Debian e argomenti di rete.