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

Медленное последовательное чтение из пула ZFS

У меня есть связанный с этой проблемой вопрос, но он стал слишком сложным и слишком большим, поэтому я решил разделить проблему на NFS и локальные проблемы. Я также без особого успеха пытался спросить об этом в списке рассылки zfs-обсуждения.

Медленное копирование между каталогами NFS / CIFS на одном сервере

Краткое описание: как я настроен и чего я ожидаю

  1. У меня есть пул ZFS с 4 дисками. 2 ТБ КРАСНЫЙ настроен как 2 зеркала с чередованием (RAID 10). В Linux - zfsonlinux. Нет устройств кеширования или журналов.
  2. Данные сбалансированы по зеркалам (важно для ZFS)
  3. Каждый диск может читать (raw w / dd) со скоростью 147 МБ / с параллельно, что дает общую пропускную способность 588 МБ / с.
  4. Я ожидаю около 115 МБ / с для записи, 138 МБ / с для чтения и 50 МБ / с для перезаписи последовательных данных с каждого диска, основываясь на тестах аналогичного КРАСНОГО диска 4 ТБ. Я ожидаю не менее 100 МБ / с для чтения или записи, поскольку в наши дни любой диск может это делать.
  5. Я думал, что увижу 100% использование ввода-вывода на всех 4 дисках при чтении или записи последовательных данных под нагрузкой. И что диски будут выдавать более 100 МБ / с при 100% использовании.
  6. Я думал, что пул даст мне примерно 2x скорость записи, 2x перезапись и 4x скорость чтения на одном диске - я ошибся?
  7. НОВАЯ Я думал, что zvol ext4 на том же пуле будет примерно на той же скорости, что и ZFS

Что я на самом деле получаю

Я считаю, что производительность чтения пула не так высока, как я ожидал

Бонни ++ тест пула несколько дней назад

Version  1.97       ------Sequential Output------ --Sequential Input- --Random-
Concurrency   1     -Per Chr- --Block-- -Rewrite- -Per Chr- --Block-- --Seeks--
Machine        Size K/sec %CP K/sec %CP K/sec %CP K/sec %CP K/sec %CP  /sec %CP
igor            63G    99  99 232132  47 118787  27   336  97 257072  22  92.7   6

Бонни ++ на отдельном диске RED емкостью 4 ТБ отдельно в zpool

Version  1.97       ------Sequential Output------ --Sequential Input- --Random-
Concurrency   1     -Per Chr- --Block-- -Rewrite- -Per Chr- --Block-- --Seeks--
Machine        Size K/sec %CP K/sec %CP K/sec %CP K/sec %CP K/sec %CP  /sec %CP
igor            63G   101  99 115288  30 49781  14   326  97 138250  13 111.6   8

В соответствии с этим скорости чтения и перезаписи являются подходящими на основе результатов для одного диска 4 ТБ RED (они двойные). Тем не менее, скорость чтения, которую я ожидал, составила бы около 550 МБ / с (в 4 раза больше, чем у диска 4 ТБ), и я бы по крайней мере надеялся на около 400 МБ / с. Вместо этого я вижу около 260 МБ / сек.

Бонни ++ на пуле прямо сейчас, пока мы собираем информацию ниже. Не совсем так, как раньше, и ничего не изменилось.

Version  1.97       ------Sequential Output------ --Sequential Input- --Random-
Concurrency   1     -Per Chr- --Block-- -Rewrite- -Per Chr- --Block-- --Seeks--
Machine        Size K/sec %CP K/sec %CP K/sec %CP K/sec %CP K/sec %CP  /sec %CP
igor            63G   103  99 207518  43 108810  24   342  98 302350  26 256.4  18

zpool iostat во время записи. Мне кажется, все в порядке.

                                                 capacity     operations    bandwidth
pool                                          alloc   free   read  write   read  write
--------------------------------------------  -----  -----  -----  -----  -----  -----
pool2                                         1.23T  2.39T      0  1.89K  1.60K   238M
  mirror                                       631G  1.20T      0    979  1.60K   120M
    ata-WDC_WD20EFRX-68AX9N0_WD-WMC300004469      -      -      0   1007  1.60K   124M
    ata-WDC_WD20EFRX-68EUZN0_WD-WCC4MLK57MVX      -      -      0    975      0   120M
  mirror                                       631G  1.20T      0    953      0   117M
    ata-WDC_WD20EFRX-68AX9N0_WD-WCC1T0429536      -      -      0  1.01K      0   128M
    ata-WDC_WD20EFRX-68EUZN0_WD-WCC4M0VYKFCE      -      -      0    953      0   117M

