A Linux 6.16 kernelben jelentősen fejlődik a Futex2 és a NUMA támogatása

A Linux 6.16 kernel verziójához tartozó zárolási alrendszer frissítései jelentős előrelépést hoznak a futex alrendszer fejlesztésében. A május 25-én benyújtott locking/core ág tartalmazza a locking/futex szál újításait is, amelyek a futex2 képességeit bővítik, különös figyelemmel a NUMA-támogatásra és a memóriapolitika-tudatos működésre. A Molnár Ingo által benyújtott változások célja a szinkronizáció hatékonyabbá és skálázhatóbbá tétele, különösen párhuzamos környezetekben.

A Linux 6.16 kernelben jelentősen fejlődik a Futex2 és a NUMA támogatása

Futex2 NUMA és MPOL kiterjesztések

A futex2 új ABI-t kapott, amely NUMA-tudatosságot biztosít. Ennek lényege, hogy a hagyományos 32 bites futex érték mellett egy második mező is megjelenik, amely a NUMA csomópont azonosítóját tartalmazza. Ez lehetővé teszi, hogy a rendszer optimalizálja a zárolások elhelyezését a memória topológia alapján, csökkentve ezzel a késleltetést és javítva a teljesítményt. Ezt egészíti ki a memóriapolitika-alapú bővítés, amely a futex működését a processzek által preferált memóriaterületekhez igazítja. A cél ezzel a node-alapú hash-elés finomhangolása és a még pontosabb szinkronizációs döntéshozatal.

Info
A futex (fast userspace mutex) egy kernel API, amely lehetővé teszi, hogy a felhasználói térben működő szálak gyorsan és hatékonyan szinkronizáljanak egymással. A futex működése „optimista”: a zárolási műveletek általában teljesen userspace-ben történnek, csak akkor vonják be a kernelt, ha versenyhelyzet vagy várakozás lép fel. A NUMA-csomópont (vagy egyszerűbben NUMA node) a Non-Uniform Memory Access architektúrában egy logikai egység, amely általában egy processzormagot (vagy processzorcsoportot) és a hozzá közvetlenül kapcsolódó memóriát jelenti.

Helyi hash tábla infrastruktúra

A cél, hogy minden szál saját futex hash táblát kapjon, amelyet a rendszer automatikusan létre tud hozni, méretezni, sőt igény szerint akár véglegessé is lehet tenni, vagyis később már nem módosítható. Ez a megközelítés segít elkerülni, hogy különböző szálak egymás működését zavarják, így a párhuzamos műveletek gyorsabban és stabilabban futhatnak. A fejlesztés részeként új vezérlőfüggvények is megjelentek, például a futex_q_lockptr_lock, amely pontosabb irányítást tesz lehetővé a zárolások felett. Emellett új eszközök készültek a hash táblák inicializálására is, amelyek megbízhatóbb alapot biztosítanak a többszálú működéshez. A hash kezelés belső működését is átdolgozták, így most egységesebb és átláthatóbb a megvalósítás.

Lockdep és zárolási karbantartás

A lockdep rendszer frissítései megakadályozzák a zárolási alosztályok hibás vagy rosszindulatú használatát, és új statisztikai mutatót vezetnek be a procfs interfészen keresztül. Ez a fejlesztés különösen fontos a hibakeresés során, ahol a dinamikusan létrehozott zárolási kulcsok száma mostantól könnyen lekérdezhető. Emellett több karbantartási módosítás is történt a zárolási kódban, amelyeket több fejlesztő közreműködésével hajtottak végre, beleértve a dokumentációk pontosítását és egyes függvények átszervezését.

Kapcsolódó kernelmódosítások

A zárolási patchcsomag olyan kernel-szintű függőségeket is tartalmaz, amelyek más alrendszerekhez tartoznak. Megjelent az új vmalloc_huge_node függvény, amely nagy lapos memóriafoglalást tesz lehetővé meghatározott NUMA csomópontra. Ezen felül bekerült az mmap_read_lock őrző makró, amely a memóriafeltérképezési zárolásokat egyszerűsíti. Az RCU-referenciák kezelését segíti az új rcuref_is_dead segédfüggvény, amely biztonságosabb életciklus-kezelést biztosít a memóriahasználat során.

A Linux 6.16 futex és zárolási alrendszerének fejlesztései célzott válaszokat adnak a modern, párhuzamos programvégrehajtási igényekre. A futex2 NUMA- és memóriapolitika-tudatos bővítései, a helyi hash támogatás, valamint a lockdep rendszer robusztusabbá tétele együttesen jelentik azt az alapot, amelyre a jövő nagy teljesítményű Linux rendszerei támaszkodhatnak. A változások különösen előnyösek lesznek a Wine és Proton környezetek számára, ahol a Windows-kompatibilitás megköveteli a bonyolult szinkronizációs modellek pontos leképezését. A futex2 fejlesztését főként a Wine, a Proton (Steam), valamint a real-time Linux közösség érdekei hajtják. Ezek olyan alkalmazási területek, ahol a klasszikus futex korlátai gyakorlati problémákat okoznak.

A futex2 még fejlesztés alatt áll, de már egy ideje létezik patchek formájában. Több disztribúcióban opcionálisan elérhető, de még nem vált teljesen alapértelmezetté. A Wine és a Proton fejlesztői már használják, amikor elérhető, mivel a Windows API egyes szinkronizációs primitívjei (pl. WaitMultipleObject) hatékonyabban megvalósíthatók futex2 segítségével.

A pull requesttel kapcsolatos bejegyzés a kernel.org webolalon olvasható.