Заметки о программном RAID с помощью mdadm

Впервые опубликовано 2010-05-27.

Предыстория

После создания массива RAID5 из трёх двухтерабайтных дисков, я был неприятно удивлён низкой скорости записи на массив: всего 55 мбайт/сек. Пришлось поизучать, с помощью каких параметров можно добиться от массива нормальной производительности.

Дело оказалось в том, что

  • во-первых – выставляемое для массива по-умолчанию значение stripe_cache_size слишком мало;
  • во-вторых – массив я создал со внутренним Write Intent Bitmap (–bitmap=internal) и маленьким bitmap chunk.

После увеличения stripe_cache_size и размера bitmap chunk, скорость записи поднялась до 130-150 мбайт/сек. Подробности об этих и других параметрах читайте ниже.

Параметры, влияющие на производительность

stripe_cache_size

Значение по умолчанию – 256, диапазон от 32 до 32768, при этом увеличение хотя бы до 8192 сильно помогает скорости записи:

echo 8192 > /sys/block/md?/md/stripe_cache_size

Внимание: измеряется в кол-ве страниц * на кол-во устройств, и может быть очень прожорливо в плане потребления ОЗУ. При вышеуказанном значении 8192, размере страницы памяти в 4096 байт (используемом в ядре Linux на x86 и x86-64) и четырёх дисках в RAID, потребление памяти составит:

8192 * 4096 * 4 = 134217728 байт (128 мегабайт)

Write Intent Bitmap

Позволяет после некорректной перезагрузки системы производить перепроверку не всего RAID'а, а только тех областей, в которые на момент перезагрузки или отключения питания производилась запись. В варианте –bitmap=internal, крайне негативно влияет на скорость записи:

Эффект можно уменьшить, использовав большее значение параметра mdadm –bitmap-chunk (см. man mdadm), например я сейчас использую 131072. Можно также практически полностью исключить его, использовав bitmap во внешнем файле – на диске, не входящем в массив. Для раздела, где будет храниться файл с bitmap, автором mdadm рекомендуется файловая система ext2 или ext3, однако и при размещении его на XFS каких-либо проблем не возникало.

mdadm --grow --bitmap=internal --bitmap-chunk=131072 /dev/md0

mkfs.ext4 -E stride=,stripe_width=

Важно правильно задать при создании ФС эти параметры, если забыли - ничего страшного, можно и позже их поменять с помощью tune2fs.

XFS пытается определить соответствующие значения автоматически, если у неё не получается – см. man mkfs.xfs на предмет sunit= и swidth=.

Chunk size

Задаётся при создании массива, параметром mdadm –chunk-size. Изменить в уже работающем массиве – крайне долгая, и вероятно не вполне безопасная операция, требующая, к тому же, самой свежей версии mdadm (3.1) и достаточно нового ядра (2.6.31+)1).

Дефолтным значением в старых mdadm было 64K, в новых – стало 512K2). По мнению автора mdadm, “512K новым дискам подходит лучше”, по моему – не всё так однозначно. Пока что предпочитаю продолжить использование 64K.

Другим автором по результатам тестов рекомендуется размер в 128K:

Read-Ahead

# Посмотреть текущий:
blockdev --getra /dev/md?

#Поменять:
blockdev --setra <новое значение в секторах (512 байт)> /dev/md?

Экспериментов с этим пока не проводил, скорость чтения с массива (на трёхдисковом RAID5, достигающая суммы линейной скорости двух дисков) устраивает и так.

Ссылки


mdadm-raid.txt · Last modified: 2020-11-01 14:33 UTC by rm