Fio

Allikas: Kuutõrvaja

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 ''