Facebook пусна кръпки, които подобряват контролера на паметта Slab в Linux

Романо Гушчин (софтуерен инженер във 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 пача, можете да го намерите в пощенския списък на ядрото.


Добавяне като предпочитан източник в Google