
A Microsoftnál dolgozó Christian Brauner, a Linux kernel egyik meghatározó mérnöke, 12 darabból álló pull request-sorozatot küldött be a Linux 6.18-hoz. Ezek közül az egyik legfontosabb változtatás a VFS (Virtual File System) réteget érinti, és egy komoly problémát hivatott megoldani: bizonyos körülmények között a rendszer akár órákon át 100%-os CPU-terhelés alá kerülhetett.
A probléma gyökere: a lazytime mount opció
A hibajelenség akkor jelentkezett, amikor egy systemd unit – például egy nagy erőforrásokat használó cron feladat – nagyszámú fájl olvasásába kezdett egy olyan fájlrendszerről, amely a lazytime mount opcióval volt csatolva.
A lazytime opció lényege, hogy a fájlokhoz tartozó időbélyegek (hozzáférés, módosítás, létrehozás ideje – atime, mtime, ctime) először csak az inode memóriabeli példányában frissülnek, így csökken a lemezre írások mennyisége, és ezáltal nő a teljesítmény. Az időbélyegek tényleges kiírása csak olyan műveleteknél történik meg, mint az fsync, a memóriából való kiszorítás vagy más szinkronizáló folyamatok.
Hogyan vezetett mindez CPU-kimerüléshez?
A Linux fejlesztői megfigyelték, hogy amikor egy systemd unit sok fájlt olvas be lazytime alatt, a szülő cgroup-ba való kilépéskor több százezer, vagy akár több millió „piszkos” inode (dirty inode) is áthelyezésre kerülhet.
A probléma az inode_do_switch_wbs() függvényben rejlett, amely a megfelelő helyre sorolta be az inode-okat a b_dirty listában. Ez a művelet lineáris időkomplexitású volt a piszkos inode-ok számától függően. Ha mindezt sok százezer inode-ra kellett lefuttatni, az algoritmus kvázi négyzetes időkomplexitássá vált, ami gyakorlatilag a kernel worker folyamatokat órákra 100%-os CPU-használatra kényszerítette.
A megoldás: optimalizált writeback kód
Brauner beolvasztási kérelme ennek a kódnak az optimalizálását célozza, hogy a rendszer ne „fagyjon le” hosszú időre nagy terhelés mellett sem. Az új logika sokkal hatékonyabban kezeli a dirty inode-ok áthelyezését, így elkerülhető a korábbi teljesítménykatasztrófa.
A beküldött javítás mellé egy teszt script is tartozik, amellyel a fejlesztők demonstrálták a problémát a jelenlegi kernelkiadásokon. Ez lehetővé teszi, hogy a hiba hatását mások is könnyen reprodukálják.
Mit jelent ez a felhasználóknak?
Ha a javítás bekerül a Linux 6.18-ba, az érintett felhasználók és rendszergazdák számíthatnak rá, hogy a systemd unitok nagy fájlműveletei többé nem okoznak extrém CPU-terhelést. Ez különösen a nagy szerverparkok, cron-alapú tömeges feldolgozások, valamint a virtualizáció és konténeres környezetek esetében fontos, ahol a lazytime opció gyakran van bekapcsolva a teljesítménynyereség érdekében.
A következő lépés
A javítás a Linux 6.18 merge window során kerülhet be a fő kernel-ágba, így a stabil kiadásban már minden felhasználó számára elérhető lesz. A probléma megoldása újabb bizonyíték arra, hogy a kernel közösség gyorsan és hatékonyan reagál a valós felhasználói tapasztalatokra.
