Назад | Перейти на главную страницу

OpenZFS на проблеме производительности набора данных файловой системы OSX

tl; dr - Мой массив ZFS RAIDZ2 читает со скоростью 7,5+ ГБ / с и записывает со скоростью 2,0+ ГБ / с, когда я указываю bs=128K или больше с dd. OS X предполагает 1 КБ (согласно stat -f %k .) и все мои это ~ 300 МБ / с; dd дает такую ​​же производительность с bs=1k. Даже bs=4k дает 1,1 ГБ / с с dd.

Что я могу сделать, чтобы улучшить общий ввод-вывод как минимум до 1 ГБ / с?

-

Подробности:

Я использую 16-дисковый SATA3 RAIDZ2 OpenZFS в файловой системе OSX (v1.31r2) (v5000) через Thunderbolt 2 (близнец Areca 8050T2) на 12-ядерный Mac Pro объемом 64 ГБ.

Файловая система ZFS была создана с ashift=12 (Жесткие диски расширенного формата с блоками по 4096 байт) и recordsize=128k.

Я вижу скорость передачи около 300 МБ / с из массива в OS X и из терминала с использованием команд по умолчанию (копируемый файл заметки - это 10 ГБ случайных данных):

Обычная копия:

Titanic:lb-bu admin$ time cp big-test.data /dev/null

real    0m23.730s
user    0m0.005s
sys     0m12.123s

≈ 424 МБ / с

-

dd с участием bs=1k:

Titanic:lb-bu admin$ time dd if=./big-test.data of=/dev/null bs=1024
9841180+0 records in
9841180+0 records out
10077368320 bytes transferred in 32.572506 secs (309382653 bytes/sec)

real    0m32.575s
user    0m1.880s
sys     0m30.695s

≈ 309 МБ / с

-

dd с участием bs=4k

Titanic:lb-bu admin$ time dd if=./big-test.data of=/dev/null bs=4096
2460295+0 records in
2460295+0 records out
10077368320 bytes transferred in 8.686014 secs (1160183301 bytes/sec)

real    0m8.688s
user    0m0.460s
sys     0m8.228s

≈1,16 ГБ / с

- dd с участием bs=2m:

Titanic:lb-bu admin$ time dd if=./big-test.data of=/dev/null bs=2m
4805+1 records in
4805+1 records out
10077368320 bytes transferred in 1.162891 secs (8665788130 bytes/sec)

real    0m1.165s
user    0m0.003s
sys     0m1.162s

≈8,67 ГБ / с

-

OS X's read of the boot drive optimal I/O block size (1TB SSD, HFS+):
Titanic:lb-bu admin$ stat -f %k /
4096

-

OS X's read of the array's optimal I/O block size (16-drives RAIDZ2, ZFS):
Titanic:lb-bu admin$ stat -f %k .
1024

-

Я также создал том ZFS в пуле рядом с файловой системой и отформатировал его как HFS +. У меня такая же производительность, как и выше.

Я бегаю на ~ 20-30 раз ниже оптимального! Что мне не хватает? Любые идеи?

-

Обновление: высокие скорости были кэшированы вводом-выводом (спасибо @yoonix). Скорость ≈300 МБ / с все еще кажется слишком низкой для этого оборудования.

@qasdfdsaq: загрузка ЦП во время ввода-вывода незначительна (все ядра <5%).

zfs получает весь вывод:

