Fio
Fio on kettaseadmete testimiseks mõeldud utiliit, millel on suur valik seadistusi ning võimalus koondada erinevaid tekste ühte kesksesse konfiguratsioonifaili, mis lihtsustab tunduvalt erinevate testide loomist.
Fio saab käivitada jooksvalt ka ilma konfiguratsioonita käsurealt
# fio --max-jobs=16 --numjobs=16 --readwrite=write --blocksize=4M --size=512M --direct=1 --name=fiojob
Aga üldiselt on mõistlikum kasutada fio konfiguratsiooni testidel.
Random read of 128mb of data
[random-read] rw=randread size=128m directory=/tmp/fio-testing/data
Käivitamiseks
$ fio random-read-test.fio
Keerukam konfiguratsioon, mis teeb kokku neli erinevat järjestikust ning random kirjutustesti erinevate bloki suurustega. 1G on failisuurus mille peal teste läbi viiakse ning iga test kestab 5 minutit.
[global] ioengine=libaio iodepth=6 runtime=300 time_based direct=1 sync=0 group_reporting size=1G filename=/srv/fiotesti-fail numjobs=1 [4m-seq-write] stonewall bs=4m rw=write [1m-random-write] stonewall bs=1m rw=randwrite [128k-random-write] stonewall bs=128k rw=randwrite [4k-random-write] stonewall bs=4k rw=randwrite
ioengine=libaio ioengine valikuid on palju, default on sync. Huvitav mida rsync kasutab, netist kohe ei leidnud. Katsetamise mõttes võiks korraks vähemalt võrrelda sync ja libaio numbreid.
numjobs=1 tähendab, et 4 protsessi koormab paralleelselt. Oletan, et (võrreldes numjobs=1 testiga) on järjestikune kirjutamine seetõttu oluliselt aeglasem ja random üsna täpselt sama (sest sync=1, direct=1).
direct=1 sync=0 Nende kahe lipu (samuti "dd flag=direct/sync") kohta on SO-s jutt: http://stackoverflow.com/questions/5055859/how-are-the-o-sync-and-o-direct-flags-in-open2-different-alike tehniliselt võiks olla nii, et direct=1 tähendab juba, et puhvreid ei kasutada ning järelikult võib jätta sync=0
iodepth=32 Lubab kõvasti suuremat paraleelsust ja on hea näiteks cephi jms võrgufailisüsteemide testimisel, kus loeb peamiselt paraleelsus.
Tulemuste analüüsimine
Fio erinevate testide tulemusi on raske võrrelda, seega abistamiseks üks väike skript, mis võtab kõik aktiivses kaustas olevad .fio laiendiga failid ja moodustab neist tabeli
#!/bin/sh
iops_fmt='%5.0f'
clat_fmt='%7.2f'
bw_fmt='%7.0f'
[ -z "$1" ] && files="*.fio" || files="$@"
cat <<EOT
4m-seq-write 1m-random-write 128k-random-write 4k-random-write
iops clat bw iops clat bw iops clat bw iops clat bw
msec KB/s msec KB/s msec KB/s msec KB/s
----------------------------------------------------------------------------
EOT
for f in $files; do
while read line; do
case "$line" in
'write'*)
printf "$iops_fmt" $(echo "$line" | cut -d , -f 3 | cut -d = -f 2)
;;
'clat ('*)
val=$(echo "$line" | cut -d , -f 3 | cut -d = -f 2)
unit=$(echo "$line" | cut -d \( -f 2 | cut -d \) -f 1)
case "$unit" in usec) val=$(dc -e "3 k $val 1000 / p") ;; esac
printf "$clat_fmt" $val
;;
'bw (KB'*)
printf "$bw_fmt" $(echo "$line" | cut -d , -f 4 | cut -d = -f 2)
;;
esac
done < $f
printf ' %s\n' $(echo $f | cut -d . -f 1)
done
echo ''