Случайно купил себе сервер 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