В ZFS существует такая полезная возможность, как предварительное чтение данных, оно же prefetch. При этом в ZFS реализовано предварительное чтение как на файловом, так и на блочном уровне. На системах под управлением FreeBSD по умолчанию prefetch включается если не используется i386 архитектура и на системе не менее 4Gb памяти. Если система не удовлетворяет этим условиям, система отключает prefetch со следующим сообщением:
ZFS NOTICE: Prefetch is disabled by default if less than 4GB of RAM is present;
to enable, add "vfs.zfs.prefetch_disable=0" to /boot/loader.conf.
И вот у меня нашлась система, удовлетворяющая обоим требованиям и на ней оказался включенным prefetch, и хотелось бы радоваться исчезновению уведомления, но...
В связи с особенностями работающего на этой системе программного обеспечения, основной создаваемой нагрузкой на дисковую подсистему является случайное чтение. Поэтому закономерно возник вопрос, а так ли хороша реализация prefetch в ZFS для этого самого случайного чтения?
Не смотря на заверения, что ZFS при включенном prefetch замечательно справляется и со случайным доступом, после ввода команды:
sysctl vfs.zfs.prefetch_disable=1
я смог заметить разницу даже по изменившемуся характеру звуков от HDD. А вывод gstat
показал падение средней занятости дисков с 22-24% до 11-14%.
Что наглядно показывает несовершенство работы prefetch в ZFS. Стоит отметить, что я далеко не первый, кто наступил на это несовершенство. Поэтому при использовании ZFS всё таки стоит задуматься о характере нагрузки и в некоторых случаях действительно может оказаться полезным отключение prefetch.
Отключения prefetch в FreeBSD рекомендуется делать через /boot/loader.conf
:
vfs.zfs.prefetch_disable="1"
А для Solaris он отключается в /etc/system
:
set zfs:zfs_prefetch_disable=1