Il "vero" transfer rate dal CD-ROM all'hard disk
Introduzione
Lo script che presento in questa pagina si basa su un'idea molto semplice per misurare la velocità di trasferimento continua dal lettore CD-ROM o dal masterizzatore all'hard disk.
Alla base di tutto sta la possibilità di effettuare la copia byte per byte di un intero CD-ROM con estrema facilità.
Infatti, supponendo che /dev/hdc corrisponda al lettore CD-ROM e il disco da cui si sta operando abbia abbastanza spazio libero, con il semplice comando
dd if=/dev/hdc of=immagine-iso.raw
si copia l'intero contenuto del CD-ROM nel file 'immagine-iso.raw', byte per byte.
Tale file può essere utilizzato come se fosse il CD-ROM stesso, ovvero montato e smontato come un normale disco.
Per provare ciò, supponendo di essere root e di disporre della directory /mnt/disk, basta digitare:
mount -o loop immagine-iso.raw /mnt/disk
A questo punto, il comando
ls /mnt/disk
visualizzerà il contenuto del CD-ROM come se fosse stato inserito fisicamente nel lettore.
Lo script
Veniamo al punto.
La copia byte a byte di un intero CD-ROM prescinde da qualsiasi organizzazione dei file sul disco. Ciò significa che un CD-ROM per Macintosh, per Unix o per Windows verranno trattati allo stesso modo: come un flusso ininterrotto di byte.
In questo modo la testina del lettore non deve effettuare alcuno spostamento supplementare oltre a quello richiesto per leggere le tracce dati. Non dovendo leggere directory, file e altre informazioni accessorie normalmente non contigue, non viene sprecato tempo a spostare la testina (tempo che normalmente è molto elevato in rapporto alla pura velocità di lettura dei dati); il flusso di byte è perciò continuo e proporzionale alla velocità di rotazione del disco.
L'idea alla base dello script è molto semplice: si "misura" ogni secondo la dimensione del file immagine ('immagine-iso.raw' nell'esempio precedente), si calcola la differenza tra due valori successivi e si trova in tal modo la quantità di dati trasferita dal CD-ROM al file (quindi all'hard-disk) in un secondo.
Naturalmente questo metodo è piuttosto rudimentale, tuttavia fornisce una indicazione complessiva che comprende non solo le caratteristiche del CD-ROM, ma dell'intero sottosistema di I/O (CD-ROM, hard disk, controller EIDE della scheda madre).
Inoltre, fornendo un dato ogni secondo permette di vedere come la velocità di trasferimento varia nel tempo, e di scoprire quindi eventuali difetti e/o inefficienze del lettore CD-ROM in funzione della posizione della testina.
Lo scrip è il seguente:
#!/bin/bash
attuale=`ls -l $1 | gawk '{print $5}'`
prec=$attuale;
while test 1 ; do
attuale=`ls -l $1 | gawk '{print $5}'`
let t_rate=$attuale-$prec
prec=$attuale
echo Actual size of file $1: $attuale
echo Tranfser rate: $t_rate B/s
sleep 1;
done
Il suo utilizzo è molto semplice. Supponendo di salvarlo nel file trate.bash (ricordatevi di renderlo eseguibile con il comando 'chmod u+x trate.bash'), basta lanciarlo con:
./trate.bash <nome del file da monitorare>
Spiegazione riga per riga
La prima riga è un commento speciale, che indica all'interprete dei comandi quale shell utilizzare per eseguire lo script (in questo caso bash).
La seconda inizializza la variabile attuale con la dimensione del file al momento del lancio dello script. '$1' viene sostituito con il nome del file fornito come argomento dello script.
La variabile prec memorizza la dimensione del file nel secondo precedente.
La condizione di stop del ciclo while è costante, quindi lo script 'gira' finchè non si preme CTRL-C.
La prima istruzoine del ciclo è identica alla prima riga dello script, e aggiorna la variabile attuale.
Il comando let premette di far effettuare alla bash operazioni aritmetiche, in questo caso la differenza tra le due dimensioni del file.
La variabile prec deve poi essere posta uguale al valore attuale. In questo modo quando viene effettuata la differenza tra attuale e prec, quest'ultima ha sempre il valore che la prima aveva nel ciclo precedente.
La prima istruzione echo può essere tranquillamente rimossa, in quanto mostra solo la dimensione attuale del file, unitamente al suo nome.
La seconda istruzione echo stampa la differenza calcolata precedentemente.
L'istruzione sleep sospende lo script per un secondo. In tal modo, l'aggiornamento della variabile attuale avviene (circa) ogni secondo. Perciò la differenza calcolata con let corrisponde (circa) alla quantità di dati scritta nel file in un secondo.
Note
- Non c'è alcun controllo di errore. Per esempio, se il file fornito come argomento è errato, lo script non se ne accorge.
Miglioramenti in questo senso sono semplici da implementare, ma, vista la semplicità e la specificità di questo scipt, per ora li ho ritenuti inutili.
Chi fosse interessato ad approfondire la conoscenza del linguaggio di programmazione della shell bash può leggere il bash-programming introduction HOWTO all'url: http://www.linuxdoc.org/HOWTO/Bash-Prog-Intro-HOWTO.htm
- L'utilizzo di uno script non permette grande precisione nella misurazione dei tempi. Oltre all'imprecisione intrinseca del comando 'sleep' bisogna considerare che, trascorso un secondo, prima di aggiornare la variabile 'attuale' debbono essere eseguiti due programmi: 'ls' e 'gawk'.
In condizioni di memoria sufficiente, tali programmi non vengono mai scaricati dalla RAM dopo la loro prima invocazione, per cui tutto il processo richiede al più qualche millisecondo (o meno, su processori recenti).
Nel caso in cui la memoria sia scarsa, l'eventuale caricamento da disco del codice dei due programmi allungherebbe l'intervallo di tempo tra due aggiornamenti successivi di 'attuale', pertanto verrebbe 'misurata' un tranfer rate più di quello reale.