Заметки о программном 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, достигающая суммы линейной скорости двух дисков) устраивает и так.