Verbesserung der Leistung von SAS Multipath zu JBOD unter Linux

10

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!


quelle
Ist der Cache der LSI SAS-Controller auf Durchschreiben eingestellt? (Das Zurückschreiben ist bei großen sequentiellen Workloads langsamer). Vielleicht möchten Sie auch mit einem kleineren bs für dd testen, wie bs = 1M.
Brian

Antworten:

1

Schöne, gut vorbereitete Frage :)

Ich bin selbst ein Speed'n'Feed-Mann und ich denke, Sie sind auf dem Geld, um ehrlich zu sein. Ich hatte halb damit gerechnet, dass Ihr Durchsatz niedriger ausfällt als er ist, aber ich denke, Sie haben dort einen Anstieg geringfügiger und erwarteter Ineffizienzen. Zum Beispiel ist es für einen PCIe-Bus sehr schwierig, ständig 100% zu erreichen, besser, eine niedrige Gesamtrate von 90% anzunehmen. Angesichts des Jitters bedeutet dies auch, dass die PHYs nicht die ganze Zeit zu 100% "gespeist" werden, so dass Sie dort ein wenig verlieren, ebenso wie für den Cache, die Festplatten, die Interrupts ohne Kohle, die E / A-Planung usw. Grundsätzlich es sind geringfügige Ineffizienzzeiten geringfügige Ineffizienzzeiten ... und so weiter, es sind mehr als die 5-10% erwarteten Ineffizienzen für sich. Ich habe so etwas gesehen, als HP DL-Server mit W2K3 mit ihren MSA SAS-Boxen sprachen und dann NLB waren. ' über mehrere Netzwerkkarten verteilt - frustrierend, aber verständlich, denke ich. Das ist sowieso mein 2c, sorry es ist nicht zu positiv.

Chopper3
quelle