Miglioramento delle prestazioni multipath SAS su JBOD su Linux


10

Sto cercando di ottimizzare una configurazione di archiviazione su alcuni hardware Sun con Linux. Ogni pensiero sarebbe molto apprezzato.

Abbiamo il seguente hardware:

  • Sun Blade X6270
  • 2 * controller SAS LSISAS1068E
  • 2 * JBOD Sun J4400 con dischi da 1 TB (24 dischi per JBOD)
  • Fedora Core 12
  • 2.6.33 rilascio kernel da FC13 (provato anche con l'ultimo kernel 2.6.31 da FC12, stessi risultati)

Ecco la scheda tecnica per l'hardware SAS:

http://www.sun.com/storage/storage_networking/hba/sas/PCIe.pdf

Utilizza PCI Express 1.0a, 8 corsie. Con una larghezza di banda di 250 MB / sec per corsia, dovremmo essere in grado di eseguire 2000 MB / sec per controller SAS.

Ogni controller può fare 3 Gb / sec per porta e ha due PHY a 4 porte. Colleghiamo entrambi i PHY da un controller a un JBOD. Quindi tra JBOD e controller abbiamo 2 PHYs * 4 porte SAS * 3 Gb / sec = 24 Gb / sec di larghezza di banda, che è più della larghezza di banda PCI Express.

Con la cache di scrittura abilitata e quando si eseguono grandi scritture, ogni disco può sostenere circa 80 MB / sec (vicino all'inizio del disco). Con 24 dischi, ciò significa che dovremmo essere in grado di eseguire 1920 MB / sec per JBOD.

multipath {
  rr_min_io 100
  uid 0
  path_grouping_policy multibus
  manuale di failback
  path_selector "round-robin 0"
  priorità rr_weight
  alias somealias
  coda no_path_retry
  modalità 0644
  gid 0
  wwid somewwid
}

Ho provato valori di 50, 100, 1000 per rr_min_io, ma non sembra fare molta differenza.

Insieme al variare di rr_min_io, ho provato ad aggiungere un certo ritardo tra l'avvio dei dd per impedire a tutti di scrivere contemporaneamente sullo stesso PHY, ma questo non ha fatto alcuna differenza, quindi penso che gli I / O si stiano diffondendo correttamente.

Secondo / proc / interrupt, i controller SAS stanno usando uno schema di interrupt "IR-IO-APIC-fasteoi". Per qualche motivo, solo il core # 0 nella macchina gestisce questi interrupt. Posso migliorare leggermente le prestazioni assegnando un core separato per gestire gli interrupt per ciascun controller SAS:

echo 2> / proc / irq / 24 / smp_affinity
echo 4> / proc / irq / 26 / smp_affinity

L'uso di dd per scrivere sul disco genera "Interrupt di chiamata funzione" (non ho idea di cosa siano), che sono gestiti dal core n. 4, quindi tengo fuori anche altri processi da questo core.

Corro 48 dd (uno per ogni disco), assegnandoli ai core che non gestiscono gli interrupt in questo modo:

tasket -c somecore dd if = / dev / zero of = / dev / mapper / mpathx oflag = direct bs = 128M

oflag = direct impedisce a qualsiasi tipo di cache buffer di essere coinvolto.

Nessuno dei miei core sembra al massimo. I core che gestiscono gli interrupt sono per lo più inattivi e tutti gli altri core sono in attesa di I / O come ci si aspetterebbe.

Cpu0: 0,0% us, 1,0% sy, 0,0% ni, 91,2% id, 7,5% wa, 0,0% hi, 0,2% si, 0,0% st
Cpu1: 0,0% us, 0,8% sy, 0,0% ni, 93,0% id, 0,2% wa, 0,0% hi, 6,0% si, 0,0% st
Cpu2: 0,0% us, 0,6% sy, 0,0% ni, 94,4% id, 0,1% wa, 0,0% hi, 4,8% si, 0,0% st
Cpu3: 0,0% us, 7,5% sy, 0,0% ni, 36,3% id, 56,1% wa, 0,0% hi, 0,0% si, 0,0% st
Cpu4: 0,0% us, 1,3% sy, 0,0% ni, 85,7% id, 4,9% wa, 0,0% hi, 8,1% si, 0,0% st
Cpu5: 0,1% us, 5,5% sy, 0,0% ni, 36,2% id, 58,3% wa, 0,0% hi, 0,0% si, 0,0% st
Cpu6: 0,0% us, 5,0% sy, 0,0% ni, 36,3% id, 58,7% wa, 0,0% hi, 0,0% si, 0,0% st
Cpu7: 0,0% us, 5,1% sy, 0,0% ni, 36,3% id, 58,5% wa, 0,0% hi, 0,0% si, 0,0% st
Cpu8: 0,1% us, 8,3% sy, 0,0% ni, 27,2% id, 64,4% wa, 0,0% hi, 0,0% si, 0,0% st
Cpu9: 0,1% us, 7,9% sy, 0,0% ni, 36,2% id, 55,8% wa, 0,0% hi, 0,0% si, 0,0% st
Cpu10: 0,0% us, 7,8% sy, 0,0% ni, 36,2% id, 56,0% wa, 0,0% hi, 0,0% si, 0,0% st
Cpu11: 0,0% us, 7,3% sy, 0,0% ni, 36,3% id, 56,4% wa, 0,0% hi, 0,0% si, 0,0% st
Cpu12: 0,0% us, 5,6% sy, 0,0% ni, 33,1% id, 61,2% wa, 0,0% hi, 0,0% si, 0,0% st
Cpu13: 0,1% us, 5,3% sy, 0,0% ni, 36,1% id, 58,5% wa, 0,0% hi, 0,0% si, 0,0% st
Cpu14: 0,0% us, 4,9% sy, 0,0% ni, 36,4% id, 58,7% wa, 0,0% hi, 0,0% si, 0,0% st
Cpu15: 0,1% us, 5,4% sy, 0,0% ni, 36,5% id, 58,1% wa, 0,0% hi, 0,0% si, 0,0% st

Alla luce di tutto ciò, il throughput riportato eseguendo "dstat 10" è compreso nell'intervallo 2200-2300 MB / sec.

Considerata la matematica sopra, mi aspetterei qualcosa nell'intervallo 2 * 1920 ~ = 3600+ MB / sec.

Qualcuno ha idea di dove sia finita la mia larghezza di banda mancante?

Grazie!


La cache dei controller SAS LSI è impostata su Write-Through? (il write-back sarà più lento per carichi di lavoro sequenziali di grandi dimensioni). Potrebbe anche voler provare con un bs più piccolo per dd, come bs = 1M.
Brian

Risposte:


1

Bella domanda ben preparata :)

Anch'io sono un uomo veloce e penso che tu abbia i soldi per essere onesto. Mi aspettavo quasi di vedere il tuo rendimento inferiore a quello che è, ma quello che penso tu abbia lì è un accumulo in inefficienze minori e attese. Ad esempio, è molto difficile per un bus PCIe arrivare sempre al 100%, meglio assumere una velocità complessiva del 90% bassa. Dato il jitter questo causerà anche che i PHY non verranno "alimentati" al 100% per tutto il tempo, quindi perderai un po 'lì, lo stesso per la cache, i dischi, gli interrupt non coalizzati, la programmazione IO ecc. Fondamentalmente è inefficacia minore in tempi di inefficienza minore ... e così via, finisce per essere più del 5-10% di inefficienza prevista da sola. Ho visto questo genere di cose con i server HP DL che parlavano con i loro box MSA SAS usando W2K3 e poi facevo il NLB ' su più schede di rete - frustrante ma comprensibile immagino. Questo è il mio 2c comunque, mi dispiace non sia troppo positivo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.