Table of Contents

Тюнинг XigmaNAS на слабом железе

Тонкие настройки производительности на старом железе.

Профиль машины: 2 ядра CPU ~1.3 ГГц, 4 ГБ RAM, 4 механических диска в пуле ZFS raidz1, загрузка с USB-флешки.

ZFS: ARC

# loader.conf
vfs.zfs.arc_max=1G

ARC по умолчанию растёт до ~половины RAM — на 4 ГБ это неприемлемо, конкурирует за память с остальными сервисами. Дальнейшее занижение ниже 1G не имеет смысла — теряется эффективность кэша без ощутимого выигрыша в свободной памяти.

ZFS: primarycache по датасетам

Датасет primarycache Причина
pool root metadata директории/ACL, выигрывает вся файловая иерархия, включая SMB
датасет с активно перечитываемыми данными all (local override) реальный выигрыш от кэша данных
датасет с данными “пишем раз — не перечитываем” (архив бэкапов, транзитное шифрованное хранилище) metadata не вытеснять из маленького ARC то, что реально нужно
zfs set primarycache=metadata tank
zfs set primarycache=all tank/active_data

ZFS: датасет под backup-репозиторий

Параметр Значение Причина
compression off бэкап уже сжат средствами клиента резервного копирования
recordsize 1M крупные последовательные файлы — меньше метаданных/чек-сумм на объём
logbias throughput приоритет пропускной способности при больших последовательных записях
primarycache metadata данные пишутся раз, почти не перечитываются

ZFS: датасет с зашифрованным транзитным содержимым

`compression=off` — если через датасет проходят уже зашифрованные блоки (см. статью про Syncthing, тип папки receive-encrypted): зашифрованные данные несжимаемы, попытка сжатия — чистые потери CPU.

ZFS: общие дешёвые тюнинги

zfs set xattr=sa redundant_metadata=most tank

Своп

Не на USB-флешку (загрузочный носитель): медленно под нагрузкой, ограниченный ресурс перезаписи флеш-памяти (свопинг ускоряет деградацию носителя, который одновременно и загрузочный).

Не на zvol ZFS-пула: запись в своп идёт через ZFS-стек, которому самому нужна память на I/O (ARC, транзакционные группы) — риск дедлока под давлением памяти.

Правильный вариант — raw-разделы (не zvol), собранные в RAID0 через `gstripe`, мимо ZFS-стека целиком:

Механизма создания разделов в GUI нет, поэтому нужно работать через CLI:

gpart add -t freebsd-swap -a 1m -s 2g -l swap0 ada0
gpart add -t freebsd-swap -a 1m -s 2g -l swap1 ada1
gpart add -t freebsd-swap -a 1m -s 2g -l swap2 ada2
gpart add -t freebsd-swap -a 1m -s 2g -l swap3 ada3
gstripe label -v swap0 /dev/ada0p2 /dev/ada1p2 /dev/ada2p2 /dev/ada3p2

Регистрация в XigmaNAS: System → Advanced → Swap, Type = Device, Device = `/dev/stripe/swap0`.

Ограничение ZFS raidz: ужать раздел под живым raidz-vdev нельзя (расширение поддерживается — RAIDZ expansion, обратная операция нет). Разметку под своп на тех же дисках, что и raidz-пул, закладывать заранее при создании пула — иначе единственный путь получить место под неё, это пересоздать пул.

Объём: ориентир “2× RAM” для legacy-железа; если нужен kernel core dump — своп не меньше объёма RAM.

Проверка: конфиг ≠ реальность

Значение в GUI/loader.conf/sysctl.conf не гарантированно применяется на живой системе. Встречается:

Проверка: `sysctl <параметр>` на живой системе после любой правки loader.conf/sysctl.conf — не доверять только факту наличия строки в конфиге.

Расписание акустики дисков

AAM (Automatic Acoustic Management), уровень 1–127: 1 — минимальный шум, 127 — максимальная производительность/шум.

ataidle /dev/ada0          # проверка поддержки и текущего значения
ataidle -A 1 /dev/ada0     # тихий режим
ataidle -A 127 /dev/ada0   # полная производительность

Расписания в GUI нет — через cron:

0 23 * * * root for d in ada0 ada1 ada2 ada3; do /usr/local/sbin/ataidle -A 1 /dev/$d; done
0 6  * * * root for d in ada0 ada1 ada2 ada3; do /usr/local/sbin/ataidle -A 127 /dev/$d; done

Параметры, оставленные без изменений

Параметр Значение Причина не менять
APM диска максимальная производительность сервер с бэкапами, экономия питания не приоритет
HDD standby timer задаётся в минутах, не в секундах при частом фоновом обращении к дискам (мониторинг раз в несколько минут) порог простоя физически не достигается
Power Mode CPU adaptive не проседает на всплесках нагрузки (в отличие от minimum), не расходует лишнее (в отличие от maximum)