HDD test

Материал из naname.com.ua
Перейти к навигацииПерейти к поиску

Тест жестких дисков (и других блочных устройств)

Линейное чтение

Линейное чтение (с заданным шагом). Да, я знаю что это весьма косвенный показатель. Но куда ж без него.
Не забыть iflag=direct Значения count и step подбирать по желанию - насколько усреднять. Естественно читать чаще чем нужно смысла нет, а вот для больших дисков несколько интерполировать.

Скрипт для сбора статистики

#!/bin/bash

step=2048
i=1

device=sda

while A=`dd iflag=direct  if=/dev/${device} of=/dev/null skip=$[${step}*${i}]k  bs=8k count=256k  2>&1`
do
    B=`echo $A | grep "bytes" | awk ' {print $14" "$15} '`
    echo $[${step}*${i}]" "$B
    echo $[${step}*${i}]" "$B | sed s/','/'.'/g >> line_read.${device}
    let i=i+1
done

Построенеи графиков

Далее строим график GnuPlot, что то вроде такого:

#!/usr/bin/gnuplot -persist

set terminal png  size 1600,800
set output "master_Line_Read_Speed_sdi.png"
set ylabel "Speed, MB/s"
set xlabel "Offset"
set grid
plot \
"result_sdi" using 1:2 with linespoints lt rgb "blue" lw 2 title "Line Read"

Line Read Speed sda.png Разброс есть, но вцелом похоже на правду.

Можно попробовать сглаживание:

plot \
"result_sda" using 1:2 smooth bezier  lw 2 title "Line Read sda", \

Master Line Read Speed all.png

Многопоточность

Есть замечательная утилита - fio для работы с которой я написал небольшую обвязку

Скрипт для сбора статистики

Для каждой глубины очереди от 1 до максимально доступной для винта запускаю тест:

#!/bin/bash

FIO="/usr/bin/fio"
config="read.ini"
timeout=30
for device in sda
do
    result="./fio_result.data."${device}
    max_depth=`cat /sys/block/${device}/device/queue_depth`
    for iodepth in `seq 1 ${max_depth}`
    do

        echo "[readtest]"                        > ${config}
        echo "blocksize=4k"                     >> ${config}
        echo "filename=/dev/"${device}  >> ${config}
        echo "rw=randread"                      >> ${config}
        echo "direct=1"                 >> ${config}
        echo "buffered=0"                       >> ${config}
        echo "ioengine=libaio"          >> ${config}
        echo "iodepth="${iodepth}               >> ${config}
        echo "timeout="${timeout}               >> ${config}
        A=`${FIO} ${config}`
        IOPS=`echo $A | awk -F"iops=" '{ print $2}' | awk '{print $1}'`
        CLAT=`echo $A | awk -F"clat" '{print $2}'| sed s/'('/''/g  | awk -F"stdev" '{ print $1}' | sed s/','/''/g | awk '{print $1" "$4}' | sed s/'):'/''/g | sed s/'avg='/''/g`
        CLAT_AVG=`echo "$CLAT" | awk '{print $2 }'`
        CLAT_M=`echo "$CLAT" | awk '{print $1 }'`
        # if not msec 
        if [ "$CLAT_M" = "usec" ]
        then
            CLAT_AVG=`echo "scale=2; $CLAT_AVG/1000" | bc`
        fi
        echo ${iodepth}" "$IOPS" "$CLAT_AVG      >> ${result}
        echo ${iodepth}" "$IOPS" "$CLAT_AVG  $CLAT_M
    done
done

на выходе файл - что то вроде: глубина очереди, IOPS, Latency

1 54 18.21
2 61 32.05
3 66 44.69
4 71 55.39
5 78 62.83
6 75 78.87
7 83 82.54
8 84 93.89
9 86 102.97
10 89 110.95
11 87 124.08
12 92 128.32
13 93 136.95
14 93 148.65
15 91 161.93
16 96 164.10
17 98 170.55
18 97 183.16
19 96 195.36
20 95 207.68
21 97 213.97
22 97 223.03
23 98 231.33
24 100 237.42
25 99 249.03
26 101 254.15
27 103 259.39
28 101 272.94
29 101 283.66
30 98 302.42
31 103 295.61

Построение графиков

Строим график (с 2 осями )

#!/usr/bin/gnuplot -persist

#set terminal png
set terminal png  size 1600,800

set output "FIO1_Speed_sda.png"
set ylabel "IOPS"
set xlabel "IODEPTH"
#set grid

#set y2tics 20 nomirror tc lt 2
set y2label 'ms'
set ytics nomirror
set y2tics
set tics out
set autoscale  y
set autoscale y2
#plot 2*x linetype 1, 4*x linetype 2 axes x1y2
plot \
"fio_result.data.sda" using 1:2 with linespoints lt rgb "red" lw 2 title "IOPS" axes x1y1, \
"fio_result.data.sda" using 1:3 with linespoints lt rgb "blue" lw 2 title "Latency, ms" axes x1y2

FIO1 Speed sda.png Как видно на графике, чем плотнее нагружен винт тем выше IOPS но тем больше фактическое ожидание у каждого запроса.

Сравнительные результаты тестирования

Выше результаты теста моего довольно старого ноутбучного винта (отсюда и такие невысокие результаты) Винт:

Model Family:     Toshiba 2.5" HDD MK..52GSX
Device Model:     TOSHIBA MK1652GSX

INTEL SSDSA2CW080G3

Model Family:     Intel 320 Series SSDs
Device Model:     INTEL SSDSA2CW080G3

INTELSSDSA2CW080G3.png

OCZ-VERTEX2

Данные с сервера под нагрузкой!

Model Family:     SandForce Driven SSDs
Device Model:     OCZ-VERTEX2

OCZ-VERTEX2.png

KINGSTON SVP200S390G

Device Model:     KINGSTON SVP200S390G

KINGSTONSVP200S390G.png

Интерполяция

Когда точек много то удобнее использовать интерполяцию Для создания интерполированных графиков я использую следующий скрипт:

#!/usr/bin/gnuplot -persist

#set terminal png
set terminal png  size 3600,800

set output "FIO1_Speed_sda.png"
set ylabel "IOPS"
set xlabel "IODEPTH"
#set grid

#set y2tics 20 nomirror tc lt 2
set y2label 'ms'
set ytics nomirror
set y2tics
set tics out
set autoscale  y
set autoscale y2
#plot 2*x linetype 1, 4*x linetype 2 axes x1y2
plot \
"fio_result.data.sda" using 1:2 with linespoints lt rgb "red"     lw 1 title "IOPS" axes x1y1, \
"fio_result.data.sda" using 1:3 with linespoints lt rgb "blue"    lw 1 title "Latency, ms" axes x1y2, \
"fio_result.data.sda" using 1:2 smooth bezier    lt rgb "green"   lw 3 title "IOPS" axes x1y1, \
"fio_result.data.sda" using 1:3 smooth bezier    lt rgb "magenta" lw 3 title "Latency, ms" axes x1y2

Результат выглядит так:

HP LOGICAL VOLUME

Slave3sda.png

Несколько дисков сразу

Видно что все диски плюс-минус одинаковые.
SUMM FIO1 Speed sda.png

Тест реального сервера с кучей винтов (старых)

Есть старая железка, с кучей винтов (достаточно старых, от 80 гиг) Для наглядности - делаю их полный тест

Line Read

Размер дисков разный, потому длинна линий разная. Например 5000 блоков по 8к - 40гб. (да, у меня еще работает такой диск)

9 Power_On_Half_Minutes   0x0032   089   089   000    Old_age   Always       -       56077h+01m

Line Read Speed nnm.png

#!/usr/bin/gnuplot -persist

#set terminal png
set terminal png  size 1600,800

