[Postscript] [Postscript] [About] [Copertina] [Tar] [Tar]

Articoli


E-IDE e FAST-ATA in ambiente Linux.

La nascita negli ultimi due anni dei nuovi standard E(nhanced)-IDE e Fast-ATA accompagnata dall'introduzione di nuovi Harddisk e Controller ha comportato un'ondata di instabilita' tra gli utenti spinti dalla perenne "fame" di potenza per il proprio PC. Nell'indecisione di quali aggiunte o modifiche fare su come aggiornare il proprio sistema spesso si assiste a vere competizioni di benchmark su chi riesce a spremere qualche kbyte in piu' dal proprio HardDisk.

Non vuole essere prerogativa di questo articolo lo studio di possibili soluzioni hardware su come ottenere le "massime" prestazioni con le varie combinazioni di hardisk e/o controller disponibili sul nostro mercato ma semmai come muoversi nel "mondo Linux" per sfruttare al meglio il proprio hardware, inteso come accoppiata disco controller. Mi riferisco ad una utility che forse non molti conoscono l'hdparm la quale permette di settare e/o attivare via software le speciali caratteristiche presentate dai nuovi standard quali EIDE o Fast-ATA (ATA2, ATA3, Ultra-ATA) sui nostri nuovi hardisk.

Generalmente in altri ambienti operativi come Dos, Windows, 95, NT e OS/2 vengono gia' fornite delle utilita' accompagnate al prodotto, hardisk o controller che sia, che si occupano di sostituire i driver del nostro sistema operativo con nuovi o piu' aggiornati e settare al meglio le modalita' di trasferimento dati.

Sotto Linux non mi e' mai capitato di trovare qualche "magico" dischetto autoformattante :^) o modificatore di MBR, mi riferisco ad esempio ad una utility molto diffusa come l' ONTRACK Manager che si ritrova spesso su hardisk quali Quantum , Seagate o Western Digital . Ma Linux non sta a guardare infatti riporta queste sue potenzialita' nel Kernel. Una opportuna ricompilazione di quest'ultimo rende possibile includere e supportare tutte le nuove specifiche dei vari standard ATA, Fast-ATA, ATAPI (CDROM) del nostro nuovo HD. Pero' queste inclusioni si rivelano essere piu' potenzialita', infatti al momento del boot non vengono attivate per questioni di sicurezza , si pensi ad un vecchio hardisk che povera fine farebbe. Dischi piu' recenti sanno riconoscere i propri limiti e non permettono modi di trasferimento non supportati.
Come risvegliare allora queste capacita' nascoste di Linux?
Ci viene appunto incontro l'hdparm che si occupa appunto di attivare tutte quelle peculiarita' del nostro hardisk o settare modi di trasferimento tali da renderlo piu' prestante. Nulla da invidiare quindi alle spettacolari utility di altri sistemi operativi (Turbo Mode? Y format...done.:-). Inoltre ad accompagnare l'hdparm per un piu' semplice utilizzo si puo' utilizzare un'utility l'hdtool che risulta essere uno script in Tk/Tcl per avere un'applicazione con interfaccia grafica sotto X.

Prestazioni con EIDE e FAST-ATA.

Prima di passare in dettaglio all'uso dell'hdparm e' doveroso spendere qualche parole sulle reali prestazioni che si possono ottenere dall'utility. Una buona domanda che si pongono in tanti e' il mio drive e' veloce come dovrebbe esserlo? Per capire meglio prendo in riferimento la tabella tab.1



tipo bus

ampiezza bus

trasfer rate massimo

N.unita'

capacita' massima
IDE EIDE/FAST-ATA
ISA Bus Local Bus Local Bus
16 Bit 16 Bit
3Mb/sec 5Mb/sec 10,13 o 16Mb/sec *
2 4
528 MByte 8,4 GByte
*
transfer
rate
massimo
10 MByte/sec. con Pio Mode 3
13 MByte/sec. con DMA Mode 1
16 MByte/sec. con DMA Mode 4,Pio Mode 4

tab.1

I valori che sicuramente interessano maggiormente sono i valori di transfer rate massimo. Quindi con EIDE si parla di miglioramento di trasferimento di grandi file e accesso ai dati sequenziale. Il tempo d'accesso e' principale caratteristica dell'HD stesso. Esistono varie modalita' di trasferimento chiamate PIO Mode o DMA Mode e queste devono per inteso essere supportate sia dal disco che dal controller per essere attivate. La prima cosa da puntualizzare e' che i dati sono dati teorici e che non rappresentano la velocita' con cui attualmente il disco riesce a leggere o scrivere sul supporto magnetico, ma la velocita' con cui i dati vengono scambiati dalla CPU alla cache buffer del disco ed e' inteso che il dato fornito e' nel caso piu' ottimistico in cui il dato sia gia' pronto in cache. In realta' c'e' tutta una serie di operazioni prima che il dato venga "caricato" in cache (ricerca del dato su disco, etc.. tutto poi all'attenzione del controller che a volte rappresenta la causa limitante delle reali prestazioni del disco). Detto questo e in base al benchmark utilizzato (l'hdparm si presta anche a questa funzione), aspettatevi un transfer rate variabile da 1Mb a 9Mb. "Il vero test e' come i nuovi standard migliorino le nostre applicazioni giorno per giorno" e l'hdparm puo' aiutarci in questo.

