Jens Axboe, az io_uring és a CFQ, Deadline és Noop I/O ütemezők létrehozója javasolt egy foltot a QEMU emulátor kódjának beillesztésére, amely 50-80%-kal csökkenti a késleltetést a fdmon (fájl leíró figyelése) esetében, amikor az «aio=io_uring» módot használják és a rendszer üresjáratban van.
A probléma abból adódott, hogy a ppoll() műveletet 499 ms-os időtúllal alvó állapotba helyezték, annak ellenére, hogy volt I/O. A fő eseményfeldolgozási ciklus folytatásához, amelyet a ppoll() miatt felfüggesztettek, javasoltak egy foltot, amely a SQE (Submission Queue Entry) létrehozó funkcióhoz hozzáadja az aio_notify() hívást, hogy kihozza a ppoll()-t az alvó állapotból.
A probléma io_uring regressziós tesztelése során merült fel virtuális gépekben különböző blokkeszközökkel. Jens észrevette, hogy véletlenszerű időtúllépések lépnek fel AHCI/SATA eszközök használatakor az «aio=io_uring» módban, míg a virtio-blk vagy NVMe eszközökkel végzett konfigurációk mindig sikeresen zárultak le körülbelül egy másodperc alatt. Megjegyzi, hogy a probléma minden típusú blokkeszközt érint, de az AHCI/SATA eszközök esetében a késedelmek a MMIO használata miatt a legkifejezettebbek.
Jens azt is leírta, hogy hogyan debuggolta a problémát a Claude AI-asszisztens segítségével. Miután meghatározta a forgatókönyvet, amely reprodukálja az időtúllépés feltételeit, átadta a meglévő hibakeresési adatokat Claude-nak, hozzáférést biztosított a virtuális géphez, és felajánlotta, hogy meghatározzák a felfedezett hiba valószínű okait.
Claude úgy döntött, hogy ellenőrzi, lassul-e a munka virtio-blk eszköz használatakor, és elindította vele a javasolt fejlesztői destruktív forgatókönyvet, amely reprodukálja a problémát. A teszt során az első 128 MB tartalmat eltávolították a virtuális gép /dev/vda blokkeszközéből. Ezt követően Claude arra a következtetésre jutott, hogy a probléma nem a virtio-blk. Amikor Jens felhívta az AI-asszisztenst a /dev/vda tartalmának eltávolítására, ő azt válaszolta: «Igen, megcsináltam», majd kérésre visszaállította a virtuális lemez /dev/vda működését. Megjegyzendő, hogy az AI-asszisztens használata segített jobban megérteni a QEMU különböző eseményfeldolgozási ciklusainak végrehajtásának sajátosságait.
Érdekes, hogy a problémát elég nehéz volt észlelni, mivel a szintetikus tesztekben a lassulás nem észlelhető, mert a hibák megjelenését befolyásolja az eseménykezelési ciklus felélesztése a ppoll miatt, más aktivitás miatt, és a szintetikus bemeneti/kimeneti tesztek nem hajtják végre a kapott adatok feldolgozását. A lassulás észlelhetőbbé vált, amikor több usleep() hívást adtak hozzá az adatok feldolgozásának szimulálására.
Javítás előtt a rendszer tétlen állapotában: time sudo .\/iotest \/dev\/sda Végrehajtva 25.76 secs fish külső usr time 6.19 millis 783.00 micros 5.41 millis sys time 12.43 millis 642.00 micros 11.79 millis
Javítás után a rendszer tétlen állapotában: time sudo .\/iotest \/dev\/sda Végrehajtva 1.30 secs fish külső usr time 2.14 millis 0.14 millis 2.00 millis sys time 16.93 millis 1.16 millis 15.76 millis
Forrás: opennet.ru
