Testare velocità unità disco

Tags: 

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.

  • 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.
  • 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

    Scrivi la risposta in lettere (ad esempio "tre" e non "3")