set output "Line_Read_Speed_sda.png"
set ylabel "Speed, MB/s"
set xlabel "Offset"
set title "Line Read"
set grid
plot \
"line_step_by_step_test_sda_line_step_by_step_test" using 1:2  smooth bezier  lw 3 title "Line Read sda, MB/s", \
"line_step_by_step_test_sdb_line_step_by_step_test" using 1:2  smooth bezier  lw 3 title "Line Read sdb, MB/s", \
"line_step_by_step_test_sdc_line_step_by_step_test" using 1:2  smooth bezier  lw 3 title "Line Read sdc, MB/s", \
"line_step_by_step_test_sdd_line_step_by_step_test" using 1:2  smooth bezier  lw 3 title "Line Read sdd, MB/s", \
"line_step_by_step_test_sde_line_step_by_step_test" using 1:2  smooth bezier  lw 3 title "Line Read sde, MB/s", \
"line_step_by_step_test_sdg_line_step_by_step_test" using 1:2  smooth bezier  lw 3 title "Line Read sdg, MB/s", \
"line_step_by_step_test_sdh_line_step_by_step_test" using 1:2  smooth bezier  lw 3 title "Line Read sdh, MB/s", \
"line_step_by_step_test_sdj_line_step_by_step_test" using 1:2  smooth bezier  lw 3 title "Line Read sdj, MB/s", \
"line_step_by_step_test_sdk_line_step_by_step_test" using 1:2  smooth bezier  lw 3 title "Line Read sdk, MB/s", \
"line_step_by_step_test_md126_line_step_by_step_test" using 1:2  smooth bezier  lw 3 title "Line Read md127 (sdd+sdc), MB/s"

IOPS

Видно что начиная примерно с 20 потоков диски выходят на максимум IOPS и растет только время отклика, привожу 2 графика - полный и подробный начала шкалы

IOPS nnm no limit.pngIOPS nnm.png

На свякий случай - скрипт построения графика, отрезать лишнее можно используя set xrange [0:20]

#!/usr/bin/gnuplot -persist

#set terminal png
set terminal png  size 1600,800

set output "IOPS_nnm_no_limit.png"
set ylabel "IOPS"
set xlabel "IODEPTH"
#set xrange [0:20]
set grid
set y2label 'ms'
set ytics nomirror
set y2tics
set tics out
set autoscale  y
set autoscale y2

plot \
"fio_result.data.sda_step_by_step_test" using 1:2 smooth bezier  lw 2 title "sda IOPS" axes x1y1, \
"fio_result.data.sda_step_by_step_test" using 1:3 smooth bezier  lw 3 title "sda Latency, ms" axes x1y2, \
"fio_result.data.sdb_step_by_step_test" using 1:2 smooth bezier  lw 2 title "sdb IOPS" axes x1y1, \
"fio_result.data.sdb_step_by_step_test" using 1:3 smooth bezier  lw 3 title "sdb Latency, ms" axes x1y2, \
"fio_result.data.sdc_step_by_step_test" using 1:2 smooth bezier  lw 2 title "sdc IOPS" axes x1y1, \
"fio_result.data.sdc_step_by_step_test" using 1:3 smooth bezier  lw 3 title "sdc Latency, ms" axes x1y2, \
"fio_result.data.sdd_step_by_step_test" using 1:2 smooth bezier  lw 2 title "sdd IOPS" axes x1y1, \
"fio_result.data.sdd_step_by_step_test" using 1:3 smooth bezier  lw 3 title "sdd Latency, ms" axes x1y2, \
"fio_result.data.sde_step_by_step_test" using 1:2 smooth bezier  lw 2 title "sde IOPS" axes x1y1, \
"fio_result.data.sde_step_by_step_test" using 1:3 smooth bezier  lw 3 title "sde Latency, ms" axes x1y2, \
"fio_result.data.sdg_step_by_step_test" using 1:2 smooth bezier  lw 2 title "sdg IOPS" axes x1y1, \
"fio_result.data.sdg_step_by_step_test" using 1:3 smooth bezier  lw 3 title "sdg Latency, ms" axes x1y2, \
"fio_result.data.sdh_step_by_step_test" using 1:2 smooth bezier  lw 2 title "sdh IOPS" axes x1y1, \
"fio_result.data.sdh_step_by_step_test" using 1:3 smooth bezier  lw 3 title "sdh Latency, ms" axes x1y2, \
"fio_result.data.sdj_step_by_step_test" using 1:2 smooth bezier  lw 2 title "sdj IOPS" axes x1y1, \
"fio_result.data.sdj_step_by_step_test" using 1:3 smooth bezier  lw 3 title "sdj Latency, ms" axes x1y2, \
"fio_result.data.sdk_step_by_step_test" using 1:2 smooth bezier  lw 2 title "sdk IOPS" axes x1y1, \
"fio_result.data.sdk_step_by_step_test" using 1:3 smooth bezier  lw 3 title "sdk Latency, ms" axes x1y2, \
"fio_result.data.md126_step_by_step_test" using 1:2 smooth bezier  lw 2 title "md126 (sdc+sdd) IOPS" axes x1y1, \
"fio_result.data.md126_step_by_step_test" using 1:3 smooth bezier  lw 3 title "md126 (sdd+sdc)Latency, ms" axes x1y2

Одновременный тест нескольких винтов или насыщение шины

Проверим, а как насчет одновременной работы более чем 1 винта - не упираемся ли в шину.
Графиков довольно много, понять что то - сложно, но вцелом вывод такой - одиночный винт работает быстрее Чем если с ним параллельно нагружен второй. Куда происходит "упирание" сказать сложно. Line Read Speed sda sbd.png
Line Read Speed sda sdb sdc.png
Line Read Speed sda sdb sdc sdd.png
Line Read Speed sda sdb sdc sdd sde.png
Line Read Speed sda sdb sdc sdd sde sdg.png
Line Read Speed sda sdb sdc sdd sde sdg sdh.png
Line Read Speed sda sdb sdc sdd sde sdg sdh sdj.png
Line Read Speed sda sdb sdc sdd sde sdg sdh sdj sdk.png

один и то те винт при разной нагрузке на систему

sda

Видно, что при нагрузке на второй винт на этом же контроллере производительность падает. Дальше, нагрузка на другие винты практически не оказывает влияния. Line Read Speed sda full.png

sdb

Всплеск около 50000 следует трактовать как "тест винта sda завершился раньше из-за его меньшего размера", отсюда и такая странная форма графика. В остальном повторяет sda Line Read Speed sdb full.png

sdc

По поводу этого графика можго сказать следующее

  • нагрузка на sda практически не оказала влияния (линия +1 немного ниже линии +0)
  • одновременная работа 3 и более винтов на шине снижает быстродействие просто катастрофически.

Line Read Speed sdc full.png

Сервер и много винтов

Еще графики с сервера с 24 винтами, тест еще идет потому результаты предварительные. Но тенденция видна.

В тест запускается линейное чтение сначала на sda, потом на sda и sdb, потом на sda, sdb и sdc и так далее. Соответственно число (+XX) - это число винтов которые были нагружены дополнительно во время теста текущего диска.

Первые 2 диска - наиболее показательно

Достаточно странно и неожиданно - скорость первого диска фактически не зависит от того загружены ли другие диски или нет. Но вспомнив что системный диск другого размера, и, вероятнее всего выключен в другой контроллер - и все встает на свои места
SRV master Line Read Speed sda full.png
Второй же диск ведет себя предсказуемо - чем больше параллельных запросов на шину контроллера тем медленнее он работает
SRV master Line Read Speed sdb full.png

Остальные диски

Дальше картина не меняется
SRV master Line Read Speed sdc full.png
SRV master Line Read Speed sdd full.png
SRV master Line Read Speed sde full.png
SRV master Line Read Speed sdf full.png
SRV master Line Read Speed sdg full.png
SRV master Line Read Speed sdh full.png
SRV master Line Read Speed sdj full.png
SRV master Line Read Speed sdk full.png
SRV master Line Read Speed sdl full.png
SRV master Line Read Speed sdm full.png
SRV master Line Read Speed sdn full.png
SRV master Line Read Speed sdo full.png
SRV master Line Read Speed sdp full.png
SRV master Line Read Speed sdq full.png

Выводы

Тестировалось старое и новое, быстрое и медленное железо, потому попробую обобщить выводы

  • линейная скорость чтения это не единственный показатель для серверных дисков
  • нагрузку выбирать так что бы latency не зашкаливало.
  • внимательно следить за разделяемыми ресурсами - производительность шины или сети ( для iSCSI может не хватить при большом числе дисков в системе)
  • даже софтварные рейды имеют хорошие показатели по сравнению с одиночными дисками.
  • следует быть готовым к тому что тестирование дисковой подсистемы займет много времени

Ссылки