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!