Jens Axboe, creatore di io_uring e dei pianificatori di input/output CFQ, Deadline e Noop, ha proposto l'inclusione nel codice sorgente dell'emulatore QEMU di un patch che riduce i ritardi fino a 50-80 volte durante l'uso di fdmon (monitoraggio del descrittore di file) in modalità «aio=io_uring» e durante lo stato di inattività del sistema.
Il problema si presentava a causa della traduzione dell'operazione ppoll() in uno stato di sospensione con timeout di 499 ms, nonostante la presenza di input/output. Per riprendere l'esecuzione del ciclo principale di elaborazione degli eventi, sospeso a causa di ppoll(), è stata proposta una patch che aggiunge una chiamata alla funzione aio_notify() nella funzione di creazione dell'entry di submission queue (SQE).
Il problema è emerso durante il test di regressione di io_uring in macchine virtuali con diversi dispositivi a blocchi. Jens ha notato un'insolita comparsa di timeout quando si usavano dispositivi AHCI/SATA in modalità «aio=io_uring», mentre nei test con dispositivi virtio-blk o nvme le prove si concludevano sempre con successo in circa un secondo. È stato notato che il problema coinvolge tutti i tipi di dispositivi a blocchi, ma per i dispositivi AHCI/SATA la comparsa di ritardi è particolarmente pronunciata a causa dell'uso di MMIO.
Jens ha anche descritto la sua esperienza nella risoluzione del problema utilizzando l'assistente AI Claude. Dopo aver definito uno scenario che riproduceva le condizioni per la comparsa del timeout, ha fornito a Claude i dati di debug disponibili, accesso alla macchina virtuale e ha proposto di identificare le probabili cause del fallimento rilevato.
Claude ha deciso di verificare se le prestazioni si sarebbero rallentate utilizzando il dispositivo virtio-blk e ha eseguito il scenario distruttivo proposto dallo sviluppatore che riproduceva il problema. Durante il controllo, sono stati eliminati i primi 128 MB di contenuto dal dispositivo a blocchi /dev/vda nella macchina virtuale. Successivamente, Claude ha concluso che il problema non era nel virtio-blk. Quando Jens ha indicato all'assistente AI di rimuovere parte del contenuto di /dev/vda, ha risposto «Sì, l'ho fatto», e dopo la richiesta di ripristino — ha ripristinato il funzionamento del disco virtuale /dev/vda. Si segnala che l'uso dell'assistente AI ha aiutato a comprendere meglio le caratteristiche dell'esecuzione dei vari cicli di elaborazione degli eventi in QEMU.
È notevole che sia stato piuttosto difficile rilevare il problema, poiché nei test sintetici non si registra alcun rallentamento a causa del fatto che il risveglio del ciclo di elaborazione degli eventi con ppoll è influenzato da altre attività, e i test sintetici di input/output non elaborano i dati ricevuti. Il rallentamento è diventato più evidente con l'aggiunta di diverse chiamate a usleep() per simulare l'elaborazione dei dati.
Prima della correzione nel sistema in stato di inattività (idle): time sudo ./iotest /dev/sda Eseguito in 25,76 sec fish esterno usr time 6,19 millis 783,00 micros 5,41 millis sys time 12,43 millis 642,00 micros 11,79 millis
Dopo la correzione nel sistema in stato di inattività: time sudo ./iotest /dev/sda Eseguito in 1,30 sec fish esterno usr time 2,14 millis 0,14 millis 2,00 millis sys time 16,93 millis 1,16 millis 15,76 millis
Fonte: opennet.ru
