Arendaja io_uring tuvastas QEMU's probleemi, mis aeglustas fdmoni 50-80 korda ooteasendis.

Jens Axboe, io_uring'i ja CFQ, Deadline ja Noop sisend/väljund planeerijate looja, pakkus QEMU emulatori koodibaasi lisamiseks patši, mis vähendab fdmon'i (faili descriptor'i jälgimise) viivitusi 50-80 korda, töötades režiimis „aio=io_uring” ja olles süsteemis ooterežiimis.

Probleem tekkis, kuna ppoll() operatsioon viidi ooterežiimi 499 ms ajaks, hoolimata sisendi/väljundi olemasolust. Peamise sündmuste töötlemise tsükli taastamiseks, mis peatati ppoll() tõttu, pakuti välja patš, mis lisab SQE (Submission Queue Entry) salvestamise funktsiooni kutsumise, mis toob ppoll() ooterežiimist välja.

Probleem tekkis io_uring'i regressioonitesti käigus virtuaalmasinatel erinevate blokeeringute seadmetega. Jens märkis, et AHCI/SATA seadmete kasutamisel režiimis „aio=io_uring” ilmnes juhuslikult viivitusi, samas kui virtio-blk või nvme seadmete konfiguratsioonides lõppesid testid alati edukalt umbes sekundi jooksul. Tõdetakse, et probleem mõjutab kõiki blokeeringute seadmeid, kuid AHCI/SATA seadmete puhul on viivituste teke kõige väljendunum MMIO kasutamise tõttu.

Jens kirjeldas ka oma kogemust probleemide silumist AI-assistendi Claude abil. Pärast stsenaariumi määratlemist, mis tekitas ajavältimise tingimused, edastas ta olemasolevad silumisandmed Claude'ile, andis juurdepääsu virtuaalmasinale ja pakkus välja tõenäolised põhjused avastatud rikke määratlemiseks.

Claude otsustas kontrollida, kas virtio-blk seadme kasutamisel aeglustub töö ja käivitas koos selle seadmega arendaja poolt ette pandud destruktiivsete stsenaariumide, mis probleemi esile kutsub. Kontrollimise käigus kustutati virtuaalmasina blokeerimise seadme /dev/vda esimesed 128 MB sisu. Pärast seda tegi Claude järelduse, et probleem ei ole virtio-blk'is. Kui Jens osutas AI-assistentidele /dev/vda sisu kustutamisele, vastas ta "Jah, ma tegin seda" ja pärast taotlust taastada, taastati virtuaaldiski /dev/vda funktsionaalsus. Tõdetakse, et AI-assistendi kasutamine aitas paremini mõista erinevate sündmuste töötlemise tsüklite omadusi QEMU-s.

Oluline on märkida, et probleemi oli üsna raske tuvastada, kuna sünteetilistes testides ei registreerita aeglustumist, kuna ajavältimise põhjustab sündmuste töötlemise tsükli ärkamine ppoll'i tõttu teise tegevuse tõttu ning sünteetilised sisendi/väljundi testid ei töötle saadud andmeid. Aeglustumine sai märgatavamaks mitme usleep() kutsumise lisamisel andmete töötlemise simuleerimiseks.

Enne parandamist ooterežiimis süsteemis: time sudo ./iotest /dev/sda Sooritatud: 25.76 secs fish väline usr time 6.19 millis 783.00 micros 5.41 millis sys time 12.43 millis 642.00 micros 11.79 millis

Pärast parandamist ooterežiimis süsteemis: time sudo ./iotest /dev/sda Sooritatud: 1.30 secs fish väline usr time 2.14 millis 0.14 millis 2.00 millis sys time 16.93 millis 1.16 millis 15.76 millis

Allikas: opennet.ru

Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster