ZFS, це як FreeBSD, з базовими налаштуваннями її мало хто використовує. І є люди, які незаслужено її звинувачують у тому, що вона повільна. Так, в default конфігурація вона не швидка (в першу чергу створювалася не для швидкості, а для стабільності). Почнемо з простих і далі будемо рухатися до більш складних:
zfs set atime=off rpool/fs
Відключає постійне оновлення atime для файлів. Якщо ви його не використовуєте, то немає сенсу кожен раз витрачати ресурси для його оновлення
zfs set compression=lz4 rpool/fs
Вмикає компресію. Найбільш оптимальним з точки зору продуктивності є lz4. Але, якщо треба більше компресія з трохи більшими витратами на ресурси, то можна і виставити gzip-7.
zfs set sync=disabled rpool/fs
Відключає виконання sync() (так званий software flush), замість цього просто відповідає, що sync() виконаний успішно. Зазвичай, відключення цього параметру несе ризик втрати даних за останні 5 секунд.
zfs set logbias=throughput rpool/fs
Вказує на те, що не використовувати окремі диски для log’y транзакцій і оптимізує для того, щоб використовувати один диск і для даних і для журналу транзакцій. В 99% це так.
zfs set recordsize=X rpool/fs
Тут треба правильно вказати розмір блоку запису. Якщо вказати занадто малий, то буде більше транзакцій записати один і той же обʼєм даних. Якщо вказати занадто великий, то швидко буде закінчуватися місце для дуже маленьких файлів. Ще важливий момент для переповнених пулів, де вільного місця менше 10-15%: як не дивно, то треба трохи зменшувати значення, бо з кожною транзакцією ZFS буде все важче і важче знайти цілий вільний великий блок. Тобто, якщо у вас було recordsize=1M, то виставивши recordsize=512K, можна покращити роботу. Тут немає єдиної рекомендації, але можу сказати з досвіду, що інколи доводилося зменшувати в 4 рази recordsize, допоки ZFS не почала працювати краще.
zfs_nocacheflush = 1
Відключає виконання flush зі сторони дисків (так званий hardware flush). Ризики ті самі, якщо у вас немає BBU в дисковому контролері.
zfs_prefetch_disable = 1
Якщо у вас з диску читання даних довільне (а в 99% воно так і), то це допоможе не сканувати диски кожен раз і не “вгадувати” майбутні дані для віддачі.
zfs_txg_timeout
zfs_txg_synctime_ms
zfs_ssd_txg_synctime_ms
Ці параметри кажуть, скільки часу може бути відкрита група транзакцій (txg) перед тим, як записатися на диск. За замовчуванням це 5 сек. тобто, кожні 5 секунд на диск щось пишеться. Є відповідний параметр і для SSD. Можна збільшувати в 2-10 разів для того, щоб відчути різницю.
zfs_read_chunk_size
Який розмір чанку будет читатися за 1 раз. Дуже корисний параметр для SSD, коли треба пришвидшити читання з диску, який 99% не навантажений. Можна збільшувати в 2-10 разів для того, щоб відчути різницю.
zfs_vdev_max_pending
Аналогічно попередьому параметру, але збільшує кількість одночасних запитів до одного пристрою (HDD). Можна збільшувати в 2-10 разів для того, щоб відчути різницю.
Корисні посилання:
https://blogs.oracle.com/solaris/post/128k-suffice
https://blogs.oracle.com/solaris/post/dedup-performance-considerations