Komoly teljesítménygondot orvosol a Linux 6.18 – a „lazytime” opció miatti 100%-os CPU-terhelés megszüntetése

Segítséget kaptál? Szívesen töltöd itt az idődet? Visszajársz hozzánk? Támogasd a munkákat: Ko-fi és Paypal!

kami911 képe

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.