ZFS медленно очищает два жестких диска

ZFS медленно очищает два жестких диска

Пул состоит из двух 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.

Связанный контент