zswap: pool limit reached — Тюнинг сжатия памяти zswap в Linux
Архитектура ошибки и симптомы сбоя
Сообщение «zswap: pool limit reached, refusing compressed page storage» генерируется подсистемой сжатого кэширования страниц zswap. zswap перехватывает страницы, отправляемые ядром в файл подкачки (Swap), сжимает их в оперативной памяти и сохраняет в динамическом пуле. Ошибка означает, что суммарный объем сжатого пула достиг лимита (по умолчанию max_pool_percent = 20% от RAM). В результате zswap прекращает принимать новые страницы и начинает сбрасывать несжатые данные на физический диск (Swap Device), вызывая дисковую перегрузку.
Диагностическая таблица параметров сбоя
| Параметр | Значение | Инженерный смысл сбоя |
|---|---|---|
| max_pool_percent | Default: 20% | Максимальный процент физической оперативной памяти, отводимый под zswap пул. |
| zpool allocator | z3fold / zbud / zsmalloc | Аллокатор упаковки нескольких сжатых страниц в один физический фрейм памяти. |
| compressor | zstd / lz4 / lzo | Алгоритм компрессии (скорость vs коэффициент сжатия). |
Пошаговое дерево решений и сценарии траблшутинга
Сценарий 1: Проверка текущей утилизации пула zswap
# Просмотр статистики zswap через debugfs (или sysfs):
sudo grep -R . /sys/kernel/debug/zswap/ 2>/dev/null || grep -R . /sys/module/zswap/parameters/
# Просмотр процента сжатия и числа сброшенных страниц (pool_total_size, reject_pool_limit):
cat /sys/kernel/debug/zswap/reject_pool_limit
cat /sys/kernel/debug/zswap/stored_pagesСценарий 2: Увеличение лимита памяти для zswap пула
Увеличьте максимальный процент памяти, выделяемый под zswap (например, до 40%):
# Увеличение лимита пула на лету:
echo 40 | sudo tee /sys/module/zswap/parameters/max_pool_percent
# Закрепление в параметрах загрузки ядра GRUB (/etc/default/grub):
GRUB_CMDLINE_LINUX="zswap.enabled=1 zswap.max_pool_percent=40"
sudo update-grubСценарий 3: Переход на эффективный аллокатор z3fold и быстрый компрессор ZSTD
Аллокатор z3fold упаковывает до трех сжатых страниц в одну физическую, а алгоритм zstd дает максимальный коэффициент сжатия:
# Настройка параметров модуля zswap:
echo zstd | sudo tee /sys/module/zswap/parameters/compressor
echo z3fold | sudo tee /sys/module/zswap/parameters/zpool
# Включение вытеснения самых старых страниц (LRU reject):
echo 1 | sudo tee /sys/module/zswap/parameters/accept_threhsold_percentITSTM выполнит тонкую настройку подсистем Zswap/Zram, тюнинг агрессивности vm.swappiness и обеспечит высокую отзывчивость системы при нехватке RAM.
Частые вопросы (FAQ)
Чем zswap отличается от zram?
zram создает в памяти виртуальное блочное устройство swap, не требующее физического диска (при переполнении процесс убивается OOM). zswap работает как кэш поверх реального дискового swap-раздела: если сжатый пул zswap заполняется, страницы прозрачно сбрасываются на физический диск.
Почему компрессор LZ4 предпочтительнее ZSTD на нагруженных CPU?
LZ4 потребляет минимум процессорных тактов на декомпрессию, снижая накладные расходы ядра, тогда как ZSTD сжимает лучше на 10–15%, но создает большую нагрузку на CPU.
Как отключить zswap, если используется zram?
Использовать zswap и zram одновременно крайне не рекомендуется. Отключите zswap командой: echo 0 | sudo tee /sys/module/zswap/parameters/enabled.
Что показывает метрика pool_limit_hit?
Она показывает суммарное число страниц, которые zswap отказался сжимать из-за достижения max_pool_percent, отправив их напрямую на диск.