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

Неравномерная загрузка диска с файловой системой mdadm RAID5 и ext4 с журналом

Недавно я создал RAID5 с mdadm:

mdadm --create /dev/md0 -l 5 -n 4 -c 512 /dev/sdb /dev/sdc /dev/sdd /dev/sde

Обычная настройка для ускорения начальной синхронизации:

echo 32768 > /sys/block/md0/md/stripe_cache_size

Затем я оставил его в покое, чтобы завершить синхронизацию.

Затем я создал и настроил файловую систему на устройстве, оптимизированную для нескольких огромных файлов:

mke2fs -t ext4 -e remount-ro -Elazy_journal_init=0,lazy_itable_init=0,stride=128,stripe_width=384 -i 524288 /dev/md0
tune2fs -r0 -c0 -i12m -o ^acl,journal_data_writeback,nobarrier /dev/md0

Я принудительно записал структуру данных ext4 в mkfs-time, чтобы предотвратить ложные тесты из-за фоновой инициализации. Варианты от /etc/mke2fs.conf взяты из Debian 9 и не затронуты мной.

Затем я смонтировал эту файловую систему:

mount -o mand,nodev,stripe=1536,delalloc,auto_da_alloc,noatime,nodiratime /dev/md0 /mnt

Пока все хорошо.

Когда я записываю (большие) файлы в эту файловую систему, iostat -x 2 показывает, что один диск загружен на 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.00     0.00   73.50  539.00   294.00  2155.25     8.00   146.37  238.01  188.30  244.79   1.63 100.00
sdc               0.00     0.00    4.50  545.00    18.00  2179.25     8.00     2.92    5.31    3.56    5.32   0.08   4.40
sdd               0.00     0.00    2.50  545.50    10.00  2181.25     8.00     2.90    5.30    4.00    5.31   0.09   4.80
sde               0.00     0.00   33.50  514.50   134.00  2057.25     8.00     2.96    5.39    0.12    5.74   0.07   4.00
md0               0.00     0.00    0.00   67.50     0.00 56740.00  1681.19     0.00    0.00    0.00    0.00   0.00   0.00

Когда я делаю все эти шаги снова, но не веду журнал (mke2fs -O^has_journal в качестве дополнительного параметра) нагрузка на диск распределяется равномерно по всем дискам. Так что, похоже, журнал не разлетелся по дискам.

Как я могу извлечь выгоду из журнала, сохранив при этом возможность увеличения скорости за счет равномерной загрузки всех дисков (более или менее)? Возможно ли это даже при принудительном перемещении всех данных через журнал с помощью journal_data_writeback?

Я думал об экстернализации журнала, но где мне его разместить? RAM-диск непостоянен, не годится. Несколько лет назад были настоящие твердотельные диски на основе DRAM с доступным резервным аккумулятором, но, похоже, все они были заменены SSD-носителями на основе флэш-памяти. DRAM не имеет недостатков при загрузке, в основном ориентированной на запись.

Приложение: размер журнала на диске составляет 1024 МБ, согласно Эта статья. Таким образом, очевидно, что это не должно быть проблемой местности, учитывая только размер.

Из параметра полосы, который вы дали mke2fs и mdadm, видно, что размер вашего блока, который вы указали, равен 512 КБ. Проблема, которую вы видите, заключается в том, что, пока журнал распределен по всем дискам (он будет где-то от 128 МБ до 1024 МБ в зависимости от размера вашей файловой системы), объем данных, который необходимо записать в журнал при каждой фиксации не будет очень большой. Обычно это всего лишь несколько блоков; может быть, несколько десятков, максимум, для рабочей нагрузки последовательной записи. Проблема в том, что эти записи должны синхронно записываться на диск при каждой фиксации, что по умолчанию происходит каждые пять секунд (что означает, что после сбоя вы потеряете не более 5 секунд обновлений mdatadata). Предположим, что средний размер транзакции составляет 8 блоков. Это означает, что потребуется 16 коммитов или 80 секунд, прежде чем синхронный журнал перейдет на следующий диск, а затем который диск будет получать все синхронные обновления.

Однако происходит кое-что еще. Средний размер запроса для все ваших дисков (sdb..sde) составляет 8 секторов или 4k. Средний размер запроса в устройство md0 - 840k, что неплохо, но не огромно. По какой-то причине эти записи разбиваются на ~ 500 крошечных записей размером 4К, прежде чем они будут отправлены на ваши диски. Это самая большая проблема, и использование большого размера блока, вероятно, вредит, а не помогает.

Какие диски вы используете и как они подключены к вашей системе? Исправить это будет самым большим, что вы можете сделать, чтобы помочь.

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