TL;DR: Выключить l2arc_noprefetch, увеличить в 16 раз l2arc_write_max и l2arc_write_boost, обновить версию
1. Включаем упреждающее чтение из кеша:
# echo 0 > /sys/module/zfs/parameters/l2arc_noprefetch
В моём случае увеличило скорость чтения в 4 раза.
Чтобы сохранилось и после ребута:
# echo "options zfs l2arc_noprefetch=0" >> /etc/modprobe.d/zfs.conf
2. Увеличиваем скорость наполнения кеша в 16 раз:
# echo 134217728 > /sys/module/zfs/parameters/l2arc_write_max # echo 134217728 > /sys/module/zfs/parameters/l2arc_write_boost
Чтобы сохранилось и после ребута:
# echo "options zfs l2arc_write_max=134217728" >> /etc/modprobe.d/zfs.conf # echo "options zfs l2arc_write_boost=134217728" >> /etc/modprobe.d/zfs.conf
При дефолтном значении данные в кеш пишутся слишком медленно, намного медленнее, чем читаются с HDD. В результате для того, чтобы файл закешировался целиком, его надо прочитать несколько раз. И только после этого можно будет насладиться скоростью чтения, близкой к скорости SSD.
3. Обновляем ZFS до 0.7.12
У меня debian 9 и в его репозитарии последняя версия zfs 0.6.5 Поэтому подключаем backports и ставим оттуда:
# echo deb http://ftp.us.debian.org/debian/ stretch-backports main non-free contrib >> /etc/apt/sources.list # echo deb-src http://ftp.us.debian.org/debian/ stretch-backports main non-free contrib >> /etc/apt/sources.list # apt update # apt install linux-headers-$(uname -r) # apt -t stretch-backports install zfs-dkms zfsutils-linux
В моём случае скорость чтения из кеша подросла еще в 2,3 раза.
И еще немного мыслей про SSD и кеш.
Встречал упоминание, что l2arc надо делать в 4 раза больше, чем выделено в оперативной памяти под arc (zfs_arc_max). Аргументом было то, что чем больше l2arc, тем больше займет в памяти таблица с его индексами. Хранится эта таблица в том же месте, которое выделено под arc, а значит будет заметная потеря производительности при слишком большом l2arc. Провёл эксперимент: при zfs_arc_max=8Gb и кеше размером 1Tb, в этом кеше оказалось съедено 407Gb (примерно в 50 раз больше, чем zfs_arc_max). Файлы из кеша читались на скорости 650 мб/с. Вероятно, рекомендации по ограничению l2arc были написаны теми людьми, которые не знают про l2arc_noprefetch.
Кроме кеша на чтение (l2arc) можно сделать и кеш на запись (log). Работает этот кеш только для синхронной записи. Предположил, что если подцепить к виртуальной машине диск с опцией cache=sync, то все операции записи этой виртуальной машины будут идти через SSD-кеш. Так и оказалось. Но скорость записи не поднималась выше 60 мб/с, что ниже скорости записи и на SSD и на HDD.