HDD test: различия между версиями
Материал из noname.com.ua
Перейти к навигацииПерейти к поискуSirmax (обсуждение | вклад) |
Sirmax (обсуждение | вклад) |
||
| Строка 39: | Строка 39: | ||
==Многопоточность== |
==Многопоточность== |
||
Есть замечательная утилита - fio для работы с которой я написал небольшую обвязку |
Есть замечательная утилита - fio для работы с которой я написал небольшую обвязку |
||
| + | Делаю так: |
||
| + | Для каждой глубины очереди от 1 до максимально доступной для винта запускаю тест: |
||
| + | <PRE> |
||
| + | #!/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 |
||
| + | </PRE> |
||
Версия 00:47, 26 февраля 2013
Тест жестких дисков (и других блочных устройств)
Линейное чтение
Линейное чтение (с заданным шагом). Да, я знаю что это весьма косвенный показатель. Но куда ж без него.
Не забыть 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"
Разброс есть, но вцелом похоже на правду.
Многопоточность
Есть замечательная утилита - 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