Настройка ARC ZFS

ARC (Adaptive Replacement Cache, кэш адаптивной замены) – собственный эффективный механизм кеширования ZFS использующий достаточно сложные и эффективные алгоритмы. Основной смысл его работы – максимально исключить обращения к диску на чтение в пользу использования кешированных данных. И чем эффективнее работает ARC, чем больше попаданий в кеш, тем тяжелее становятся его элементы и тем труднее их из памяти вытеснить. В результате ZFS практически всегда будет занимать под ARC все доступное ей пространство. С одной стороны, это хорошо, но не будем забывать, что память – дорогой ресурс, а соверменные хранилища могут состоять из быстрых SSD или NVMe накопителей.

В большинстве случаев имеет смысл радикально ограничить ZFS в потреблении памяти, высвободив ее для виртуальных машин.

Классическая формула расчета предполагает:

1 ГБ для хоста + 1 ГБ на 1 ТБ хранилища

При этом не рекомендуется использовать значения кеша менее 3 ГБ.

Современные рекомендации предполагают большие размеры выделяемой памяти:

1 ГБ + 4-5 ГБ на 1 ТБ хранилища

А если вы используете дедупликацию, то:

1 ГБ + 5-6 ГБ на 1 ТБ хранилища

Исходя из этого и рекомендаций по минимальному размеру можно считать достаточно оптимальным значением для небольших хранилищ размер кеша 4 – 8 ГБ. Размер кеша ZFS задается в байтах и вычислить его можно по формуле:

N*1048576*1024

Где N – нужное значение в ГБ.

Чтобы добавить собственные настройки лимитов ARC создайте, если вы не сделали этого ранее, файл /etc/modprobe.d/zfs.conf и откройте его для редактирования. Все это можно сделать одной командой:

nano /etc/modprobe.d/zfs.conf

Если вы предпочитаете редактор mc, замените nano на mcedit. Если файл не существует, то он будет создан и открыт для редактирования, если существует – просто открыт для редактирования.

Теперь внесем в него следующие строки, задающие минимальный и максимальный размер кеша:

options zfs zfs_arc_min=4294967296 
options zfs zfs_arc_max=8589934592

Затем обновим образ начальной файловой системы:

update-initramfs -u

Если ваша система использует UEFI, то дополнительно выполните:

pve-efiboot-tool refresh

После чего выполните перезагрузку.

Результат обычно виден сразу и, что называется, невооруженным глазом.

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

Основные команды ZFS

Создать пул raidz:

$ zpool create -f -o ashift=12 tank raidz /dev/sda /dev/sdb /dev/sdc

Добавить диски в пул:

$ zpool add -f tank raidz /dev/sda /dev/sdb /dev/sdc
$ zpool attach tank /dev/sda /dev/sdb

Создать фс:

$ zfs create tank/storage

Включить сжатие:

$ zfs set compression=on tank/storage

Изменить точку монтирования:

$ zfs set mountpoint=/media/storage tank/storage

Добавить кэш диск l2arc:

$ zpool add tank cache /dev/sda -f

Добавить ZIL:

$ zpool add tank log /dev/sda -f

Если диск отпал (проблемы с кабелем) или специально его отключили можно подключить его обратно:

$ zpool online tank /dev/sda

Создать блочное устройство:

$ zfs create -V 5gb tank/vol