Testare velocità unità disco
Inserito Mar, · aggiornato 2015-05-18 18:01
Per un valore facile da ottenere e abbastanza attendibile:
sudo hdparm -Tt --direct /dev/sdaRisultato:
/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/secNotare 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.imgRisultato:
252947+0 record dentro
252946+0 record fuori
2072137728 byte (2,1 GB) copiati, 47,1099 s, 44,0 MB/sDa 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_cachesIn 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.