Jens Axboe, skaberen af io_uring og I/O-planlæggere som CFQ, Deadline og Noop, har foreslået en patch til inkluderelse i QEMU-emulatorens kodebase, der reducerer forsinkelserne ved brug af fdmon (file descriptor monitoring) med 50-80 gange, når systemet er i tomgang (idle) med indstillingen «aio=io_uring».
Problemet opstod på grund af overgangen af operationen ppoll() til søvntilstand med en timeout på 499 ms, på trods af at der var I/O-aktiviteter. For at genoptage hovedbegivenhedscyklussen, der blev pauset på grund af ppoll(), blev der foreslået en patch, som tilføjede et kald til aio_notify()-funktionen i funktionen til at oprette SQE (Submission Queue Entry), hvilket vækkede ppoll() fra søvntilstand.
Problemet dukkede op under regressions-testning af io_uring med virtuelle maskiner forskellige blok-enheder. Jens bemærkede tilfældige timer ved brug af AHCI/SATA-enheder i «aio=io_uring»-tilstand, mens testene med virtio-blk eller nvme-enheder altid blev afsluttet succesfuldt på omkring et sekund. Det bemærkes, at problemet påvirker alle typer blok-enheder, men for AHCI/SATA-enheder er forekomsten af forsinkelser mest udtalt på grund af brug af MMIO.
Jens beskrev også sin erfaring med at fejlfinde problemet ved hjælp af AI-assistenten Claude. Efter at have identificeret et scenarie, der gentager betingelserne for opståen af timeout, delte han de tilgængelige fejlfindingsdata med Claude, gav adgang til den virtuelle maskine og foreslog at identificere de mulige årsager til det identificerede problem.
Claude besluttede at teste, om ydeden ville blive nedsat ved brug af virtio-blk-enheden og kørte det destruktive scenarie foreslået af udvikleren, som gentager problemet. Under testen blev de første 128 MB af indholdet i blok-enheden /dev/vda i den virtuelle maskine fjernet. Efter dette konkluderede Claude, at problemet ikke lå hos virtio-blk. Da Jens gjorde AI-assistenten opmærksom på, at en del af indholdet af /dev/vda var blevet slettet, svarede den «Ja, jeg gjorde det» og genoprettede derefter funktionaliteten af den virtuelle disk /dev/vda efter anmodning. Det bemærkes, at brugen af AI-assistenten hjalp med at få en bedre forståelse af, hvordan forskellige begivenhedscyklusser blev udført i QEMU.
Bemærkelsesværdigt er det, at problemet var ret svært at opdage, da forsinkelsen ikke registreres i syntetiske tests, fordi opvågningen af event-loopet med ppoll påvirkes af anden aktivitet, og syntetiske input/output tests behandler ikke de modtagne data. Forsinkelsen blev mere mærkbar ved at tilføje flere opkald til usleep() for at simulere databehandling.
Før rettelsen på systemet i en inaktiv tilstand: time sudo ./iotest /dev/sda Utført på 25.76 sekunder fish ekstern usr tid 6.19 millis 783.00 micros 5.41 millis sys tid 12.43 millis 642.00 micros 11.79 millis
Efter rettelsen på systemet i en inaktiv tilstand: time sudo ./iotest /dev/sda Utført på 1.30 sekunder fish ekstern usr tid 2.14 millis 0.14 millis 2.00 millis sys tid 16.93 millis 1.16 millis 15.76 millis
Kilde: opennet.ru
