A Facebook kiadott olyan javításokat, amelyek javítják a Slab memória vezérlőjét a Linuxban

Romano Gushchin (egy Facebook szoftvermérnök) egy sor javítást naplózott a slab driver memóriaelosztó alkalmazásához (egy memóriavezérlőhöz) a Linux kernel fejlesztői levelezőlistán.

Az új illesztőprogram azért figyelemre méltó, mert a slab elszámolást a memórialapok szintjéről a kernel objektumok szintjére helyezi át, lehetővé téve a slab lapok megosztását különböző c-csoportok között, ahelyett, hogy minden egyes c-csoporthoz külön slab gyorsítótárat kellene lefoglalni.

Roman azt találta, amit "nagyon súlyos hibának" nevez a meglévő memóriavezérlőben, ami manapság alacsony kihasználtsághoz vezet a csoportoknál.

„A valódi ok, ami miatt a meglévő kialakítás alacsony födémfelhasználáshoz vezet, egyszerű: a födémlapokat kizárólag a memóriakészlet használja.

Ha csak egy bizonyos méretű allokáció van egy cgroup által, vagy ha a cgroup eltávolítása után van néhány aktív objektum, vagy a cgroup egyetlen szálas alkalmazást tartalmaz, amely alig oszt fel kernelobjektumokat, de mindig új CPU: ezekben az esetekben az ebből származó födém kihasználtság nagyon alacsony.

Ha a kmem könyvelés le van tiltva, a kern felhasználhatja a födémoldalakon a szabad teret más kiosztásokhoz. «

A Romano Gushchin által tavaly javasolt Slab memóriavezérlő meglehetősen ígéretesnek bizonyult, mivel lehetővé teszi a Slab-kihasználás hatékonyságának növelését , 30-45%-kal csökkenti a Slab által felhasznált memória méretét , és jelentősen mérsékli a mag teljes memóriafogyasztását.

Továbbá a telepített javítások azt mutatták , hogy a Facebook már éles környezetben használja a kódot a szerverein, és többek között körülbelül 650-700 MB+ helyet takarított meg a front-end webszerverek, az adatbázis-gyorsítótár és a DNS-szerverek számára .

A nem mozgatható slab-ok számának csökkentése szintén pozitív hatással van a memória fragmentációjára. Az új memóriavezérlő jelentősen leegyszerűsíti a slab-ok elszámolására szolgáló kódot , és kiküszöböli a komplex algoritmusok szükségességét a slab gyorsítótárak dinamikus létrehozásához és törléséhez minden c-csoporthoz.

Az új megvalósításban a memória összes csoportja közös tábla gyorsítótárakat használ, és a lemezek gyorsítótárainak élettartama már nem kötődik a cgroup által beállított memória korlátok élettartamához.

Az új födémvezérlőben megvalósított pontosabb erőforrás-elszámolásnak elméletileg többet kellene megterhelnie a CPU-t, de a gyakorlatban a különbségek elhanyagolhatónak bizonyultak.

Különösen az új slab vezérlőt használják már hónapok óta élő Facebook szervereken, amelyek különböző típusú terheléseket kezelnek, és eddig nem észleltek jelentős regressziót.

A javítás tartalmaz néhány félig független alkatrészt, amelyek a panel memóriavezérlőjén kívül is megtalálhatók:

  • Az aloldal betöltése API, amely a jövőben felhasználható más, nem egy oldal méretű objektumok, például percpu kiosztások számlálására
  • A mem_cgroup_ptr API, ahol a memcg-ig számolt mutatók újrafelhasználhatók más objektumok, például pagecache hatékony újraszámlálására.

Ugyanakkor jelentősen csökkent a memóriafogyasztás : egyes gazdagépeken akár 1 GB memóriát is lehetett megtakarítani, de ez a mutató nagymértékben függ a terhelés jellegétől, a RAM teljes méretétől, a CPU mennyiségétől és a memóriahasználat jellemzőitől.

Ahelyett, hogy minden memóriacsoportra külön kmem_cache-készletet hoznának létre, két globális halmazt használnak: a gyökérhalmaz a megszámlálatlan és a gyökércsoport-csoportcsoport-hozzárendelésekhez, a második pedig az összes többi hozzárendeléshez. Ez lehetővé teszi az egyes kmem_cache élettartam-kezelésének egyszerűsítését.

Végül, ha érdekel a 19 javítócsomag, megtalálod a kernel levelezőlistáján.


Hozzáadás előnyben részesített forrásként a Google-ben