
Пул состоит из двух HDD (WD Red 3 ТБ, 5200 об/мин?, максимальная скорость передачи 147 МБ/с и Verbatim (Toshiba) 3 ТБ, 7200 об/мин) в raidz1-0
конфигурации. Он имеет 2,25 ТБ данных, дублированных на двух дисках, так что общий объем составляет 4,5 ТБ. Когда я создавал пул, я не указал значение ashift
.
zpool status
показывает, что "сканирование: очистка исправлено 0 за 32ч43м с 0 ошибками в вс янв 3 13:58:54 2021". Это означает, что скорость сканирования была всего 4.5e6 / (32.717 * 60 * 60) = 38.2 MB / s
. Я бы ожидал не менее 2 x 100 или до 2 x 200 МБ/с, хотя диск WD несколько медленнее другого.
SMART-данные дисков показывают, что все в порядке. У них 6,5 - 7 лет времени работы, но количество стартов-остановок составляет всего около 200.
Итак, главный вопрос: Чем можно объяснить плохую успеваемость при чтении?
Странно zdb
показал, что пул использует путь, /dev/disk/by-id/ata-WDC_WD30EFRX-xyz-part1
а не /dev/disk/by-id/ata-WDC_WD30EFRX-xyz
. fdisk -l /dev/disk/by-id/ata-WDC_WD30EFRX-xyz
упоминает, что "Раздел 1 не начинается на границе физического сектора", но я читал, что это должно только ухудшить производительность записи. Я мог бы попробовать исправить это, удалив устройство и добавив его обратно с правильным полным путем к диску, поскольку данные дублируются (и резервируются).
В пуле 7,1 млн файлов. Я протестировал запуск sha1sum
на файле размером 14276 МБ после очистки кэшей через /proc/sys/vm/drop_caches
, это заняло 2 мин 41 с, установив скорость чтения в 88,5 МБ/с.
dd bs=1M count=4096 if=/dev/disk/by-id/ata-WDC_WD30EFRX-xyz of=/dev/null
сообщалось о скорости 144 МБ/с, при использовании ata-WDC_WD30EFRX-xyz-part1
сообщалось о 134 МБ/с и ata-TOSHIBA_DT01ACA300_xyz
сообщалось о 195 МБ/с.
На моем NAS установлены довольно старые версии программного обеспечения:
$ modinfo zfs
filename: /lib/modules/3.11.0-26-generic/updates/dkms/zfs.ko
version: 0.6.5.4-1~precise
license: CDDL
author: OpenZFS on Linux
description: ZFS
srcversion: 5FC0B558D497732F17F4202
depends: spl,znvpair,zcommon,zunicode,zavl
vermagic: 3.11.0-26-generic SMP mod_unload modversions
Он имеет 24 ГБ оперативной памяти, 8 ГБ из которых зарезервированы для JVM, но остальное свободно для использования. Хотя, похоже, не так уж много из этого свободно:
$ free -m
total used free shared buffers cached
Mem: 23799 21817 1982 0 273 1159
-/+ buffers/cache: 20384 3415
Swap: 7874 57 7817
Редактировать 1:
Я провел несколько тестов с bonnie++
использованием одного файла размером 4 ГБ на RAIDZ: запись 75,9 МБ/с, переписывание 42,2 МБ/с и чтение 199,0 МБ/с. Я предполагаю, что я правильно выполнил преобразование из "кило-символов / секунду".
Ах да, только сейчас я понял, что параллельная очистка занимает столько же времени, сколько и самый медленный диск на 5400 об/мин, и неважно, что диск на 7200 об/мин (возможно) очищался быстрее.
Редактировать 2:
Я уменьшил количество файлов в пуле с 7,1 млн до 4,5 млн (-36,6%), а время очистки сократилось с 32,72 часов до 16,40 часов (-49,9%). Объем данных тот же, поскольку я просто поместил эти небольшие файлы в ZIP-архив с низкой степенью сжатия.
Я также увеличил recordsize
с 128k до 512k, не знаю, имело ли это значение в данном случае. Другие ранее существовавшие данные не были затронуты, поэтому они сохранили исходный recordsize
. О, и /sys/module/zfs/parameters/zfs_scan_idle
был установлен на 2
.
решение1
Какую версию ZFS вы используете?
До 0.8.x выполняет очистку, проходя по всем метаданным и данным, так как они размещены на дисках. Это вызывает много операций поиска, которые убивают производительность на механических дисках. Если использовать с низкопроизводительными дисками 5K RPM, заполненными миллионами мелких файлов, это означает очень долгое время очистки/перезаполнения. С этими старыми версиями ZFS вы можете настроить некоторые параметры ZFS;например:
echo 0 > /sys/module/zfs/parameters/zfs_resilver_delay
echo 0 > /sys/module/zfs/parameters/zfs_scan_idle
Имейте в виду, что увеличение приоритета очистки приведет к снижению производительности приложения.
0.8.x использует подход пакетной очистки, когда метаданные собираются в более крупных пакетах, и только затем сканируются соответствующие данные. Это приводит к гораздо более быстрой (т. е. вдвое более быстрой) очистке, без необходимости что-либо настраивать (вышеуказанные ручки даже больше не присутствуют).
Поэтому более эффективным методом увеличения скорости очистки/восстановления серебра, вероятно, является обновление версии ZFS.