Hdparm v3.1. - Uso e Configurazione

L'utilizzo dell'hdparm risulta abbastanza semplice, e' un programma che puo' essere lanciato da una linea di comando oppure come consigliato, avviato al momento del boot da uno degli script in rc.d , solitamente lo si inserisce in rc.local. Prima di arrivare a questo pero' occorre essere sicuri delle funzioni che si vogliono attivare sul nostro disco. Cosa fondamentale e che si dara' scontata da qui in poi e' che sia il controller che il disco devono supportare lo standard EIDE o FAST-ATA altrimenti non otterrete i risultati sperati per non dire eventuali rischi di danneggiamento del filesystem o disco stesso. Se ho un disco EIDE e un vecchio controller su bus ISA non ci sara' verso di ottenere alcun tipo di beneficio. Questo vale anche al viceversa , se ho un disco IDE e una nuova scheda madre con un controller o Chipset che supporta tutte le nuove specifiche EIDE sara' vano ogni tentativo di ottenere modalita' di trasferimento in PIO mode 3 o 4, il disco non riconoscerebbe il tipo di controllo.

Esistono varie versioni dell'hdparm, la piu' recente e' la 3.1 che pero' per essere sfruttata a pieno vuole una versione di kernel 2.0.10 o superiore in questo modo si potranno sfruttare tutte le nuove inclusioni dei driver EIDE e dei piu' recenti o usati chipset di controller vedi Triton, CMD640,... Esiste un legame molto stretto tra sviluppo del kernel e dell'utility, specie ultimamente con l'introduzione del supporto di numerosi chipset di controller. Versioni di kernel fino alla 2.0.10 supportano la versione 2.7 dell'hdparm che possiamo considerare come il requisito minimo; mentre l'utility vuole almeno un kernel 1.1.57 , 1.2.13 se volete le nuove specifiche dei nuovi driver EIDE. Le versioni di kernel successive hanno per lo piu' seguito l'evolversi dello standard e dei chipset di controller sul mercato per cio' che riguarda l'interfaccia IDE.

La prima operazione da seguire e' ricompilare il kernel. Prima di questo , per gli utenti piu' esperti, e' possibile eseguire delle modifiche sui file di inclusione di compilazione del kernel:

/usr/src/linux/drivers/block/hd.c
/usr/src/linux/drivers/block/ide.h
/usr/src/linux/drivers/block/ide_modes.h

hd.c :
E' possibile attivare al momento del boot funzioni tipo la modalita' multipla di lettura/scrittura
( multiple mode )

#define DEFAULT_MULT_COUNT 0 /* set to 0 to disable multiple mode at boot */

ide.h :
Qui vengono offerte le maggiori possibilita' per settare le funzionalita' del proprio hardisk.

/******************************************************************************
 * IDE driver configuration options (play with these as desired):
 * 
 * REALLY_SLOW_IO can be defined in ide.c and ide-cd.c, if necessary
 */
#undef REALLY_FAST_IO                   /* define if ide ports are perfect */
#define INITIAL_MULT_COUNT      0       /* off=0; on=2,4,8,16,32, etc.. */

#ifndef SUPPORT_VLB_SYNC                /* 1 to support weird 32-bit chips */
#define SUPPORT_VLB_SYNC        1       /* 0 to reduce kernel size */
#endif
#ifndef DISK_RECOVERY_TIME              /* off=0; on=access_delay_time */
#define DISK_RECOVERY_TIME      0       /*  for hardware that needs it */
#endif
#ifndef OK_TO_RESET_CONTROLLER          /* 1 needed for good error recovery */
#define OK_TO_RESET_CONTROLLER  1       /* 0 for use with AH2372A/B interface */
...

ide_modes.h :
Qui in realta' non c'e' nulla da modificare, pero' se siete cosi' sfortunati da avere un hardisk poco conosciuto, pero' ne conoscete le caratteristiche potete aggiornare la lista di hardisk riconosciuti dal kernel con relativo PIO mode.


        { "WDC AC2540",  3 },
        { "WDC AC2420",  3 },
        { "WDC AC2340",  3 },
         ...
        { "QUANTUM FIREBALL", 3 }, 
         ...
        { "***MIO HARDISK***" , X },
         ...

