Как правильно настроить этот пул ZFS?
Описание: Я установил массив RAIDZ из 4 жестких дисков с двумя кеш-накопителями SSD, и я не получаю ожидаемых результатов в увеличении кеша и общей производительности. Кроме того, некоторые вещи, похоже, не складываются.
Предпосылки и конфигурация: я настраиваю аналитическую рабочую станцию для исследований: Ryzen 7 1800X, 64 ГБ ECC RAM, GFX 1080Ti, Tesla K40 (спасибо за это, NVIDIA). Он настроен на общее назначение, будут производиться вычисления для ЦП и ГП, а некоторые наборы данных состоят из очень больших файлов (50-100 файлов, 10-30 ГБ каждый). Из-за распараллеливания, некоторые из них будут доступны одновременно. Существуют задания с интенсивным использованием ОЗУ, но не все они выполняются, поэтому существуют ситуации, когда ZFS будет иметь достаточно ОЗУ, но не всегда (5-10 ГБ для 500 ГБ, описанных ниже, было бы неплохо, однако).
У меня есть 2x 2 ТБ SDD (Samsung 850 Evo) и 4x 8 ТБ HDD (WD Red). 3,5 ТБ SDD будут RAID0, оставшиеся 2*250 ГБ могут быть использованы в качестве кеша для ZFS. Для первого теста я добавил их как два кеширующих устройства для RAIDZ на 4 жестких диска.
Вот макет:
# zpool status -v [sudo] пароль для администратора: пул: данные состояние: онлайн сканирование: ни один не запрашивается конфигурации: НАИМЕНОВАНИЕ ГОСУДАРСТВЕННОЙ ЧИТАЙТЕ НАПИСАТЬ CKSUM данные онлайн 0 0 0 raidz1-0 ОНЛАЙН 0 0 0 ata-WDC_WD80EFZX-68UW8N0_VJGSE7NX ONLINE 0 0 0 ata-WDC_WD80EFZX-68UW8N0_VJGSDP4X ОНЛАЙН 0 0 0 ata-WDC_WD80EFZX-68UW8N0_VJGSBYHX ONLINE 0 0 0 ata-WDC_WD80EFZX-68UW8N0_VJGSDDAX ONLINE 0 0 0 кэш ata-Samsung_SSD_850_EVO_2TB_S2RMNX0HC00789R-part1 ОНЛАЙН 0 0 0 ata-Samsung_SSD_850_EVO_2TB_S2RMNX0HC00792H-part1 ОНЛАЙН 0 0 0
Измерения и выходные данные команды: я сгенерировал случайный файл (чтобы обойти проблемы со сжатием) с довольно хорошей производительностью:
# dd if=<(openssl enc -aes-256-ctr -pass pass:"$(dd if=/dev/urandom bs=128 count=1 2>/dev/null | base64)" -nosalt < /dev/zero) of=filename bs=1M count=100000 iflag=fullblock
100000+0 records in
100000+0 records out
104857600000 bytes (105 GB, 98 GiB) copied, 199,795 s, 525 MB/s
Теперь я ожидал, что этот файл попадет в мой кэш (l2arc, AFAIU), если к нему часто обращаются. Однако этого не происходит (очень эффективно):
for i in 1 2 3 4;do dd if=filename of=/dev/null bs=1M iflag=fullblock;done
100000+0 records in
100000+0 records out
104857600000 bytes (105 GB, 98 GiB) copied, 252,751 s, 415 MB/s
100000+0 records in
100000+0 records out
104857600000 bytes (105 GB, 98 GiB) copied, 215,769 s, 486 MB/s
100000+0 records in
100000+0 records out
104857600000 bytes (105 GB, 98 GiB) copied, 227,668 s, 461 MB/s
100000+0 records in
100000+0 records out
104857600000 bytes (105 GB, 98 GiB) copied, 224,469 s, 467 MB/s
Вопросы:
Почему скорость чтения ниже, чем производительность записи? Не должны ли записи сходиться со скоростью 3 диска и считывать со скоростью 4 диска, как RAID5?
Почему не пинает l2arc? После многократного чтения без чтения других данных я бы ожидал, что скорость чтения будет равна 1 ГБ / с SSD RAID0.
Почему zpool iostat сообщает о такой низкой пропускной способности чтения для отдельных устройств? Я запускал это несколько раз (это из последнего запуска), и это всегда похоже. Жесткие диски для for просто добавляют до ~160 МБ / с, в то время как dd сообщает о более чем 400 МБ / с:
# zpool iostat -v пропускная способность операций пропускная способность пул распределять бесплатно читать писать читать -------------------------------------------------- - ----- ----- ----- ----- ----- ----- данные 136G 28,9T 1,31K 152 167M 14,9M raidz1 136G 28,9T 1,31K 152 167M 14,9M ata-WDC_WD80EFZX-68UW8N0_VJGSE7NX - - 571 66 46,0M 5,18M ata-WDC_WD80EFZX-68UW8N0_VJGSDP4X - - 445 59 44,9M 5,18M ata-WDC_WD80EFZX-68UW8N0_VJGSBYHX - - 503 66 40,2M 5,18M ata-WDC_WD80EFZX-68UW8N0_VJGSDDAX - - 419 62 39,4M 5,18M кеш - - - - - - ata-Samsung_SSD_850_EVO_2TB_S2RMNX0HC00789R-part1 34,0G 216G 1 266 8,23K 33,1M ata-Samsung_SSD_850_EVO_2TB_S2RMNX0HC00792H-part1 34,0G 216G 1 266 7,80K 33,0M --------------------------------------------------- ----- ----- ----- ----- ----- -----
Здесь что-то в корне не так, или я что-то не так понял? Должен ли я использовать часть SSD для ZIL? Я мог бы также сэкономить несколько десятков ГБ от SSD OS M.2 для этого. По крайней мере, если я смогу добавить устройство LVM, так как сейчас все это требует установки Kubuntu. Я еще этого не сделал, потому что понял, что это поможет только с небольшими синхронизированными записями, чего я не ожидаю. В основном, большая дата будет записана обратно поочередно.
PS: почему кеш выглядит как пул с именем кеш, а не как то, что принадлежит данным пула? я использовал
zpool add data cache [devices]
так что это должно принадлежать пулу данных, не так ли?
1 ответ
Производительность RAIDZ1 по сравнению с обычным RAID5
Почему у меня меньше чтения, чем записи? Не должны ли записи сходиться со скоростью 3 диска и считывать со скоростью 4 диска, как RAID5?
Смотрите эту тему на ServerFault:
RAIDZ с одним диском четности даст вам производительность IOPS для одного диска, но в n-1 раз совокупную пропускную способность одного диска.
И этот комментарий:
У меня есть значительный опыт в этом, и я могу подтвердить для вас, что в большинстве ситуаций RAIDZ НЕ собирается превзойти такое же количество дисков, добавленных в традиционный эквивалентный массив RAID5/6.
Ваши диски могут поддерживать около 145 МБ / с последовательно, поэтому ваши теоретические результаты должны быть 435 МБ / с. Я бы сказал, что это очень близко соответствует вашим результатам.
L2ARC кеш для последовательных чтений
Почему не пинает l2arc? После многократного чтения без чтения других данных я бы ожидал, что скорость чтения будет равна 1 ГБ / с SSD RAID0.
Взгляните на этот список рассылки:
Удовлетворяет ли ARC потребности в кэшировании?
а также
Пост Марти Скоулза Некоторые из чтений являются последовательными? Последовательные чтения не идут в L2ARC.
Итак, ваши основные причины:
- Ваша (случайная) нагрузка уже поступила из ARC, и L2ARC не нужен (поскольку ваши данные всегда были одинаковыми и могут полностью оставаться в ARC). Идея заключается в том, что ARC намного быстрее, чем L2ARC (RAM против SSD), поэтому ваш первый выбор для чтения всегда ARC, вам нужен L2ARC только потому, что ваши активные данные слишком велики для памяти, но произвольный доступ к диску слишком медленный при вращении диски.
- Ваш эталонный тест был последовательным по своей природе и, следовательно, не обслуживался L2ARC. Идея заключается в том, что последовательное чтение может отравить кеш, поскольку одно чтение большого файла полностью заполнит кеш и удалит миллионы маленьких блоков от других пользователей (ZFS оптимизирован для одновременного произвольного доступа многих пользователей), но не оказывает никакого влияния на Ваша скорость при первом чтении. При втором чтении это будет ускорено, но обычно вы не читаете большие файлы дважды. Может быть, вы можете изменить поведение с помощью настраиваемых файлов ZFS.
Различные вопросы
Должен ли я использовать часть SSD для ZIL?
Отдельное устройство SLOG поможет только для случайных синхронизированных записей, ничего больше. Чтобы проверить это, достаточно просто - установить свойство файловой системы для теста sync
в disabled
: zfs set sync=disabled pool/fs
Затем снова отметьте. Если ваша производительность сейчас неожиданно велика, вы выиграете. Если это не сильно изменится, вы не будете.
PS: почему кеш выглядит как пул с именем кеш, а не как то, что принадлежит данным пула?
Я думаю, что это так, потому что эти дополнительные устройства (запасные, кеши, слог устройства) могут также состоять из нескольких vdevs. Например, если у вас есть зеркальное слог-устройство, у вас будут те же 3 уровня, что и на обычном диске (log - mirror - disk1/disk2).