Monitoraggio, statistiche e test IOPS hard disk su Linux
I Tool per monitoraggio e test IOPS Linux sono molto comuni nelle distribuzioni, si possono utilizzare anche senza necessità di utilizzare dei LiveCD, li troviamo nel pacchetto sysstat
(in Debian e Centos)
Questo pacchetto è molto utile per avere report sull'utilizzo dei dischi, sia in lettura e scrittura che per quanto riguarda gli IOPS (Input/Output Per Second), ovvero le transazioni al secondo verso un disco o un array di dischi tipo RAID
Test IOPS Linux
È molto comune che ci venga richiesta Consulenza Linux per problemi di lentezza di un server, l'analisi preventiva dell'utilizzo delle risorse, solitamente comprende carico, uso della CPU, RAM, dischi, fra cui velocità di lettura e scrittura e IOPS
Per evitare che il problema non sia rilevato in tempo, solitamente adottiamo un monitoraggio real-time delle risorse, in grado di segnalare i parametri inusuali e garantire l'osservabilità degli utilizzi tramite grafici
Per stressare i nostri SSD o Hard Disk, possiamo utilizzare questi benchmark disponibili sulle maggiori distribuzioni Linux
hdparm
Sicuramente il più conosciuto e il più semplice, ci permette di testare in lettura utilizzando la cache e senza il nostro dispositivo avendo il report della velocità di lettura media
# hdparm -tT /dev/sda
/dev/sda
Timing cached reads: 34876 MB in 2.00 seconds = 17469.92 MB/sec
Timing buffered disk reads: 2912 MB in 3.00 seconds = 970.63 MB/sec
Test con Disk Dump dd
Effettua la copia bit a bit di un dispositivo, permette di avere le statistiche in lettura e scrittura della velocità media in MB/s
Attenzione: controllare bene if=input of=output
, si rischia di scrivere zeri su tutto il disco, se si utilizza come dispositivo di output
Test velocità lettura disco con dd
# dd if=/dev/sda of=/dev/null
1024+0 records in
1024+0 records out
10737418240 bytes (11 GB, 10 GiB) copied, 13,2991 s, 807 MB/s
Test velocità scrittura disco con dd
# dd if=/dev/zero of=./zero.dd count=1024 bs=10M
1024+0 records in
1024+0 records out
10737418240 bytes (11 GB, 10 GiB) copied, 3,74116 s, 2,9 GB/s
Ricordiamoci di rimuovere il file
rm ./zero.dd
Bonnie++
Un benchmark più completo, permette anche di esportare le statistiche su file .html
(nell'esempio bonnie.html
) leggibile con qualsiasi browser
# bonnie++ -d /tmp/miadirectory -r <ram-presente> -u root | bon_csv2html > /tmp/report-bonnie.html
Flexible IO test
Altro benchmark completo per stressare gli IO sul nostro sistema. fio
è parted della Phoronix Test Suite ma è disponibile anche per le maggiori distribuzioni Linux come pacchetto
Test velocità di scrittura
Test write speed, su un array di 3 dischi Micron 7500 NVMe, in ZFS RaidZ1
fio --filename=testfile-seq-50g --size=50G --direct=1 --rw=write --bs=4M --ioengine=libaio --numjobs=10 --iodepth=32 --name=seq-write-test --group_reporting --ramp_time=4
WRITE: bw=31.0GiB/s (33.3GB/s), 31.0GiB/s-31.0GiB/s (33.3GB/s-33.3GB/s), io=369GiB (396GB), run=11894-11894msec
Test velocità di lettura
Test read speed, su un array di 3 dischi Micron 7500 NVMe, in ZFS RaidZ1
fio --filename=testfile-seq-50g --direct=1 --rw=read --bs=4M --ioengine=libaio --numjobs=10 --iodepth=32 --name=seq-read-test --group_reporting --readonly --ramp_time=4
READ: bw=26.7GiB/s (28.7GB/s), 26.7GiB/s-26.7GiB/s (28.7GB/s-28.7GB/s), io=387GiB (415GB), run=14480-14480msec
Test IOPS in scrittura
Test write IOPS, su un array di 3 dischi Micron 7500 NVMe, in ZFS RaidZ1
fio --filename=testfile-rand-4g --size=4G --direct=1 --rw=randwrite --bs=4k --ioengine=libaio --numjobs=10 --iodepth=32 --name=rand-write-test --group_reporting --ramp_time=4 --time_based --runtime=300
write: IOPS=50.1k, BW=196MiB/s (205MB/s)(57.4GiB/300001msec); 0 zone resets
Test IOPS in lettura
Test read IOPS, su un array di 3 dischi Micron 7500 NVMe, in ZFS RaidZ1
fio --filename=testfile-rand-4g --direct=1 --rw=randread --bs=4k --ioengine=libaio --numjobs=4 --iodepth=32 --name=rand-read-test --group_reporting --readonly --ramp_time=4
read: IOPS=52.0k, BW=203MiB/s (213MB/s)(15.2GiB/76860msec)
Statistiche IOPS
iostat
Riporta le statistiche in tps (IOPS), lettura, scrittura istantanee e dal precedente ciclo di statistica, il primo report può essere incoerente se lanciato senza parametri
È necessario cambiare il nome del disco, nel nostro caso md1
che utilizziamo per rilevare l'utilizzo del disco/RAID su un intervallo di tempo:
# iostat -m 2 5 -d md1
Device tps MB_read/s MB_wrtn/s MB_dscd/s MB_read MB_wrtn MB_dscd
md1 14,57 0,87 0,33 0,00 12586 4739 0
Device tps MB_read/s MB_wrtn/s MB_dscd/s MB_read MB_wrtn MB_dscd
md1 0,00 0,00 0,00 0,00 0 0 0
Visualizza le statistiche degli IOPS ogni 2 secondi per 5 volte del device md1
, raid software Linux MD
Se utilizzato senza specificare il device indica anche i dettagli dell'uso processore
Molto interessante è %iowait indica la percentuale della CPU consumata dall'attesa degli IO su disco
sar
$ sar -b 2 5
12:06:40 tps rtps wtps dtps bread/s bwrtn/s bdscd/s
12:07:00 12,00 0,00 12,00 0,00 0,00 392,00 0,00
12:07:02 71,50 1,00 70,50 0,00 32,00 668,00 0,00
12:07:04 100,50 3,50 97,00 0,00 112,00 6956,00 0,00
12:07:06 45,50 0,00 45,50 0,00 0,00 428,00 0,00
12:07:08 9,00 0,00 9,00 0,00 0,00 232,00 0,00
Media: 47,70 0,90 46,80 0,00 28,80 1735,20 0,00
Come per iostat
visualizza le statistiche ogni 2 secondi per 5 volte e ci restituisce la media in questo caso su tutti i device presenti
Test istantaneo con iotop
Questo utilissimo comando è un semplice monitor degli IO simile a top e ci permette di ordinare tramite le frecce destra e sinistra i processi che effettuano più IO sui dischi. Inoltre visualizza la velocità di lettura e scrittura totale in MB/s
Total DISK READ: 13.96 K/s | Total DISK WRITE: 359.59 K/s
Current DISK READ: 13.96 K/s | Current DISK WRITE: 352.61 K/s
TID PRIO USER DISK READ DISK WRITE> COMMAND
393 be/4 root 0.00 B/s 359.59 K/s systemd-journald
1 be/4 root 0.00 B/s 0.00 B/s init
2 be/4 root 0.00 B/s 0.00 B/s [kthreadd]
3 be/4 root 0.00 B/s 0.00 B/s [pool_workqueue_release]
4 be/0 root 0.00 B/s 0.00 B/s [kworker/R-rcu_gp]
5 be/0 root 0.00 B/s 0.00 B/s [kworker/R-sync_wq]
6 be/0 root 0.00 B/s 0.00 B/s [kworker/R-slub_flushwq]
7 be/0 root 0.00 B/s 0.00 B/s [kworker/R-netns]
9 be/0 root 0.00 B/s 0.00 B/s [kworker/0:0H-events_highpri]