Se il tutto vi pare poco familiare non toccate nulle e ricompilate normalmente il kernel. Se conoscete il vostro chipset del controller includetelo nella compilazione se non ne siete sicuri potete provare una volta con tutti , alcuni chipset vengono riconosciuti all'atto del boot dal kernel stesso. Una volta installato il nostro nuovo kernel si esegue il boot e qui e' consigliabile passare alcuni parametri al boot loader LILO o simile che sia. Una funzione utile e' ideX=autotune oppure hdX=autotune . Questo richiede al kernel di provare il nostro hardware per ottenere la miglior modalita' di trasferimento supportata. In realta' esistono molte altre opzioni che possono essere ritrovate nel file di Documentazione allegato ai sorgenti del kernel:

/usr/src/linux/Documentation/ide.txt

alcune funzioni tipo forzamento della frequenza del bus o altre legate al nostro chipset possono risultare pericolose. Se il boot ha avuto successo possiamo loggarci come root e settare il nostro hardisk. Provate prima un hdparm -t /dev/hdX 2 o 3 volte. Questo ci restituira' un valore di benchmark di riferimento per il nostro hardisk.

/dev/hda:

Timing buffered disk reads: 16 MB in 9.47 seconds = 1.69 MB/sec

/dev/hdb:

Timing buffered disk reads: 16 MB in 4.96 seconds = 3.23 MB/sec

Di certo l'hdparm e' ricco di switches ed e' possibile consultare il manuale per una piu' dettagliata descrizione. Personalmente vorrei soffermarmi in particolare su quelli che reputo i piu' interessanti. La prima cosa da controllare sono le specifiche del nostro disco:

hdparm -i /dev/hdX


ci restituisce una dettagliata descrizione di cosa il nostro disco puo'fare con modalita' supportate e dati tecnici.
Ora possiamo iniziare ad attivare alcune funzioni. La prima e piu' comune e' l' accesso al disco a 32bit. Attenzione che si intende come il dato viaggia dal bus al controller, sia IDE che (E)IDE sono dischi con bus a 16bit.

hdparm -c1 /dev/hdX

abilita il trasferimento a 32bit, in particolare :
-c0 disabilita la funzione.
-c1 abilita la modalita' a 32bit.
-c2 abilita la modalita' a 16bit.
-c3 abilita la modalita' a 32bit con una funzione di sincronismo richiesta da molti tipi di chipset.

Altra particolarita' dello standard EIDE e' il trasferimento " modalita' multipla " o multisettore. E' una funzione dichiarata come benefica per la riduzione di carico che offre al disco. Il valore di settaggio varia da 0 (disabilitato) a 2,4,8,16,32...
Generalmente un valore di 16 o 32 e' un buon valore per il sistema sempre se risulta supportato dal disco:

hdparm -m16 /dev/hdX

Le seguenti funzionalita' vengono dichiarate come le piu' pericolose, specie se in possesso di chipset di controller quale il CMD-640 e RZ1000 ; anche se nelle versioni piu' recenti di kernel i bug relativi a questi chip sono stati risolti (CMD-640) e' sempre bene prima fare riferimento alla documentazione allegata ai sorgenti del kernel.

L'opzione -u1 viene chiamata interrupt-unmasking. In pratica Linux risulta piu' pronto nell'utilizzo degli interrupt e quindi migliora la gestione del disco.

L'opzione -X e' quella che si occupa di settare sul disco le modalita' di trasferimento per i nuovi dischi con specifiche (E)IDE-ATA2.

-X00 attiva il PIO Mode di default dell'hardisk
-X01 attiva il PIO Mode di default disabilitando il segnale di IO/READY
-X10 e' usato per attivare il controllo PIO MODE 2
-X11 e' usato per attivare il controllo PIO MODE 3
-X12 e' usato per attivare il controllo PIO MODE 4
...
-X34 e' usato per attivare la modalita' DMA2

Testati alcuni modi di trasferimento si puo' verificare con la funzione di benchmark offerta dall' hdparm quale settaggio effettivamente consente le migliori prestazioni al nostro disco. Una volta verificato cio' si puo' aggiungere nel nostro /etc/rc.d/rc.local la linea di comando :

------------------------------------------------------------------ sync
echo -n "Hdparm setting..."
/usr/sbin/hdparm -c1 -X12 -a16 -m16 -W1 /dev/hda
echo "done."
------------------------------------------------------------------
Che attiva la modalita' a 32bit , PIO Mode 4 sul primo disco.
Non rimane che rebootare il PC per verificare se la modifica ha portato l'effetto desiderato.
Buona Fortuna... :-)
Con l'hdparm ho ottenuto personalmente un incremento di prestazioni del 20% sul mio sistema che non sara' un 100% :-) ma che mi pare essere un buon risultato.
Concludo con una citazione...

Un utente di Usenet narra di avere un drive con prestazioni da 16Mb/sec...

"Usenet is like a herd of performing elephants with diarrhea--massive, difficult to redirect, awe-inspiring, entertaining, and a source of mind- boggling amounts of excrement when you least expect it." -- Gene Spafford ( spaf@cs.purdue.edu ) , 1992

-- Massimiliano Baki ( vanilla@dei.unipd.it )


[Postscript] [Postscript] [About] [Copertina] [Tar] [Tar]