HDD test

Материал из noname.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 "Line_Read_Speed_sda.png"
set xlabel "Speed, MB/"
set ylabel "Offset"
set grid
plot \
"line_read.sda" using 1:2 with linespoints lt rgb "green" lw 2 title "Line Read"

Line Read Speed sda.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 но тем больше фактическое ожидание у каждого запроса.

Ссылки