zpool iostat во время перезаписи. Мне кажется, все в порядке, думаю.

                                                 capacity     operations    bandwidth
pool                                          alloc   free   read  write   read  write
--------------------------------------------  -----  -----  -----  -----  -----  -----
pool2                                         1.27T  2.35T   1015    923   125M   101M
  mirror                                       651G  1.18T    505    465  62.2M  51.8M
    ata-WDC_WD20EFRX-68AX9N0_WD-WMC300004469      -      -    198    438  24.4M  51.7M
    ata-WDC_WD20EFRX-68EUZN0_WD-WCC4MLK57MVX      -      -    306    384  37.8M  45.1M
  mirror                                       651G  1.18T    510    457  63.2M  49.6M
    ata-WDC_WD20EFRX-68AX9N0_WD-WCC1T0429536      -      -    304    371  37.8M  43.3M
    ata-WDC_WD20EFRX-68EUZN0_WD-WCC4M0VYKFCE      -      -    206    423  25.5M  49.6M

Вот где мне интересно, что происходит

zpool iostat во время чтения

                                                 capacity     operations    bandwidth
pool                                          alloc   free   read  write   read  write
--------------------------------------------  -----  -----  -----  -----  -----  -----
pool2                                         1.27T  2.35T  2.68K     32   339M   141K
  mirror                                       651G  1.18T  1.34K     20   169M  90.0K
    ata-WDC_WD20EFRX-68AX9N0_WD-WMC300004469      -      -    748      9  92.5M  96.8K
    ata-WDC_WD20EFRX-68EUZN0_WD-WCC4MLK57MVX      -      -    623     10  76.8M  96.8K
  mirror                                       651G  1.18T  1.34K     11   170M  50.8K
    ata-WDC_WD20EFRX-68AX9N0_WD-WCC1T0429536      -      -    774      5  95.7M  56.0K
    ata-WDC_WD20EFRX-68EUZN0_WD-WCC4M0VYKFCE      -      -    599      6  74.0M  56.0K

iostat -x во время той же операции чтения. Обратите внимание на то, что IO% не равен 100%.

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sdb               0.60     0.00  661.30    6.00 83652.80    49.20   250.87     2.32    3.47    3.46    4.87   1.20  79.76
sdd               0.80     0.00  735.40    5.30 93273.20    49.20   251.98     2.60    3.51    3.51    4.15   1.20  89.04
sdf               0.50     0.00  656.70    3.80 83196.80    31.20   252.02     2.23    3.38    3.36    6.63   1.17  77.12
sda               0.70     0.00  738.30    3.30 93572.00    31.20   252.44     2.45    3.33    3.31    7.03   1.14  84.24

Настройки zpool и тестового набора данных:

  • время отключено
  • сжатие выключено
  • ashift равно 0 (автоматическое определение - я так понимаю, что это нормально)
  • zdb говорит, что все диски - ashift = 12
  • модуль - параметры zfs zvol_threads = 32 zfs_arc_max = 17179869184
  • синхронизация = стандарт

Редактировать - 30 октября 2015 г.

Я сделал еще несколько тестов

  • набор данных bonnie ++ с размером записи = 1M = 226MB запись, 392MB чтение намного лучше
  • набор данных dd с размером записи = 1M = 260 МБ на запись, 392 МБ на чтение намного лучше
  • zvol w / ext4 dd bs = 1M = 128MB запись, 107MB чтение почему так медленно?
  • набор данных 2 параллельно обрабатывается = 227 МБ на запись, 396 МБ на чтение
  • dd direct io ничем не отличается от набора данных и zvol

Мне гораздо больше понравилось исполнение с увеличенным размером записи. Практически каждый файл в пуле имеет размер более 1 МБ. Так что я оставлю это как есть. Диски по-прежнему не загружаются на 100%, что заставляет меня задуматься, может ли это быть намного быстрее. И теперь мне интересно, почему производительность zvol такая паршивая, если я (слегка) использую это.

Я рад предоставить любую запрошенную информацию в комментариях / ответах. В другом моем вопросе также есть масса информации: Медленное копирование между каталогами NFS / CIFS на одном сервере

Я полностью осознаю, что могу просто чего-то не понимать и это может не быть проблемой. Заранее спасибо.

Чтобы было понятно, вопрос: Почему пул ZFS не работает так быстро, как я ожидал? А может, что-то еще не так?

Мне удалось набрать скорость, очень близкую к ожидаемой.

Я искал 400 МБ / с и удалось 392 МБ / с. Итак, я говорю, что проблема решена. С последующим добавлением кэш-памяти мне удалось 458 МБ/ сек чтения (кажется, кешировано).

