Őrült javítások turbózzák fel a Linux IO_uring teljesítményét

enlightened Ez az oldal a közösségért készül. heart Kövess minket máshol is:  Linux Mint Magyar Közösség a Mastodon-on  Telegram csatorna – csak hírek  Beszélgessünk a Telegram – Linux csevegő csoport  Hírek olvasása RSS segítségével  Linux Mint Hivatalos Magyar Közösség a Facebook-on      Linux Mint Baráti Kör a Facebook-on
wink Ha hasznosnak találod, és szeretnéd, hogy folytatódjon, támogasd a munkát Ko-fi vagy Paypal segítségével. laugh

kami911 képe

Jens Axboe továbbra is új lehetőségeket talál arra, hogyan lehet a remek IO_uring frameworköt még jobb teljesítményre bírni a Linux kernel-ben. A hét végére olyan „őrült” javítócsomagokat tett közzé, amelyek érezhető gyorsulást hoznak. Axboe legújabb munkája a kernel blokkoló viselkedésének javítására koncentrál. A mai RFC patch sorozatban így írta le a fejlesztést:

„Az io_uring a kéréseket inline módon, IO_URING_F_NONBLOCK flaggel adja ki, és io-wq-ra teszi át őket, ha ez nem lehetséges. Egy sor opcode esetén ez egyáltalán nem lehetséges, mert nincs számukra nem blokkoló útvonal a kernel-ben: ilyen az fsync, statx, openat, a *at család, xattr, fadvise, splice stb. Ezeket feltétel nélkül átteszi io-wq-ra, ami minden egyes kérésnél egy szál-felébresztés, egy kontextusváltás és egy task_work completion kör megtételének költségével jár. Az io_uringnek nagyon óvatosnak kell lennie, hogy elkerülje a véletlen blokkolást a kernel-ben, még akkor is, ha az adott műveletek túlnyomórészt soha nem blokkolnak. Szomorú történet. Ilyen például egy fdatasync, ami nem blokkol, egy statx, ami dcache-t talál el, vagy egy openat O_TMPFILE-lel. Ezek mind szépen lefutnának inline, de az io_uring egyszerűen nem támaszkodhat erre.

Ez a sorozat ezeket a kéréseket inline, blokkoló módban adja ki, és csak akkor fizetjük meg az offload költségét, ha a kérés tényleg blokkol. Mire azonban blokkol, a beküldő már mélyen a kernel-ben jár, a kérés ott van a stackjén, így a munkát nem lehet egy másik szálra áttenni. Amit át tudunk tenni, az az identitás. Ha a beküldő task blokkol, egy üresjáratban lévő io-wq worker átveszi a felhasználó felé látható identitását (tid, szignálállapot, jogosultságok, ütemezési attribútumok, cgroup, felhasználói regiszterállapot), befejezi az io_uring_enter() hívást, és a beküldőként tér vissza user space-be. Az eredeti task fejezi be a kérést io-wq worker szerepben, és csatlakozik a poolhoz. A user space remélhetőleg semmit nem vesz észre, ugyanaz a tid jön vissza a rendszerhívásból, csak épp egy másik task_structon fut. Akik régóta itt vannak, talán emlékeznek a hasonló próbálkozásokra úgy 20 évvel ezelőttről.”

Axboe X-en is írt ezekről az „őrült javításokról”, és megosztott néhány grafikont az IO_uring új, „ízletes” eredményeiről is, amelyek főleg azoknak a felhasználóknak lesznek érdekesek, akiket kevésbé izgatnak a változtatás belső technikai részletei. Hamarosan kiderül, hová fut ki ez a munka, és hogy készen áll-e majd a mainline-ba kerülésre a Linux v7.4 ciklusára.