I/O Messung mit dd und gnuplot

Mit dd lässt sich die Ein-Ausgabeleistung des Speicher-Systems eines PCs sehr gut messen. Um gute Werte zu bekommen muss man die Blockgrösse und das Testdatenvolumen variieren. Am besten macht man das mit zufälliger Variation um den Einfluss von Cache-Leerungen und zeitgesteuerte Prozesse zu minimieren. Auf diese Weise zeichnet sich selbst bei mittel ausgelasteten Systemen eine brauchbare Kurve ab, die nur von mehr oder weniger Abweichungen begleitet ist. Die Rückgaben von dd werden in eine Datei geschrieben, die dann von einem gnuplot-Skript zur Darstellung in ein Diagramm eingetragen wird. Man kann dazu mehrere Durchläufe einfach laufen lassen, die Daten werden aneinandergehängt und von Gnuplot jeweils mit einer eigenen Farbne dargestellt.

Ergebnisse als Graphen

gnuplot Skript Download

#!/usr/bin/gnuplot
#
PDF='iotest.pdf'
#
set datafile separator ";"

set terminal pdf size 11.6929,8.267
set output PDF
#set decimalsign locale "de_DE.UTF-8"
set size 0.95,0.95
set origin 0.03,0.03
set grid #linestyle 30, linestyle 31
set grid xtics mxtics ytics mytics
set format y "%3.0s %c"

set title "IO Leistung bei konstanter Blockgrösse 512
set logscale xy
set xlabel "Anzahl Blockübertragungen"
set ylabel "IO in byte/s"

plot "iotest.ergebnis1" using 1:($4 / $5 ):-2 with points notitle lc var

set title "IO Leistung bei steigender Blockgrösse
set logscale xy
set xlabel "Blockgrösse"
set ylabel "IO in byte/s"

plot "iotest.ergebnis2" using 3:($4 / $5 ):-2 with points notitle lc var

Bash Skript Download

# getting random number from random.org
N=10000     # 1E4 is the limit!
Ymin=-10000
Ymax=10000
wget -O random-numbers \
 "https://www.random.org/integers/?num=${N}&min=${Ymin}&max=${Ymax}&col=1&base=10&format=plain&rnd=new"

Bash Skript Download

#!/bin/bash
#
DATEI=/usr/src/iotest           # Hier werden Testdaten reingeschrieben
ERGEBNIS1=iotest.ergebnis1
ERGEBNIS2=iotest.ergebnis2
MAXCOUNT=1000
#-------------------------
LANG=C
# Wir brauchen Zufallszahlen, die holen wir schnell von random.org
[ -f random-numbers ] || ./get-rnd-numbers.sh
# Es ist wichtig die Zugriffe zu randomisieren um nicht regelmässige Muster durch Cache-Management zu bekommen
while read COUNT
do
    BS=$((MAXCOUNT * COUNT ))
    echo "$COUNT $BS"
    LINE1=$(dd if=/dev/zero of=$DATEI count=${COUNT} bs=512 2>&1 |sed -e "s/ bytes (.*) copied, /;/g" -e "s/ s, .*$//" \
          |grep -v 'records') #|cut -d',' -f3-|awk '{ printf "%1s;%2s\n", $1, $3}')
    LINE2=$(dd if=/dev/zero of=$DATEI count=10       bs=$BS 2>&1 |sed -e "s/ bytes (.*) copied, /;/g" -e "s/ s, .*$//" \
          |grep -v 'records') #|cut -d',' -f3-|awk '{ printf "%1s;%2s\n", $1, $3}')
    echo -e "$COUNT;$COUNT;512;$LINE1" >>"$ERGEBNIS1"
    echo -e "$COUNT;10;$BS;$LINE2" >>"$ERGEBNIS2"
done < random-numbers
# Zwei leerzeilen anhängen damit beim nächsten Durchgang angehängte Daten von gnuplot als neuen Block erkannt werden
echo >>"$ERGEBNIS1"
echo >>"$ERGEBNIS1"
echo >>"$ERGEBNIS2"
echo >>"$ERGEBNIS2"
rm "$DATEI"