WWW.LUSHNIKOV.NET

linux

ZFS: как сделать L2ARC на SSD быстрее.

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.

Leave a Reply