Jens Axboe, krijuesi i io_uring dhe planifikuesve të I/O CFQ, Deadline dhe Noop, ka propozuar një patch për përfshirje në bazën e kodit të emulatorit QEMU që zvogëlon vonesën me një faktor prej 50-80 kur ekzekutohet fdmon (monitorimi i përshkruesit të skedarëve) në modalitetin "aio=io_uring" dhe kur sistemi është në gjendje të papërdorur.
Problemi u shkaktua nga fakti që operacioni ppoll() u vendos në modalitetin e gjumit me një kohëzgjatje prej 499 ms, pavarësisht pranisë së funksionit I/O. Për të rifilluar ekzekutimin e ciklit kryesor të përpunimit të ngjarjes të pezulluar nga ppoll(), u propozua një patch që shton një thirrje në funksionin aio_notify() në funksionin e krijimit të hyrjes SQE (Submission Queue Entry), duke e zgjuar ppoll() nga modaliteti i gjumit.
Problemi u shfaq gjatë testimit të regresionit të io_uring në makina virtuale Me pajisje të ndryshme bllokuese. Jens vuri re ndërprerje të rastit të kohës kur përdoreshin pajisjet AHCI/SATA në modalitetin "aio=io_uring", ndërsa testet përfundonin gjithmonë me sukses brenda rreth një sekonde me pajisjet virtio-blk ose nvme. Ai vuri në dukje se problemi prek të gjitha llojet e pajisjeve bllokuese, por për pajisjet AHCI/SATA, vonesat janë më të theksuara për shkak të përdorimit të MMIO.
Jens përshkroi gjithashtu përvojën e tij në zgjidhjen e problemit duke përdorur asistentin e inteligjencës artificiale Claude. Pasi identifikoi një skenar që riprodhonte kushtet e kohës së skadimit, ai ia kaloi të dhënat e disponueshme të zgjidhjes së problemit Claude, i dha akses në makinën virtuale dhe ofroi të identifikonte shkaqet e mundshme të dështimit të zbuluar.
Claude vendosi të testonte nëse performanca do të ngadalësohej gjatë përdorimit të pajisjes virtio-blk dhe ekzekutoi skriptin shkatërrues të zhvilluesit për të riprodhuar problemin. Gjatë testit, 128 MB e para të përmbajtjes u fshinë nga pajisja bllok /dev/vda në makinën virtuale. Pas kësaj, Claude arriti në përfundimin se virtio-blk nuk ishte problemi. Kur Jens i udhëzoi asistentit të IA-së të fshinte disa nga përmbajtjet e /dev/vda, ai u përgjigj, "Po, e bëra këtë", dhe pasi i kërkoi ta rregullonte, e riktheu diskun virtual /dev/vda në gjendje pune. Përdorimi i asistentit të IA-së e ndihmoi atë të kuptonte më mirë specifikat e sytheve të ndryshme të përpunimit të ngjarjeve të QEMU-së.
Vlen të përmendet se problemi ishte mjaft i vështirë për t'u zbuluar, pasi ngadalësimi nuk zbulohet në testet sintetike sepse rrëzimi shkaktohet nga zgjimi i ciklit të ngjarjeve ppoll për shkak të aktivitetit tjetër, dhe testet sintetike të hyrjes/daljes nuk përpunojnë të dhënat e marra. Ngadalësimi u bë më i dukshëm kur shtoheshin thirrje të shumta usleep() për të simuluar përpunimin e të dhënave.
Para se të rregulloni sistemin në gjendje të papërgatitur: koha sudo ./iotest /dev/sda Ekzekutuar në 25.76 sekonda koha e përdoruesit të jashtëm të peshkut 6.19 millis 783.00 mikros 5.41 millis koha e sistemit 12.43 millis 642.00 mikros 11.79 millis
Pas rregullimit të problemit, në një sistem në gjendje të papërgatitur: koha sudo ./iotest /dev/sda Ekzekutuar në 1.30 sekonda koha e përdoruesit të jashtëm të peshkut 2.14 milis 0.14 milis 2.00 milis koha e sistemit 16.93 milis 1.16 milis 15.76 milis
Burimi: opennet.ru
