Facebook випустив патчі, які вдосконалюють контролер пам'яті Slab в Linux

Романо Гущин (програміст Facebook) опублікував набір патчів для програми розподілу пам'яті драйвера slab (контролера пам'яті) у списку розсилки розробників ядра Linux.

Новий драйвер примітний тим, що переносить облік slab з рівня сторінок пам'яті на рівень об'єктів ядра, що дозволяє спільно використовувати slab сторінки між різними c-групами, замість виділення окремих кешів slab для кожної c-групи.

Роман виявив, що він називає "дуже серйозною вадою" в існуючому контролері пам'яті плит, що в наш час призводить до низького рівня використання груп.

«Справжня причина, через яку існуюча конструкція призводить до низького використання слябів, проста: сторінки плит використовуються виключно пулом пам'яті.

Якщо є лише декілька розподілів певного розміру, зроблених cgroup, або якщо після видалення cgroup залишилося кілька активних об'єктів, або cgroup містить єдину потокову програму, яка ледь виділяє будь-які об'єкти ядра, але кожен раз новий процесор: у всіх цих випадках коефіцієнт використання плити дуже низький.

Якщо облік kmem вимкнено, ядро ​​може використовувати вільний простір на сторінках плит для інших розподілів. «

Контролер пам'яті Slab, запропонований Романо Гущиним минулого року, був досить перспективним, оскільки він дозволяє підвищити ефективність використання slab, зменшує розмір пам'яті, що використовується для slab, на 30-45% та значно зменшує загальне споживання пам'яті ядром.

Крім того, впроваджені патчі показали , що Facebook вже використовує цей код у продакшені на своїх серверах і , серед інших переваг, заощаджував ~650-700+ МБ .

Зменшення кількості непереміщуваних слэбів також позитивно впливає на фрагментацію пам'яті. Новий контролер пам'яті значно спрощує код для обліку слэбів та усуває необхідність у складних алгоритмах для динамічного створення та видалення кешів слэбів для кожної c-групи.

Усі cgroups для пам'яті в новій реалізації використовують загальний набір кеш-пам’яті плити, і тривалість життя кеш-пам’яті більше не прив’язана до тривалості життя обмежень пам'яті, встановлених через cgroup.

Більш точний облік ресурсів, впроваджений у новому контролері плит, теоретично повинен навантажувати процесор більше, але на практиці відмінності виявилися незначними.

Зокрема, новий контролер slab використовувався протягом кількох місяців на активних серверах Facebook, обробляючи різні типи навантажень, і поки що суттєвих регресій не виявлено.

Патч містить пару напівнезалежних частин, які також можуть бути використані поза контролером пам'яті плити:

  • API завантаження підсторінок, який можна використовувати в майбутньому для підрахунку інших об’єктів, розмір яких не є сторінкою, наприклад, розміщення percpu
  • API mem_cgroup_ptr, де вказівники підраховуються до memcg, може бути використаний повторно для ефективного перенаправлення інших об'єктів, наприклад кешу сторінок.

Водночас спостерігається значне зниження споживання пам'яті : на деяких хостах вдалося заощадити до 1 ГБ пам'яті, але цей показник значною мірою залежить від характеру навантаження, загального розміру оперативної пам'яті, обсягу процесора та особливостей роботи з пам'яттю.

Замість того, щоб створювати окремий набір kmem_caches для кожної групи пам'яті, використовуються два глобальні набори: кореневий набір для необлікованих та кореневі групи присвоєнь групи, а другий набір для всіх інших призначень. Це спрощує управління життям окремих kmem_caches.

Зрештою, якщо ви зацікавлені дізнатися більше про новий набір із 19 патчів, ви можете знайти його у списку розсилки ядра.


Додати як пріоритетне джерело в Google