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=1
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