Das parallele Lesen von Software-RAID ist langsamer als es angesichts anderer Benchmarks „sein sollte“.

Das parallele Lesen von Software-RAID ist langsamer als es angesichts anderer Benchmarks „sein sollte“.

Notiz: Ich habe hier einige ähnliche Fragen gesehen, aber:

  1. Keiner davon betrifft das parallele Lesen vieler Dateien, und
  2. Die meisten sind über 10 Jahre alt und betreffen nicht mehr relevante Hardware- und Kernelversionen.

Hintergrund:

Ich habe eine Linux-Maschine (Ubuntu, Kernel 5.15.0-82-generic) mit zwei 128-Core-CPUs und 128 GB RAM. Sie verfügt über ein RAID 5-Array aus 10 SSDs, die über SATA verbunden sind und jeweils eine Lesegeschwindigkeit von bis zu 530 MB/s erreichen. Diese sind bei Verwendung praktisch schreibgeschützt (sie werden hauptsächlich tagsüber verwendet und jede Nacht kommen neue Daten hinzu). Mein allgemeines Problem besteht darin, Dutzende von Kernen parallel mit Daten von den Festplatten zu versorgen.

Vorgehensweise beim Benchmarking

Ich führe Benchmarking-Tests durch, indem ich Instanzen von

dd if=/path/to/large/file of=/dev/null bs=1024 count=1048576

parallel zu iostatund iotop. Zwischen den Läufen lösche ich den Cache, indem ich

sudo sh -c "sync; echo 3 > /proc/sys/vm/drop_caches"

Ich bin zuversichtlich, dass dies richtig funktioniert, denn wenn ich es nicht mache, wird ein nachfolgender Lesevorgang einer Hot-Datei nahezu sofort abgeschlossen, und wenn ich es dann mache, wird beim Lesen dieser Datei wieder die gleiche Leistung wie zuvor erreicht.

Benchmark-Ergebnisse

Wenn ich eine einzelne Datei über Software-RAID lese, erreiche ich eine Leserate von irgendwo zwischen 500 und 700 MB/s. Wenn ich mir die Ausgabe ansehe, iostatsehe ich, dass dies dadurch erreicht wird, dass von jedem der zehn Laufwerke im Prinzip mit genau der gleichen Geschwindigkeit parallel gelesen wird.

Wenn ich direkt von den Laufwerken lese (d. h. wenn ich /dev/sda, /dev/sdb, usw. als if=Argumente für angebe dd), kann ich von jedem von ihnen parallel mit jeweils 530 MB/s lesen (d. h. das Lesen von 1 GB von allen zehn dauert genauso lange wie das Lesen von 1 GB von einem einzelnen von ihnen).

Wenn ich jedoch versuche, mehrere Dateien parallel über Software-RAID zu lesen, kommt es zu erheblichen Leistungseinbußen. Wenn ich zehn Dateien parallel über Software-RAID lese, erreichen die einzelnen Dateien Lesegeschwindigkeiten zwischen 150 und 350 MB/s und der gesamte Vorgang dauert etwa viermal so lange wie das direkte Kopieren derselben Datenmenge von den Laufwerken.

Darüber hinaus stößt das Lesen per Software-Lesevorgang laut iotop bei einer Gesamtlesegeschwindigkeit von rund 2,7 GB/s an eine absolute Grenze.

Ich denke, um alle Kerne mit genügend Festplattendaten zu versorgen, damit sie nicht verschwendet werden, muss ich wahrscheinlich von SATA auf NVMe umsteigen, aber ich möchte zuerst dieses Problem lösen, da es so aussieht, als ob entweder das Software-RAID oder etwas davor die Geschwindigkeit begrenzt, mit der ich von diesen Festplatten lesen kann.

Fragen:

  1. Wie kann ich diagnostizieren, wo der Engpass liegt?
  2. Wie kann ich mir die Konfigurationsmöglichkeiten hier überhaupt ansehen und welche weiteren Möglichkeiten habe ich?
  3. Gibt es grundsätzliche Einschränkungen meines Setups, die das, was ich versuche, unmöglich machen? Wenn ja, gibt es alternative Konfigurationen, die ich verwenden könnte?

Sachen die ich schon probiert habe

  • Das Spielen mit der Blockgröße von dd, also das Vergrößern oder Verkleinern, hat keine Auswirkungen.
  • Das Einstellen von RAID-Read-Ahead und/oder Stripe-Cache-Größe hat keine Auswirkung
  • Durch das Upgrade des Kernels auf eine etwas neuere Version wollte Apt die Benchmark-Ergebnisse drastisch verschlechtern und den Gesamtdurchsatz, wenn ich mich recht entsinne, praktisch auf 500 MB/s begrenzen.

Nachtrag:

Beispielausgabe iostat -k 1während eines Benchmarklaufs:https://pastebin.com/yuWwWbRU

Inhalt von /proc/mdstat:

Personalities : [raid6] [raid5] [raid4] [linear] [multipath] [raid0] [raid1] [raid10] 
md127 : active raid5 sdj1[10] sdh1[7] sdi1[8] sdf1[5] sdd1[3] sdc1[2] sdg1[6] sde1[4] sdb1[1] sda1[0]
      70325038080 blocks super 1.2 level 5, 4k chunk, algorithm 2 [10/10] [UUUUUUUUUU]
      bitmap: 0/59 pages [0KB], 65536KB chunk

unused devices: <none>

verwandte Informationen