Terminal pogryzł człowieka: fio

Zastanawialiście się co potrafi wasz dysk lub dyski umieszczone w lokalnym komputerze? Albo gdzieś na serwerze? Lub jaką wydajność może zaoferować zdalny system plików? Tyle pytań a odpowiedzią na nie jest fio. Tak, właśnie to wyspecjalizowane narzędzie da nam wiarygodne pomiary a nie popularne i masowo stosowane dd.

Fio w terminalu
Zwolennicy prostej formy zapytają zapewne „a co jest nie tak z dd?”. Otóż program ten wśród wielu doskonałych cech kompletnie nie nadaje się do przeprowadzania wiarygodnych benchmarków na naszym dysku. Wszystko co możemy osiągnąć za jego pomocą to jednowątkowe sekwencyjne zapisywanie do pliku. Nie przetestujemy również prędkości odczytu. Natomiast fio zadba o wszystko. Za pomocą parametrów można określić ile procesów ma zostać uruchomionych, ile z nich ma odczytywać dane, ile zapisywać (test jednoczesnego odczytu i zapisu), jaka ma być objętość próbek, wielkość „przestrzeni” dyskowej po jakiej mają się poruszać procesy (plik tworzony na potrzeby testu). To wszystko pozwala na przeprowadzenie całkiem kompleksowych rozważań nad ogólną kondycją dysku, systemu plików, itp. Co więcej, fio jest dostępne w repozytoriach niemal każdej dystrybucji, zatem nie trzeba uciekać się do magicznych sztuczek aby wspomóc się jego możliwościami. Oczywiście jeżeli ktoś lubi może program skomplikować samodzielnie – źródła są dostępne na Githubie.

Fio pozwala na przeprowadzenie testów losowego/sekwencyjnego odczytu/zapisu, odczytu lub zapisu (odpowiednie parametry w linii komend). Oczywiście to zaledwie czubek całego stosu parametrów którymi można regulować przeprowadzane badania.

fio --randrepeat=1 --ioengine=libaio --direct=1 --gtod_reduce=1 --name=virtualtest --filename=virtualtest --bs=4k --iodepth=64 --size=4G --readwrite=randrw --rwmixread=80

Powyższe zestawem opisaliśmy test o nazwie „virtualtest”, który utworzy na dysku plik o objętości 4GB i będzie dokonywał tam prób odczytu i zapisu 4KB danych. Ilość prób odczytu w stosunku do prób zapisu to 4:1 (80%). Może powyższe nie opisuje typowej sytuacji z jaką spotkamy się na komputerze domowym, ale da nam ogólny obraz sprawności naszego systemu plików i dysku. Wynikiem tej komendy może być:

fio-2.2.10
Starting 1 process
virtualtest: Laying out IO file(s) (1 file(s) / 4096MB)
Jobs: 1 (f=1): [m(1)] [100.0% done] [43540KB/10825KB/0KB /s] [10.9K/2706/0 iops] [eta 00m:00s]
virtualtest: (groupid=0, jobs=1): err= 0: pid=12570: Wed Aug  9 10:58:21 2017
  read : io=3277.5MB, bw=47339KB/s, iops=11834, runt= 70895msec
  write: io=838240KB, bw=11824KB/s, iops=2955, runt= 70895msec
  cpu          : usr=2.99%, sys=80.10%, ctx=20508, majf=0, minf=9
  IO depths    : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=0.1%, >=64=100.0%
     submit    : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     complete  : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.1%, >=64=0.0%
     issued    : total=r=839016/w=209560/d=0, short=r=0/w=0/d=0, drop=r=0/w=0/d=0
     latency   : target=0, window=0, percentile=100.00%, depth=64

Run status group 0 (all jobs):
   READ: io=3277.5MB, aggrb=47338KB/s, minb=47338KB/s, maxb=47338KB/s, mint=70895msec, maxt=70895msec
  WRITE: io=838240KB, aggrb=11823KB/s, minb=11823KB/s, maxb=11823KB/s, mint=70895msec, maxt=70895msec

Disk stats (read/write):
  sda: ios=837832/209426, merge=233/171, ticks=1026620/145640, in_queue=1171736, util=98.28%

Co to wszystko oznacza? Najistotniejsze dla nas będzie IOPS dla read/write. W tym przykładzie testowany dysk był w stanie przeprowadzić w ciągu jednej sekundy 11834 operacji odczytu oraz 2955 operacji zapisu.

Aby przetestować sam odczyt lub zapis wystarczy podać odpowiedni parametr dla –readwrite: read (sekwencyjne), write (sekwencyjne), trim, randread, randwrite, randtrim, randrw, trimwrite. Jednak warto zapoznać się z obszernym podręcznikiem gdzie znajdziemy niemal setki przeróżnych parametrów regulujących test w określonym środowisku.