Facebook frigav patches, der forbedrer Slab-hukommelsescontrolleren i Linux

Romano Gushchin (en Facebook-softwareingeniør) loggede et sæt programrettelser til slab-driverens hukommelsesallokeringsapplikation (en hukommelsescontroller) på Linux-kerneudviklingsmaillisten.

Den nye driver er bemærkelsesværdig ved at flytte slab-regnskab fra niveauet af hukommelsessider til niveauet af kerneobjekter, hvilket gør det muligt at dele slab-sider på tværs af forskellige c-grupper i stedet for at allokere separate slab-caches til hver c-gruppe.

Roman fandt, hvad han kalder en "meget alvorlig fejl" i den eksisterende pladehukommelsescontroller, der fører til lav udnyttelse i disse dage med cgroups.

"Den virkelige grund til, at det eksisterende design fører til lav pladeudnyttelse, er enkel: pladesider bruges udelukkende af én pulje af hukommelse.

Hvis der kun er nogle få allokeringer af en vis størrelse lavet af en cgroup, eller hvis der er nogle aktive objekter tilbage efter cgroup er fjernet, eller cgroup indeholder en enkelt-trådet applikation, der næsten ikke allokerer nogen kerneobjekter, men hver gang på en ny CPU: i alle disse tilfælde er udnyttelsen af ​​den resulterende plade meget lav.

Hvis kmem-regnskab er deaktiveret, kan kernen bruge den ledige plads på pladesiderne til andre tildelinger. «

Slab-hukommelsescontrolleren, som Romano Gushchin foreslog sidste år, var ret lovende, da den muliggør øget effektivitet i slab-brugen, reducerer størrelsen af ​​hukommelse, der bruges til slab, med 30-45% og reducerer kernens samlede hukommelsesforbrug betydeligt.

Derudover har de implementerede programrettelser vist , at Facebook allerede bruger koden i produktion på sine servere og sparede ~650-700 MB+ til front-end webservere , databasecaching og DNS-servere, blandt andre fordele.

At reducere antallet af ikke-bevægelige slabs har også en positiv effekt på hukommelsesfragmentering. Den nye hukommelsescontroller forenkler koden til regnskab for slabs betydeligt og eliminerer behovet for komplekse algoritmer til dynamisk oprettelse og sletning af slab-caches for hver c-gruppe.

Alle hukommelses-cgroups i den nye implementering bruger et fælles sæt af pladecaches, og levetiden af ​​pladecaches er ikke længere bundet til levetiden for hukommelsesbegrænsninger, der er indstillet gennem cgroup.

Det mere nøjagtige ressourceregnskab implementeret i den nye pladedriver burde teoretisk set belaste CPU'en mere, men i praksis viste forskellene sig at være ubetydelige.

Især den nye slab-controller har været brugt i flere måneder på live Facebook-servere, der håndterer forskellige typer belastninger, og indtil videre er der ikke registreret signifikante regressioner.

Patchen indeholder et par semi-uafhængige dele, som også kan finde deres anvendelse uden for pladehukommelsescontrolleren:

  • Subpage Load API, som kan bruges i fremtiden til at tage højde for andre objekter uden sidestørrelse, for eksempel percpu-allokeringer
  • mem_cgroup_ptr API'et, hvor der tælles pointere til en memcg, kan genbruges til effektiv reparenting af andre objekter, f.eks. pagecache.

Samtidig er der et betydeligt fald i hukommelsesforbruget : på nogle værter var det muligt at spare op til 1 GB hukommelse, men denne indikator afhænger i høj grad af belastningens art, den samlede RAM-størrelse, mængden af ​​CPU og egenskaberne ved at arbejde med hukommelse.

I stedet for at oprette et individuelt sæt kmem_caches for hver hukommelses-cgroup, bruges to globale puljer: rodpuljen til urapporterede og rodpuljecgroup-allokeringer og den anden pulje for alle andre allokeringer. Dette gør det muligt at forenkle levetidsstyringen af ​​individuelle kmem_caches.

Endelig, hvis du er interesseret i at lære om det nye sæt af 19 patches, kan du finde det på kernens mailingliste.


Tilføj som foretrukken kilde i Google