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