1. Сначала это было достигнуто простым увеличением набора данных ZFS. recordsize ценность для 1M

zfs set recordsize=1M pool2/test

Я считаю, что это изменение просто приводит к меньшей активности диска, а значит, более эффективному синхронному чтению и записи. Именно то, о чем я просил.

Результаты после изменения

  • bonnie ++ = 226 МБ для записи, 392 МБ для чтения
  • dd = 260 МБ для записи, 392 МБ для чтения
  • 2 процесса параллельно = 227 МБ на запись, 396 МБ на чтение

2. Мне удалось еще лучше, когда я добавил кэш-устройство (SSD на 120 ГБ). Запись немного медленнее, я не уверен, почему.

Version  1.97       ------Sequential Output------ --Sequential Input- --Random-
Concurrency   1     -Per Chr- --Block-- -Rewrite- -Per Chr- --Block-- --Seeks--
Machine        Size K/sec %CP K/sec %CP K/sec %CP K/sec %CP K/sec %CP  /sec %CP
igor            63G           208325  48 129343  28           458513  35 326.8  16

Уловка с кеш-устройством заключалась в том, чтобы установить l2arc_noprefetch=0 в /etc/modprobe.d/zfs.conf. Это позволяет ZFS кэшировать потоковые / последовательные данные. Делайте это только в том случае, если ваше кеш-устройство быстрее, чем ваш массив, например мой.

Воспользовавшись изменением размера записи в моем наборе данных, я подумал, что это может быть аналогичный способ справиться с низкой производительностью zvol.

Я встретил несколько человек, которые упомянули, что они добились хороших результатов, используя volblocksize=64k, поэтому я попробовал. Не повезло.

zfs create -b 64k -V 120G pool/volume

Но потом я прочитал, что ext4 (файловая система, с которой я тестировал) поддерживает такие параметры для RAID, как stride и stripe-width, которым я никогда раньше не пользовался. Поэтому я использовал этот сайт для расчета необходимых настроек: https://busybox.net/~aldot/mkfs_stride.html и снова форматировал звол.

mkfs.ext3 -b 4096 -E stride=16,stripe-width=32 /dev/zvol/pool/volume

Я побежал bonnie++ сделать простой тест, и результаты были отличными. К сожалению, у меня нет результатов, но, насколько я помню, они были как минимум в 5-6 раз быстрее для записи. Я обновлю этот ответ снова, если снова проведу тест.

Ваши результаты вполне разумны, а ваши ожидания - нет: вы преувеличиваете улучшение производительности чтения, которое дает RAID1 (и, соответственно, RAID10). Дело в том, что двухстороннее зеркальное отображение дает в большинстве В 2 раза выше скорость чтения / операций ввода-вывода в секунду по сравнению с одиночным диском, но реальная производительность может быть где-то между 1x-2x.

Поясним на примере. Представьте, что у вас есть система с двусторонним зеркалом, где каждый диск имеет скорость 100 МБ / с (последовательная) и 200 операций ввода-вывода в секунду. При глубине очереди 1 (максимум один невыполненный запрос) этот массив будет иметь нет Преимущество перед одним диском: RAID1 разделяет запросы ввода-вывода на очередь двух дисков, но это делает не разделить один запрос на два диска (по крайней мере, любая реализация, которую я видел, ведет себя таким образом). С другой стороны, если ваша очередь ввода-вывода больше (например, у вас есть 4/8 невыполненных запросов), общая пропускная способность диска будет значительно выше, чем у одного диска.

То же самое можно сделать и для RAID0, но в этом случае средние улучшения определяются не только размером очереди, но и Размер запроса ввода-вывода также: если ваш средний размер ввода-вывода меньше размера блока, то он будет не быть разбитым на два (или более) диска, но обслуживаться он будет одним. Ваши результаты с увеличенным размером записей Bonnie ++ демонстрируют точное поведение: чередование значительно выигрывает от большего размера ввода-вывода.

Теперь должно быть ясно, что объединение двух уровней RAID в массиве RAID10 будет не приводит к линейному масштабированию производительности, но устанавливает верхний предел для этого. Я почти уверен, что если вы запустите несколько экземпляров dd / bonnie ++ (или используете fio для непосредственного управления очередью ввода-вывода) вы получите результаты, более соответствующие вашим исходным ожиданиям, просто потому, что вы будете облагать налогом свой массив ввода-вывода более полным образом (несколько выдающихся последовательных / случайных запросов ввода-вывода), а не загружать его одиночными последовательными Только запросы ввода-вывода.