Романо Гушчин (софтуерен инженер във Facebook) е публикувал набор от корекции за приложението за разпределение на паметта на драйвера на slab (контролер на паметта) в пощенския списък за разработка на ядрото на Linux.
Новият драйвер е забележителен с преместването на отчитането на slab-овете от нивото на страниците в паметта на нивото на обектите на ядрото, което прави възможно споделянето на slab-овете между различни c-групи, вместо да се разпределят отделни slab-кешове за всяка c-група.
Роман откри това, което той нарича „много сериозен недостатък“ в съществуващия контролер на паметта на плочата, което води до ниско използване в наши дни с cgroups.
„Истинската причина, поради която съществуващото оформление води до ниско използване на плоча, е проста: страниците на плочите се използват изключително от пул памет.
Ако има само няколко разпределения с определен размер, направени от cgroup, или ако има някои активни обекти, останали след премахването на cgroup, или cgroup съдържа едно приложение с резба, което едва разпределя никакви обекти на ядрото, но всеки път на нов процесор: във всички тези случаи използваната плоча е много ниска.
Ако отчитането на kmem е деактивирано, ядрото може да използва свободно място на страниците на плочата за други разпределения. «
Контролерът на паметта Slab, предложен от Романо Гушчин миналата година, беше доста обещаващ, тъй като позволява повишена ефективност при използването на slab, намалява размера на паметта, използвана за slab, с 30-45% и значително намалява общата консумация на памет от ядрото.
Освен това, внедрените корекции показват , че Facebook вече използва кода в производствен режим на своите сървъри и е спестявал ~650-700MB+ за front-end уеб сървъри , кеширане на база данни и DNS сървъри, наред с други предимства.
Намаляването на броя на неподвижните плочи също има положителен ефект върху фрагментацията на паметта. Новият контролер на паметта значително опростява кода за отчитане на плочи и елиминира необходимостта от сложни алгоритми за динамично създаване и изтриване на кешове на плочи за всяка c-група.
Всички cgroups за памет в новата реализация използват общ набор от кешове на плочи и продължителността на живота на кешовете на плочи вече не е обвързана с продължителността на живота на ограниченията на паметта, зададени чрез cgroup.
По-прецизното отчитане на ресурсите, внедрено в новия контролер на плочи, теоретично би трябвало да натовари повече процесора, но на практика разликите се оказаха незначителни.
По-специално, новият контролер за slab се използва от няколко месеца на активни Facebook сървъри, обработващи различни видове натоварвания, и досега не са открити значителни регресии.
Пластирът съдържа няколко полунезависими части, които също могат да намерят приложение извън контролера на паметта на плочата:
- API за зареждане на подстраници, който може да се използва в бъдеще за преброяване на други обекти, които не са с размер на страница, например разпределения на percpu
- API mem_cgroup_ptr, където се преброяват указатели към memcg, може да се използва повторно за ефективно препращане на други обекти, например кеш на страници.
В същото време се наблюдава значително намаляване на консумацията на памет : на някои хостове беше възможно да се спести до 1 GB памет, но този показател зависи до голяма степен от естеството на натоварването, общия размер на RAM паметта, количеството процесор и характеристиките на работа с паметта.
Вместо да се създава отделен набор от kmem_caches за всяка cgroup памет, се използват два глобални набора: основният набор за неотчетени и присвояванията на cgroup на основната група и вторият набор за всички останали назначения. Това позволява опростяване на доживотното управление на отделни kmem_caches.
И накрая, ако се интересувате да научите повече за новия набор от 19 пача, можете да го намерите в пощенския списък на ядрото.