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

Администрирование - Системное

RAID test bash linux ubuntu debian server сервер администрирование рейд.

5
Тестирование 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

См. также

Комментарии
Избранное Подписка Сортировка: Древо
1. nyam-nyam 14.06.18 11:23 Сейчас в теме
Не указан размер страйпа 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
viptextil1; blindcat2006; beefit; +3 Ответить
2. A_Max 16 14.06.18 15:07 Сейчас в теме
(1) и именно для этого в бд делается размер страницы равный размеру страйпа (или наоборот кому как удобней)
viptextil1; +1 Ответить
3. viptextil1 13 15.06.18 08:32 Сейчас в теме
(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 файла последовательно в одном потоке.
4. nyam-nyam 15.06.18 09:52 Сейчас в теме
(3) Размер страйпа можно посмотреть/изменить в утилите настройки RAID. Для HP это HP Array Configuration Utility.

По поводу куда поставить & - согласен. Но для демонстрации проседания производительности RAID5 надо всё же делать перезапись. Впрочем, за счёт кэша на RAID и встроенного оптимизатора возможно и не получится увидеть значимой разницы в скорости записи. Как вариант - отключить кэширование записи
5. viptextil1 13 17.06.18 18:14 Сейчас в теме
(4)
Размер страйпа можно посмотреть/изменить в утилите настройки RAID. Для HP это HP Array Configuration Utility.

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

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