Wie gut lassen sich gleichzeitige Schreibvorgänge mit io_uring skalieren?

Wie gut lassen sich gleichzeitige Schreibvorgänge mit io_uring skalieren?

Hintergrund:Ich bin sehr fasziniert von den möglichen Leistungssteigerungen von io_uring, aber ich bin nicht vertraut genug mit C, dem Linux-Kernel oder der Funktionsweise von Blockgeräten, um aussagekräftige Benchmarks durchzuführen. Ich suche keine harten Zahlen, sondern nur einen Überblick über die Architektur, der mir bei meinen weiteren Recherchen helfen wird.


Stellen Sie sich vor, ich habe ein Programm, das wiederholt Stapel von zehn 4-Byte-Ganzzahlen an eine Datei anfügt und diese dann synchronisiert. Ich möchte zu einem Modell wechseln, bei dem ich stattdessen jede Ganzzahl im Stapel an ihre eigene Datei anfüge. Das heißt: Ich schreibe eine einzelne 4-Byte-Ganzzahl in jede der 10 Dateien und synchronisiere sie alle.

Bei Verwendung von synchronem IO verwendet das ursprüngliche Schema 2 Systemaufrufe (1 Schreibvorgang + 1 Synchronisierung), und der int-per-file-Ansatz verwendet erstaunliche 20 (10 Schreibvorgänge + 10 Synchronisierungen). In Bezug auf die Systemaufrufe io_uringwären die Einsparungen enorm: Ich kann das Äquivalent von 20 Systemaufrufen mit einer einzigen io_uringÜbermittlung erreichen. Was mir unklar ist, ist, wie dieausruhender Linux- writeMaschinerie wird skaliert, sobald die Übermittlung erfolgt ist.

  • Verfügen die meisten Festplatten über eine gewisse Hardwareunterstützung für paralleles Schreiben? Oder ist das bei SSDs der Fall, bei rotierenden Festplatten jedoch nicht?
  • Werden Schreibvorgänge per Pipeline (über den Bus?) auf die Festplatte geleitet, sodass der Kernel nicht für jeden Schreibvorgang auf eine Roundtrip-Antwort warten muss?
  • Stellt der Kernel am Ende alle über angeforderten Systemaufrufe selbst in die Warteschlange io_uring?
  • Gibt es andere Engpässe, die ich nicht berücksichtigt habe?

Es könnte gut sein, dass mein mentales Modell falsch ist. Jeder Hinweis ist sehr willkommen!

Antwort1

Verfügen die meisten Festplatten über eine gewisse Hardwareunterstützung für paralleles Schreiben? Oder ist das bei SSDs der Fall, bei rotierenden Festplatten jedoch nicht?

Dies gilt für nahezu alle Festplatten, unabhängig davon, ob es sich um rotierende oder Solid-State-Festplatten handelt (selbst rotierende Festplatten verfügen über Caches, sodass sie bei kleinen Datenmengen nicht zu langsam erscheinen). Billige USB-Sticks oder SD-Karten erreichen zwar eine schlechte Parallelität, aber auch hier ist ein gewisses Maß an Parallelität vorhanden ... Was die maximale Anzahl paralleler Befehle für ein einzelnes Gerät angeht, kann SATA bis zu 32 haben, SCSI tendiert zu 10 bis 100, NVMe kann bis in die 1000er-Bereiche gehen (ich glaube, die Spezifikation begrenzt Sie auf maximal 65536, aber ich kenne noch kein Gerät, das so hoch geht).

Werden Schreibvorgänge per Pipeline (über den Bus?) auf die Festplatte geleitet, sodass der Kernel nicht für jeden Schreibvorgang auf eine Roundtrip-Antwort warten muss?

Ja, mehrere Schreib- (oder Lese-)Vorgänge können parallel gesendet werden. Ob dies jedoch geschieht, hängt von vielen Faktoren ab (z. B. kann der Kernel sie aus Effizienzgründen zusammenfassen, eine Synchronisierung kann erforderlich sein, sodass die Warteschlange geleert werden muss usw.).

Stellt der Kernel am Ende alle über io_uring angeforderten Systemaufrufe selbst in die Warteschlange?

Vielleicht. io_uringwird die I/O inline abschließen, wenn es nicht blockiert, andernfalls wird es in die Warteschlange gestellt. VonEffiziente IO mit io_uring: „Noch wichtiger ist, dass bei Vorgängen, die nicht blockieren, die Daten inline bereitgestellt werden.“

Gibt es andere Engpässe, die ich nicht berücksichtigt habe?

Ja. Es ist auch unklar, ob Sie genug I/O pro Sekunde durchführen, um wirklich den Nutzen von etwas wie io_uring... zu sehen. Außerdem begrenzen häufige Synchronisierungen wahrscheinlich die Parallelität, je nach Häufigkeit und Art der Durchführung. Wenn Sie gepufferte I/O durchführen, holt der Kernel die Parallelität sogar im synchronen Modus heraus, weil Sie in den RAM schreiben, und der Kernel lädt den RAM dann, wenn möglich, parallel aus. (Beachten Sie, dass die vorherigen Punkte keine vollständige Liste darstellen.)

(Frage aus dem Titel)

Wie gut lassen sich gleichzeitige Schreibvorgänge mit io_uring skalieren?

OK bis sehr gut, je nachdem, welchen Kernel Sie verwenden und wie Sie die I/O übermitteln. Siehe die Referenzen und Links in diesemAntwort auf „Gibt es unter Linux wirklich keinen asynchronen Block-E/A?“.

Verweise

verwandte Informationen