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.
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.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
Aggiungi un commento