Jens Axboe, der Schöpfer von io_uring sowie der I/O-Planer CFQ, Deadline und Noop, hat einen Patch vorgeschlagen, der in die Codebasis des QEMU-Emulators integriert werden soll. Dieser Patch reduziert die Latenzen bei der Arbeit mit fdmon (File Descriptor Monitoring) im Modus âaio=io_uringâ und im Leerlauf (Idle) um das 50-80-Fache.
Das Problem trat auf, weil die ppoll()-Operation in den Schlafzustand mit einem Timeout von 499 ms versetzt wurde, trotz vorhandener Ein-/Ausgabe. Um den Hauptverarbeitungsschleifen, die aufgrund von ppoll() angehalten wurden, wiederaufzunehmen, wurde ein Patch vorgeschlagen, der in die SQE (Submission Queue Entry)-Erstellungsfunktion den Aufruf der Funktion aio_notify() integriert, wodurch ppoll() aus dem Schlafmodus geholt wird.
Das Problem trat beim Regressionstest von io_uring auf virtuellen Maschinen wurde vereinfacht. mit verschiedenen BlockgerĂ€ten. Jens bemerkte das sporadische Auftreten von Timeouts bei der Verwendung von AHCI/SATA-GerĂ€ten im Modus âaio=io_uringâ, wĂ€hrend die Tests in Konfigurationen mit virtio-blk- oder nvme-GerĂ€ten immer erfolgreich innerhalb von etwa einer Sekunde abgeschlossen wurden. Dabei wird festgestellt, dass das Problem alle Arten von BlockgerĂ€ten betrifft, aber bei AHCI/SATA-GerĂ€ten die Verzögerungen am stĂ€rksten ausgeprĂ€gt sind, bedingt durch die Verwendung von MMIO.
Jens hat auch seine Erfahrung bei der Fehlersuche mit dem AI-Assistenten Claude beschrieben. Nachdem er das Szenario definiert hatte, das die Bedingungen fĂŒr den Timeout reproduzierte, ĂŒbermittelte er die vorhandenen Debug-Daten an Claude, gewĂ€hrte Zugang zur virtuellen Maschine und schlug vor, die möglichen Ursachen des identifizierten Fehlers zu ermitteln.
Claude entschloss sich zu ĂŒberprĂŒfen, ob sich die Leistung bei Verwendung des GerĂ€ts virtio-blk verlangsamt, und startete das vom Entwickler vorgeschlagene destruktive Szenario, das das Problem reproduzierte. WĂ€hrend des Tests wurden die ersten 128 MB des Inhalts des BlockgerĂ€ts /dev/vda in der virtuellen Maschine gelöscht. Danach stellte Claude fest, dass das Problem nicht bei virtio-blk lag. Als Jens den AI-Assistenten auf das Löschen eines Teils des Inhalts von /dev/vda hinwies, antwortete er: âJa, ich habe das gemachtâ, und nach der Bitte um Wiederherstellung â stellte er die FunktionalitĂ€t des virtuellen Laufwerks /dev/vda wieder her. Es wird erwĂ€hnt, dass die Nutzung des AI-Assistenten half, die AblĂ€ufe verschiedener Ereignisschleifen in QEMU besser zu verstehen.
Es ist bemerkenswert, dass das Problem schwer zu erkennen war, da die Verlangsamung in synthetischen Tests nicht erfasst wird. Dies geschieht, weil das Auftreten des Fehlers durch das Erwachen des Event-Processing-Cycles mit ppoll aufgrund anderer AktivitĂ€ten beeinflusst wird und synthetische Eingabe-/Ausgabetests die empfangenen Daten nicht verarbeiten. Die Verlangsamung wurde deutlicher, als mehrere Aufrufe von usleep() hinzugefĂŒgt wurden, um die Datenverarbeitung zu simulieren.
Vor der Behebung im Leerlaufzustand des Systems: time sudo ./iotest /dev/sda AusgefĂŒhrt in 25,76 Sekunden fish extern usr Zeit 6,19 Millisekunden 783,00 Mikrosekunden 5,41 Millisekunden sys Zeit 12,43 Millisekunden 642,00 Mikrosekunden 11,79 Millisekunden
Nach der Behebung im Leerlaufzustand des Systems: time sudo ./iotest /dev/sda AusgefĂŒhrt in 1,30 Sekunden fish extern usr Zeit 2,14 Millisekunden 0,14 Millisekunden 2,00 Millisekunden sys Zeit 16,93 Millisekunden 1,16 Millisekunden 15,76 Millisekunden
Quelle: opennet.ru
