Увеличение скорости программного RAID

После создания массива 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 <новое значение в килобайтах> /dev/md?

Экспериментов с этим пока не проводил

Увеличение скорости программного RAID: 1 комментарий

  1. Чем больше размер —bitmap-chunk, тем больше он замедляет производительность операций записи. Не наоборот, как сказано у Вас. В целом, отличная подборка ссылок!

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *