Суть изменения: Refill Sheaves from Barn
В ветку slab/for-next Git-репозитория ядра Linux, которая будет слита в релиз 7.4 в конце октября, добавлен патч от разработчика Хао Ли (Hao Li). Изменение касается механизма управления памятью, а именно — переполнения кэша sheaves. Sheaves представляют собой массивный кэш на уровне каждого процессора (per-CPU) для аллокатора памяти ядра. До этого момента, когда список полных sheaves в «амбаре» (barn) насыщался, система не могла эффективно освобождать место, что приводило к необходимости сброса всех RCU-sheaves в slab-кэши.
Новый подход позволяет аллокатору забирать объекты из полных sheaves в амбаре для дозаполнения неполных sheaves, создавая при этом partial sheaf (частичный sheaf) для оставшихся объектов. Это решает проблему насыщения списка и снижает нагрузку на блокировку list_lock, так как забор из амбара дешевле, чем из частичных slab-кэшей.
Результаты бенчмарков: от двойных цифр до миллионов процентов
Изменение, состоящее всего из 81 строки кода, демонстрирует аномально высокие результаты в специфических синтетических тестах. Хотя общий прирост в тесте will-it-scale mmap1 составил умеренные 24%, метрики работы с амбаром показали взрывной рост. Это связано с тем, что базовые значения в этих узких местах кода были крайне низкими, поэтому любое улучшение масштабируется в огромные проценты.
| Метрика / Тест | Рост производительности | Примечание |
|---|---|---|
barn_get |
+22,904,539.81% | Экстремальный рост из-за низкой базы |
barn_put |
+21,422,544.07% | Экстремальный рост из-за низкой базы |
will-it-scale mmap1 |
+24% | Общий прирост в комплексном тесте |
| Другие метрики | Двойные цифры (%) | Стабильное улучшение |
Почему это важно для инфраструктуры
Хотя цифры в миллионы процентов выглядят как артефакт синтетического теста, реальная польза заключается в устранении узких мест при высокой конкуренции за память. Механизм RCU (Read-Copy-Update) часто создает нагрузку на аллокатор при освобождении объектов через kfree_rcu(). Предыдущая реализация заставляла ядро тратить ресурсы на сброс sheaves, когда амбар был полон. Новая логика refill_sheaf() делает процесс более плавным и предсказуемым, снижая задержки (latency) и улучшая масштабируемость систем с большим количеством ядер.
Детали реализации
Ключевые технические изменения включают:
- Введение partial sheaf: Хранит оставшиеся объекты после дозаполнения, не позволяя списку полных sheaves насыщаться без возможности выхода.
- Разделение путей: Путь общего выделения (
__pcs_replace_empty_main()) продолжает обменивать пустые sheaves на полные, не создавая остатков. Путь дозаполнения (prefill) теперь работает с частичными sheaves. - Снижение contention: Забор объектов из амбара происходит дешевле с точки зрения блокировок, чем из частичных slab-кэшей.
Патч ужеqueued в основную ветку разработки и ожидается в стабильном релизе Linux 7.4 в конце октября 2026 года.
Источник: Phoronix ↗
