Сборка и разборка автомата Калашникова (и снова про RAID)

Тестирование RAID на запись в различных условиях.

Случайно купил себе сервер HP proliant ML150G3 (Xeon E5310 1.6GHz)*2, 8Gb,SmartArray E200i 128M + (SAS 72G 15k)*4. Добавил  SATA WD 80G в качестве системного, установил Ubuntu server 16.04.4 без swap и GUI (для чистоты эксперимента) и решил поиграть с RAID массивами. Пособирать, поразбирать, поломать RAID массивы, пощупать, так сказать собственными ручками.

Поводом стала статья на Хабре  Почему RAID5 — «must have»?

Странно сравнивать надежность массива из трех и четырех дисков, было бы правильно сравнить RAID10 и RAID5 из трех основных и одного резервного диска. У этих двух массивов одинаковое число дисков -4  и одинаковая емкость — удвоенная емкость одного диска, Надежность RAID 5 в данном случае выше, поскольку в случае выхода из строя одного диска — он заменяется резервным, а после выхода из строя еще одного диска массив сохраняет работоспособность, Т.е. сохраняется работоспособность при выходе из строя любых ДВУХ!! дисков. В комментариях к статье указывалось, что скорость записи на RAID 10 , выше, чем на RAID 5, особенно когда запись идет в несколько потоков и мелкими файлами. Вот это и проверим. Raid монтировался в /mnt/raid, файловая система ext4. В качестве проверки использовался bash скрипт, который писал файлы на диск в один или несколько потоков. Для записи файлов использовалась команда dd , файлы создавались из /dev/urandom. Общий объем файлов всегда 1Гб, но было три теста:

0) 64 потока, каждый поток пишет на диск 16384 файлов по 1к

1) 8 потоков, каждый пишет на диск 128 файлов по 1М

2)1 поток, один файл 1Г.

Фиксируется только время записи. Скрипт, собственно вот:

#!/bin/bash
clear
declare -i K=1024
declare -i -r BLOCK_SIZE=1024 #запись файла блоками по 1 к
declare -i BLOCK_COUNT        #число 1к-блоков на файл
declare -i TEST_NUM           #номер теста 0,1,2
declare -i THREAD_COUNT       #число потоков записи файлов
declare -i LOOP_COUNT         #число записываемых файлов в одном потоке
declare -r FILE_PREFIX=File
declare -r LOG=/home/user/raid/raid.log
TEST_DIR=/mnt/raid
exec >>$LOG 2>&1

for TEST_NUM in {0..2};do

find $TEST_DIR -type f -name "${FILE_PREFIX}*" -delete

BLOCK_COUNT=$((K ** $TEST_NUM)) #1,1K,1M
THREAD_COUNT=$((8 ** (2-$TEST_NUM))) #64,8,1
LOOP_COUNT=$((128 ** (2-$TEST_NUM))) #16384,128,1

echo BLOCK_SIZE    $BLOCK_SIZE
echo BLOCK_COUNT   $BLOCK_COUNT
echo THREAD_COUNT  $THREAD_COUNT
echo LOOP_COUNT  $LOOP_COUNT
echo SUM_FILES_LEN $(($BLOCK_SIZE*$BLOCK_COUNT*$THREAD_COUNT*LOOP_COUNT))

time {
for ((THREAD=0; THREAD < $THREAD_COUNT; THREAD++));do
for ((LOOP=0; LOOP < $LOOP_COUNT; LOOP++));do
#echo $THREAD $LOOP
dd status=none if=/dev/urandom of=${TEST_DIR}/${FILE_PREFIX}_${TEST_NUM}_$(printf "%02d_%05d" ${THREAD} ${LOOP}) bs=$BLOCK_SIZE count=$BLOCK_COUNT
done &
done
wait
}
echo "#####################################"

done

find $TEST_DIR -type f -name "${FILE_PREFIX}*" -delete

Результаты теста приведены на скриншоте. Условные обозначения raid5.4 — рейд 5 из четырех дисков (без резерва) raid5.4-1 — тот же raid, без одного диска для эмуляции отказа. Остальные по аналогии.

Выводы:

Как видно из таблички скорость записи практически одинакова на всех массивах. При записи файлов в несколько потоков наблюдалась 100% загрузка процессора. Видимо именно проц был узким местом при записи мелких файлов в несколько потоков. Не знаю, может более опытные товарищи подскажут. Для себя я бы выбрал рейд 5 с тремя дисками и одним диском горячего резерва.

