Ich versuche, ein Speicher-Setup auf Sun-Hardware unter Linux zu optimieren. Alle Gedanken wäre sehr dankbar.
Wir haben folgende Hardware:
- Sonnenklinge X6270
- 2 * LSISAS1068E SAS-Controller
- 2 * Sun J4400 JBODs mit 1 TB Festplatten (24 Festplatten pro JBOD)
- Fedora Core 12
- 2.6.33 Kernel von FC13 freigeben (auch mit dem neuesten 2.6.31 Kernel von FC12 ausprobiert, gleiche Ergebnisse)
Hier ist das Datenblatt für die SAS-Hardware:
http://www.sun.com/storage/storage_networking/hba/sas/PCIe.pdf
Es verwendet PCI Express 1.0a, 8x Lanes. Mit einer Bandbreite von 250 MB / s pro Lane sollten wir 2000 MB / s pro SAS-Controller ausführen können.
Jeder Controller kann 3 Gbit / s pro Port ausführen und verfügt über zwei 4-Port-PHYs. Wir verbinden beide PHYs von einem Controller mit einem JBOD. Zwischen dem JBOD und dem Controller befinden sich also 2 PHYs * 4 SAS-Ports * 3 Gbit / s = 24 Gbit / s Bandbreite, was mehr als die PCI Express-Bandbreite ist.
Wenn das Schreib-Caching aktiviert ist und große Schreibvorgänge ausgeführt werden, kann jede Festplatte etwa 80 MB / s (nahe dem Start der Festplatte) aushalten. Mit 24 Festplatten bedeutet dies, dass wir 1920 MB / s pro JBOD ausführen können sollten.
Multipath { rr_min_io 100 uid 0 path_grouping_policy Multibus Failback-Handbuch path_selector "Round-Robin 0" rr_weight Prioritäten alias somealias no_path_retry Warteschlange Modus 0644 gid 0 wwid irgendwo }}
Ich habe Werte von 50, 100, 1000 für rr_min_io ausprobiert, aber es scheint keinen großen Unterschied zu machen.
Zusammen mit dem Variieren von rr_min_io habe ich versucht, eine Verzögerung zwischen dem Starten der DDs hinzuzufügen, um zu verhindern, dass alle gleichzeitig über dieselbe PHY schreiben, aber das hat keinen Unterschied gemacht, daher denke ich, dass die E / A richtig verteilt werden.
Laut / proc / interrupts verwenden die SAS-Controller ein Interrupt-Schema "IR-IO-APIC-fasteoi". Aus irgendeinem Grund verarbeitet nur der Kern Nr. 0 in der Maschine diese Interrupts. Ich kann die Leistung leicht verbessern, indem ich einen separaten Kern für die Interrupts für jeden SAS-Controller zuweise:
echo 2> / proc / irq / 24 / smp_affinity echo 4> / proc / irq / 26 / smp_affinity
Die Verwendung von dd zum Schreiben auf die Festplatte generiert "Funktionsaufruf-Interrupts" (keine Ahnung, um welche es sich handelt), die von Kern Nr. 4 verarbeitet werden. Daher halte ich auch andere Prozesse von diesem Kern fern.
Ich führe 48 DDs aus (eine für jede Festplatte) und ordne sie Kernen zu, die sich nicht mit Interrupts wie folgt befassen:
Task-Set -c Somecore dd if = / dev / zero von = / dev / mapper / mpathx oflag = direct bs = 128M
oflag = direct verhindert, dass irgendeine Art von Puffercache beteiligt wird.
Keiner meiner Kerne scheint voll zu sein. Die Kerne, die sich mit Interrupts befassen, sind größtenteils inaktiv und alle anderen Kerne warten erwartungsgemäß auf E / A.
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
Angesichts all dessen liegt der durch Ausführen von "dstat 10" gemeldete Durchsatz im Bereich von 2200 bis 2300 MB / s.
In Anbetracht der obigen Mathematik würde ich etwas im Bereich von 2 * 1920 ~ = 3600+ MB / s erwarten.
Hat jemand eine Idee, wo meine fehlende Bandbreite hingegangen ist?
Vielen Dank!