NAME            PROPERTY               VALUE                    SOURCE
lb-bu           type                   filesystem               -
lb-bu           creation               Tue Sep 30 16:41 2014    -
lb-bu           used                   36.8T                    -
lb-bu           available              10.0T                    -
lb-bu           referenced             138M                     -
lb-bu           compressratio          1.00x                    -
lb-bu           mounted                yes                      -
lb-bu           quota                  none                     default
lb-bu           reservation            none                     default
lb-bu           recordsize             128K                     default
lb-bu           mountpoint             /Volumes/lb-bu           local
lb-bu           sharenfs               off                      default
lb-bu           checksum               on                       default
lb-bu           compression            lz4                      local
lb-bu           atime                  on                       default
lb-bu           devices                on                       default
lb-bu           exec                   on                       default
lb-bu           setuid                 on                       default
lb-bu           readonly               off                      default
lb-bu           zoned                  off                      default
lb-bu           snapdir                hidden                   default
lb-bu           aclmode                discard                  default
lb-bu           aclinherit             restricted               default
lb-bu           canmount               on                       default
lb-bu           xattr                  on                       default
lb-bu           copies                 1                        default
lb-bu           version                5                        -
lb-bu           utf8only               on                       -
lb-bu           normalization          formD                    -
lb-bu           casesensitivity        insensitive              -
lb-bu           vscan                  off                      default
lb-bu           nbmand                 off                      default
lb-bu           sharesmb               off                      default
lb-bu           refquota               none                     default
lb-bu           refreservation         none                     default
lb-bu           primarycache           all                      default
lb-bu           secondarycache         all                      default
lb-bu           usedbysnapshots        0                        -
lb-bu           usedbydataset          138M                     -
lb-bu           usedbychildren         36.8T                    -
lb-bu           usedbyrefreservation   0                        -
lb-bu           logbias                latency                  default
lb-bu           dedup                  off                      default
lb-bu           mlslabel               none                     default
lb-bu           sync                   standard                 default
lb-bu           refcompressratio       1.01x                    -
lb-bu           written                138M                     -
lb-bu           logicalused            36.8T                    -
lb-bu           logicalreferenced      137M                     -
lb-bu           snapdev                hidden                   default
lb-bu           com.apple.browse       on                       default
lb-bu           com.apple.ignoreowner  off                      default
lb-bu           com.apple.mimic_hfs    off                      default
lb-bu           redundant_metadata     all                      default
lb-bu           overlay                off                      default

Вы не разместили zpool status для этого, но вы подразумеваете в сообщении, что все 16 дисков находятся в одном vdev в RAIDZ2. Хотя это хорошая и безопасная конфигурация, вы должны понимать, что RAIDZ не предназначен в первую очередь для скорости. Он разработан, чтобы быть почти пуленепробиваемым. RAIDZ2 аналогичен RAID6, но у этого варианта есть функции, которые делают его медленнее и безопаснее.

Видеть это хорошо написать для получения полной информации, но эти две цитаты должны помочь вам разобраться в проблеме (выделено мной):

При записи в RAID-Z vdev каждый блок файловой системы разделяется на свою собственную полосу между (потенциально) всеми устройствами RAID-Z vdev. Это означает, что каждый ввод-вывод записи должен будет ждать, пока все диски в RAID-Z vdev закончат запись. Следовательно, с точки зрения отдельного приложения, ожидающего завершения ввода-вывода, вы получите производительность записи в IOPS самого медленного диска в RAID-Z vdev.

При чтении из RAID-Z vdev применяются те же правила, поскольку процесс по существу обратный (нет ярлыка циклического перебора, как в случае зеркалирования): лучшая пропускная способность, если вам повезет (и читайте так же, как вы написали) и производительность чтения с одного диска в секунду в большинстве важных случаев.

Фактически, у вас есть 16 среднескоростных дисков, и для каждого прохода записи вы ждете, пока все 16 дисков не проверятся контроллером, и говорите «готово» перед началом следующей записи. С 16 дисками вы фактически всегда будете ждать почти полного вращения диска перед одной из операций записи, так что вас задерживают физика и то, как ZFS фиксирует данные.

Задача записи одного процесса / потока - не лучший вариант для ZFS в целом. Одновременное выполнение нескольких задач чтения / записи небольших данных может показать вам более высокие показатели IOPS, но я думаю, что физика ZFS - ваша основная проблема.

Если вы готовы пожертвовать пространством, зеркальное отображение, вероятно, будет быстрее. Вы также можете немного повысить производительность ZFS, создав в пуле 2 8-дисковых RAIDZ2 vdev вместо 1 16-дискового RAIDZ2 vdev. Это тоже будет стоить вам полезного пространства для хранения, но может помочь совершить коммиты быстрее.

К сожалению, у меня для вас нет хороших новостей.