В качестве soft raid использовал mdadm. Но после удаления одного диска raid не заработал, поскольку возникли проблемы c суперблоком. Может я что не так делаю, но запустить софтовый raid без одного диска у меня не получилось. Надеюсь народ, который использует софтовые рейды 5 проверяет их на отказоустойчивость перед отправкой в реальное плавание ;-).

——————————————————————————————————————————————-

Ну и для сравнения укажу результаты чтения диска программой hdparm с различными raid.

Сразу хочу заметить, что hdparm работает с устройством напрямую, без файловой системы, поэтому реальные результаты работы с файлами могут быть другими.

raid 5.4 Timing cached reads 5626 in 2.00 second =2819.53 Mb/sec

Timing buffered disk reads 642 Mb in 3.00  second=213.84 Mb/sec

raid 5.3 Timing cached reads 5720 in 2.00 second =2866.77 Mb/sec

Timing buffered disk reads 448 Mb in 3.00  second=149.12 Mb/sec

raid 10 Timing cached reads 5748 in 1.99 second =2881.31 Mb/sec

Timing buffered disk reads 542 Mb in 3.00  second=180.58 Mb/sec

5 Comments

  1. nyam-nyam

    Не указан размер страйпа RAID5. RAID5 при записи целиком страйпа по производительности будет равен или быстрее RAID10 — XOR процессор рейда делает очень быстро, а запись на отдельный диск будет равна x/(n-1) и 2x/n для RAID5 и RAID10 соответственно (х — размер страйпа, n — кол-во дисков в массиве). В случае записи данных в не пустой страйп и размером меньше чем страйп, RAID5 для расчёта контрольной суммы должен сначала считать этот страйп, потом рассчитать XOR, а затем записать изменённый данные — вот тут и появляется падение производительности.

    В данном тесте разницы в RAID5 и RAID10 практически нет скорее всего что не было случаев перезаписи страйпов. Однако, для баз данных как раз характерны сценарии с перезаписью страйпов (маленькие изменения большого файла) и падение производительности на RAID5. Есть так же некоторые сомнения по поводу распараллеливания потоков данным скриптом:

    for ((LOOP=0; LOOP < $LOOP_COUNT; LOOP++));do

    #echo $THREAD $LOOP

    dd status=none if=/dev/urandom of=${TEST_DIR}/${FILE_PREFIX}_${TEST_NUM}_$(printf «%02d_%05d» ${THREAD} ${LOOP}) bs=$BLOCK_SIZE count=$BLOCK_COUNT

    done &

    я бы написал вот так:

    for ((LOOP=0; LOOP < $LOOP_COUNT; LOOP++));do

    #echo $THREAD $LOOP

    dd status=none if=/dev/urandom of=${TEST_DIR}/${FILE_PREFIX}_${TEST_NUM}_$(printf «%02d_%05d» ${THREAD} ${LOOP}) bs=$BLOCK_SIZE count=$BLOCK_COUNT &

    done

    Reply
  2. A_Max

    (1) и именно для этого в бд делается размер страницы равный размеру страйпа (или наоборот кому как удобней)

    Reply
  3. viptextil1

    (1) Да я бы и рад посмотреть размер страйпа, но не знаю где. При создании железного raid он не указывается… Может надоумите, где глянуть?

    for ((LOOP=0; LOOP < $LOOP_COUNT; LOOP++));do

    #echo $THREAD $LOOP

    dd status=none if=/dev/urandom of=${TEST_DIR}/${FILE_PREFIX}_${TEST_NUM}_$(printf «%02d_%05d» ${THREAD} ${LOOP}) bs=$BLOCK_SIZE count=$BLOCK_COUNT &

    done

    Э-э-э, нет. Так не пойдет. Так каждый отдельный файл будет писаться отдельным потоком, а у меня в «нулевом» тесте пишутся 16384 файла последовательно в одном потоке.

    Reply
  4. nyam-nyam

    (3) Размер страйпа можно посмотреть/изменить в утилите настройки RAID. Для HP это HP Array Configuration Utility.

    По поводу куда поставить & — согласен. Но для демонстрации проседания производительности RAID5 надо всё же делать перезапись. Впрочем, за счёт кэша на RAID и встроенного оптимизатора возможно и не получится увидеть значимой разницы в скорости записи. Как вариант — отключить кэширование записи

    Reply
  5. viptextil1

    (4)

    Размер страйпа можно посмотреть/изменить в утилите настройки RAID. Для HP это HP Array Configuration Utility.

    Вот спасибо. Действительно, настройки моего контроллера задаются утилитой ssacli.

    Спасибо, узнал для себя много нового.

    Reply

Leave a Comment

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