Jens Axboe, tvorca io_uring a plánovačov vstupu/výstupu CFQ, Deadline a Noop, navrhol zahrnúť do kódu emulátora QEMU patch, ktorý znižuje latencie pri práci s fdmon (monitorovanie súborových deskriptorov) v režime „aio=io_uring“ a počas nečinnosti systému (idle) od 50 do 80 násobne.
Problém sa objavil kvôli príliš rýchlemu prechodu operácie ppoll() do stavu spánku s časovým obmedzením 499 ms, aj keď bol prítomný vstup/výstup. Na obnovenie vykonávania hlavného cyklu spracovania udalostí, ktoré bolo pozastavené kvôli ppoll(), bol navrhnutý patch, ktorý pridáva do funkcie na vytvorenie záznamu SQE (Submission Queue Entry) volanie funkcie aio_notify(), ktorá prebudí ppoll() z režimu spánku.
Problém sa objavil pri regresnom testovaní io_uring v virtuálnych strojoch s rôznymi blokovými zariadeniami. Jens si všimol náhodné výskyty časových obmedzení pri používaní AHCI/SATA zariadení v režime „aio=io_uring“, zatiaľ čo v konfiguráciách so zariadeniami virtio-blk alebo nvme sa testy vždy úspešne dokončili asi za sekundu. Treba poznamenať, že problém ovplyvňuje všetky typy blokových zariadení, ale pre AHCI/SATA zariadenia sú oneskorenia najvýraznejšie z dôvodu použitia MMIO.
Jens tiež opísal svoje skúsenosti s ladením problému pomocou AI asistenta Claude. Po identifikácii scenára reprodukujúceho podmienky na vznik časového obmedzenia odovzdal dostupné ladacie údaje Claude, poskytol prístup k virtuálnemu stroju a navrhol identifikovať pravdepodobné príčiny zisteného zlyhania.
Claude sa rozhodol overiť, či sa práca spomalí pri používaní zariadenia virtio-blk, a spustil s ním navrhnutý deštruktívny scenár reprodukujúci problém. Počas kontroly bolo odstránených prvých 128 MB obsahu z blokového zariadenia /dev/vda vo virtuálnom stroji. Následne Claude dospel k záveru, že problém nie je v virtio-blk. Keď Jens upozornil AI asistenta na odstránenie časti obsahu /dev/vda, odpovedal: „Áno, urobil som to“, a po žiadosti o opravu obnovil funkčnosť virtuálneho disku /dev/vda. Je pozoruhodné, že použitie AI asistenta pomohlo lepšie pochopiť vlastnosti vykonávania rôznych cyklov spracovania udalostí v QEMU.
Je pozoruhodné, že problém bolo dosť ťažké odhaliť, pretože v syntetických testoch sa spomalenie nezaznamenáva kvôli tomu, že na vznik poruchy vplýva prebudenie cyklu spracovania udalostí s ppoll z inej aktivity, a syntetické testy vstupu/výstupu nevykonávajú spracovanie prijatých údajov. Spomalenie sa stalo viac viditeľným, keď sme pridali niekoľko volaní usleep() na simuláciu spracovania údajov.
Pred opravou na systéme v nečinnosti (idle): time sudo ./iotest /dev/sda Vykonané za 25.76 sekundy fish externé usr čas 6.19 millis 783.00 mikros 5.41 millis sys čas 12.43 millis 642.00 mikros 11.79 millis
Po oprave na systéme v nečinnosti: time sudo ./iotest /dev/sda Vykonané za 1.30 sekundy fish externé usr čas 2.14 millis 0.14 millis 2.00 millis sys čas 16.93 millis 1.16 millis 15.76 millis
Zdroj: opennet.ru
