Jens Axboe, de maker van io_uring en de I/O-schedulers CFQ, Deadline en Noop, heeft een patch voorgesteld voor opname in de codebasis van de QEMU-emulator die de latentie bij het gebruik van fdmon (file descriptor monitoring) in de modus «aio=io_uring» en de idle-status van het systeem met 50-80 keer vermindert.
Het probleem deed zich voor vanwege de vertaling van de ppoll()-operatie naar de slaperige staat met een timeout van 499 ms, ondanks de aanwezigheid van I/O. Om de uitvoering van de hoofd-evenementverwerkingslus, die werd onderbroken door ppoll(), te hervatten, is er een patch voorgesteld die in de functie voor het maken van een SQE (Submission Queue Entry) een aanroep van de aio_notify()-functie toevoegt, waardoor ppoll() uit de slaperige toestand wordt gehaald.
Het probleem deed zich voor tijdens regressietests van io_uring in virtuele machines met verschillende blokapparaten. Jens merkte op dat er willekeurig time-outs optraden bij het gebruik van AHCI/SATA-apparaten in de modus «aio=io_uring», terwijl tests met virtio-blk of nvme-apparaten altijd succesvol binnen ongeveer een seconde werden voltooid. Het wordt opgemerkt dat het probleem alle soorten blokapparaten betreft, maar dat time-outs bij AHCI/SATA-apparaten het meest uitgesproken zijn als gevolg van het gebruik van MMIO.
Jens beschreef ook zijn ervaring bij het debuggen van het probleem met behulp van de AI-assistent Claude. Na het vaststellen van het scenario dat de voorwaarden voor het optreden van de time-out reproduceerde, gaf hij de beschikbare debuggegevens door aan Claude, verleende toegang tot de virtuele machine en vroeg om de waarschijnlijke oorzaken van de vastgestelde fout te identificeren.
Claude besloot te controleren of de prestaties zouden vertragen bij het gebruik van een virtio-blk-apparaat en voerde het door de ontwikkelaar voorgestelde destructieve scenario uit dat het probleem reproduceerde. Tijdens de test werden de eerste 128 MB inhoud van het blokapparaat /dev/vda in de virtuele machine verwijderd. Daarna concludeerde Claude dat het probleem niet in virtio-blk zat. Toen Jens de AI-assistent op het verwijderen van een deel van de inhoud van /dev/vda wees, antwoordde hij: «Ja, dat heb ik gedaan», en herstelde daarna de functionaliteit van de virtuele schijf /dev/vda op verzoek. Het gebruik van de AI-assistent hielp begrijpen hoe verschillende loops voor evenementverwerking in QEMU functioneren.
Opmerkelijk is dat het moeilijk was om het probleem te detecteren, aangezien de vertraging in synthetische tests niet wordt geregistreerd omdat de opkomst van een fout wordt beïnvloed door het wakker worden van de evenementenverwerkingslus met ppoll door andere activiteiten, en synthetische input/output-tests verwerken de ontvangen gegevens niet. De vertraging werd duidelijker opgemerkt bij het toevoegen van meerdere aanroepen van usleep() om de verwerking van gegevens te simuleren.
Na de correctie op een systeem in idle-status: time sudo ./iotest /dev/sda Uitgevoerd in 25.76 secs fish extern usr time 6.19 millis 783.00 micros 5.41 millis sys time 12.43 millis 642.00 micros 11.79 millis
Na de correctie op een systeem in idle-status: time sudo ./iotest /dev/sda Uitgevoerd in 1.30 secs fish extern usr time 2.14 millis 0.14 millis 2.00 millis sys time 16.93 millis 1.16 millis 15.76 millis
Bron: opennet.ru
