Testare velocità unità disco

Per un valore facile da ottenere e abbastanza attendibile:

sudo hdparm -Tt --direct /dev/sda

Risultato:

/dev/sda:
 Timing O_DIRECT cached reads:   516 MB in  2.00 seconds = 257.74 MB/sec
 Timing O_DIRECT disk reads: 262 MB in  3.01 seconds =  87.09 MB/sec

Notare la presenza del flag "--direct": il suo uso fa si che venga evitato la page cache, facendo dialogare direttamente il disco con hdparm.

Altro sistema command line per ottenere dei dati di lettura/scrittura sequenziale

sudo dd if=/dev/zero of=/tmp/output.img bs=8k count=256k conv=fdatasync
sudo dd if=/tmp/output.img of=/dev/null bs=8k count=256k
rm /tmp/output.img

Risultato:

252947+0 record dentro
252946+0 record fuori
2072137728 byte (2,1 GB) copiati, 47,1099 s, 44,0 MB/s

Da notare l'utilizzo di "conv=fdatasync" nel primo comando per fare in modo che venga fatto un sync al termine dell'operazione, in modo da essere certi che i dati siano stati scritti realmente prima di prendere i tempi.

Può essere utile, prima e dopo ogni comando eseguire

sudo sync
echo 3 | sudo tee /proc/sys/vm/drop_caches

In modo da svuotare le cache di sistema, e avere quindi un risultato più attendibile per il comando successivo (e chiudere effettivamente il comando precedente).

 

Per fare test più completi e attendibili si possono usare suite apposta, ad esempio bonnie++.

Solo un esempio veloce, per limitare la memoria usata (di base bonnie vuole utilizzare il doppio della memoria di macchina):

bonnie++ -r 5000M -s 10000M -u root -d /tmp

 

Per finire, uno script "speedtest.sh" che unisce i comandi sopra e permette di effettuare un test di velocità velocemente:

#!/bin/bash

if [[ "$1" == "" || ! -b $1 ]]; then
    echo "Errore: Il parametro 1: $1 non e' un block device. Es: /dev/sdc"
    exit
fi
if [[ "$2" == "" || ! -d $2 ]]; then
    echo "Errore: Il parametro 2: $2 non e' una cartella. Es: /run/media/eric/backup_ext4"
    exit
fi

DD_BLOCK_SIZE=8k
DD_BLOCK_COUNT=256k # 256k*8k = 2GB

# Dati del disco
sudo hdparm -I $1 | grep -E "Model|speed"

# In order to make as accurate a test as possible, the buffers and cache are dumped prior to every run:
# sync; echo 3 | sudo tee /proc/sys/vm/drop_caches

#echo "Buffered/Cached Disk Reads"
#sudo sync; (echo 3 | sudo tee /proc/sys/vm/drop_caches) > /dev/null
#sudo hdparm -Tt $1

# --direct: This bypasses the page cache, causing the reads to go directly from the drive into hdparm's buffers, using so-called "raw" I/O
echo ""
echo "Buffered/Cached Disk Reads (direct):"
sudo sync; (echo 3 | sudo tee /proc/sys/vm/drop_caches) > /dev/null
sudo hdparm -Tt --direct $1 | grep Timing

# Da notare l'utilizzo di "conv=fdatasync" per fare in modo che venga fatto un sync al termine dell'operazione, in modo da essere certi che i dati siano stati scritti realmente prima di prendere i tempi.
# Un sistema ancora più maniacale di sync è l'uso di "oflag=dsync", che sincronizza ogni singola richiesta di write (quindi nell'esempio sopra sincronizza 256k volte). In questo modo si evita qualunque cache, ma è un caso poco realistico: in generale è più conveniente il metodo sopra.
# Altra nota: in teoria dd andrebbe fatto usando piu' memoria di quella di sistema (per essere sicuri di non avere cache da memoria). L'uso di conv dovrebbe minimizzare questa richiesta.
echo ""
echo "Sequential Write Test:"
sudo sync; (echo 3 | sudo tee /proc/sys/vm/drop_caches) > /dev/null
#time ...
sudo dd if=/dev/zero of=$2/_speedtest.DELETEME bs=$DD_BLOCK_SIZE count=$DD_BLOCK_COUNT conv=fdatasync 2>&1 | grep -v record

echo ""
echo "Sequential Read Test:"
sudo sync; (echo 3 | sudo tee /proc/sys/vm/drop_caches) > /dev/null
#time ...
sudo dd if=$2/_speedtest.DELETEME of=/dev/null bs=$DD_BLOCK_SIZE count=$DD_BLOCK_COUNT 2>&1 | grep -v record

sudo rm $2/_speedtest.DELETEME

Commenti

Non ci sono ancora commenti.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I commenti vengono pubblicati dopo la moderazione.