Der Entwickler io_uring hat in QEMU ein Problem festgestellt, das fdmon im Leerlauf um das 50-80-fache verlangsamt hat.

Jens Axboe, der Schöpfer von io_uring und der I/O-Planer CFQ, Deadline und Noop, hat einen Patch vorgeschlagen, der in die Codebasis des QEMU-Emulators aufgenommen werden soll. Dieser Patch reduziert die Latenzzeiten bei der Verwendung von fdmon (file descriptor monitoring) im Modus „aio=io_uring“ und wenn das System sich im Leerlauf (idle) befindet, um das 50- bis 80-Fache.

Das Problem trat auf, weil der ppoll()-Aufruf in den Schlafmodus mit einem Timeout von 499 ms versetzt wurde, trotz bestehender Ein-/Ausgaben. Um die AusfĂŒhrung des Haupt-Ereigniszyklus, der durch ppoll() unterbrochen wurde, wieder aufzunehmen, wurde ein Patch vorgeschlagen, der in der Funktion zur Erstellung des SQE (Submission Queue Entry) den Aufruf der Funktion aio_notify() hinzufĂŒgt, um ppoll() aus dem Schlafmodus zu holen.

Das Problem trat bei der Regressionstestung von io_uring auf virtuellen Maschinen 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 bei Konfigurationen mit virtio-blk- oder nvme-GerĂ€ten die Tests immer erfolgreich nach etwa einer Sekunde abgeschlossen wurden. Es wurde festgestellt, dass das Problem alle Arten von BlockgerĂ€ten betrifft, aber bei AHCI/SATA-GerĂ€ten aufgrund der Verwendung von MMIO am ausgeprĂ€gtesten ist.

Jens berichtete auch von seiner Erfahrung bei der Fehlersuche mit dem AI-Assistenten Claude. Nachdem er das Szenario identifiziert hatte, das die Bedingungen fĂŒr das Auftreten des Timeouts reproduzierte, ĂŒbermittelte er die vorhandenen Debugging-Daten an Claude, gab Zugang zur virtuellen Maschine und forderte ihn auf, die wahrscheinlichen Ursachen des festgestellten Fehlers zu ermitteln.

Claude entschloss sich zu ĂŒberprĂŒfen, ob die Leistung bei der Verwendung des virtio-blk-GerĂ€ts langsamer wird, und startete mit ihm 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 kam Claude zu dem Schluss, dass das Problem nicht bei virtio-blk liegt. Als Jens den AI-Assistenten auf das Löschen eines Teils des Inhalts von /dev/vda hinwies, antwortete er: „Ja, das habe ich gemacht“, und nach einer Bitte um RĂŒckgĂ€ngigmachung stellte er die FunktionalitĂ€t der virtuellen Festplatte /dev/vda wieder her. Es wird festgestellt, dass die Nutzung des AI-Assistenten geholfen hat, ein besseres VerstĂ€ndnis der AblĂ€ufe verschiedener Ereignisverarbeitungszyklen in QEMU zu erlangen.

Bemerkenswert ist, dass das Problem recht schwer zu erkennen war, da in synthetischen Tests keine Verlangsamung festgestellt wird, da das Auftreten eines Fehlers von der Aktivierung des Ereignisverarbeitungszyklus mit ppoll aufgrund anderer AktivitĂ€ten abhĂ€ngt, wĂ€hrend synthetische Ein-/Ausgabetests keine Verarbeitung der empfangenen Daten durchfĂŒhren. Die Verlangsamung wurde auffĂ€lliger, als mehrere Aufrufe von usleep() zur Simulation der Datenverarbeitung hinzugefĂŒgt wurden.

Vor der Behebung im Leerlaufzustand des Systems: time sudo ./iotest /dev/sda AusgefĂŒhrt in 25,76 Sek. fish extern usr time 6,19 millis 783,00 micros 5,41 millis sys time 12,43 millis 642,00 micros 11,79 millis

Nach der Behebung im Leerlaufzustand des Systems: time sudo ./iotest /dev/sda AusgefĂŒhrt in 1,30 Sek. fish extern usr time 2,14 millis 0,14 millis 2,00 millis sys time 16,93 millis 1,16 millis 15,76 millis

Quelle: opennet.ru

60GB SSD 8Gb DDR4