Как ограничить память ZFS (ARC)
ZFS держит в памяти кэш чтения — ARC (Adaptive Replacement Cache). Предел задаёт параметр zfs_arc_max в байтах. Например, 8 ГиБ — это 8 × 1024 × 1024 × 1024 = 8589934592 байт. Чтобы ограничить ARC навсегда, откройте файл настроек модуля. Установщик Proxmox VE 8.1 и новее мог уже записать в него предел (10 % памяти, не больше 16 ГиБ); если файла нет, nano создаст его при сохранении:
nano /etc/modprobe.d/zfs.confДобавьте или исправьте строку:
options zfs zfs_arc_max=8589934592Если система стоит на ZFS (установка с пулом rpool), обновите initramfs. Затем перезагрузите сервер:
update-initramfs -u -k all
rebootСразу, без перезагрузки
Предел можно поменять и на ходу — до следующей перезагрузки:
echo "$((8 * 1024*1024*1024))" > /sys/module/zfs/parameters/zfs_arc_maxКэш уменьшится не мгновенно: ZFS освобождает память постепенно. Чтобы предел сохранился после перезагрузки, всё равно нужна строка в /etc/modprobe.d/zfs.conf.
Сколько памяти занято сейчас
cat /sys/module/zfs/parameters/zfs_arc_max
arc_summary | head -n 30Первая команда показывает предел (0 значит «по умолчанию ZFS»), вторая — сводку кэша, в том числе его текущий размер.
Сколько оставить
- Новые установки Proxmox (с версии 8.1) сами ставят предел — 10 % памяти, но не больше 16 ГиБ. Более старые установки предела не задавали, и ZFS мог занять до половины памяти и больше.
- Документация советует не меньше 2 ГиБ плюс 1 ГиБ на каждый терабайт хранилища. Для пула в 8 ТиБ — около 10 ГиБ.
- Меньше 64 МиБ ZFS не принимает.
Слишком маленький кэш замедляет диски всех машин: ZFS чаще читает с дисков. Уменьшайте его, только если памяти действительно не хватает машинам.
«Занятая» кэшем память не потеряна: ARC отдаёт её, когда она нужна программам, хотя и не так быстро, как обычный кэш Linux. Высокая шкала памяти на странице узла при ZFS — не всегда беда.
Подводные камни
- Предел не применился. Если
zfs_arc_maxменьше или равенzfs_arc_min(по умолчанию 1/32 памяти), ZFS его игнорирует. На серверах с очень большой памятью задайте ещё иzfs_arc_minменьше предела — тем же способом, отдельной строкойoptions zfs zfs_arc_min=…. - Забыли initramfs. Если корень системы на ZFS, без
update-initramfs -u -k allновое значение после перезагрузки не подхватится. - Число с ошибкой. Значение — в байтах, без букв «G» и «M». Посчитать можно в оболочке:
echo $((8 * 1024*1024*1024)).