Avanti Indietro Indice

4. Suggerimenti per le prestazioni

Ecco qua un po' di trucchi che si possono usare se si soffre di una basso throughput Ethernet o per guadagnare un po' di velocità nei trasferimenti ftp.

Il programma ttcp.c è un buon test per misurare la velocità di throughput. Un altro modo comunemente usato è di fare un ftp> get grosso_file /dev/null dove grosso_file è >1MB e risiede nel buffer di Tx della macchina (si faccia il `get' almeno due volte, poiché la prima volta si appronterà la cache del buffer nella macchina di trasmissione). Si deve mettere il file nella cache del buffer perché non si è interessati ad includere nella misura la velocità di accesso ai file dal disco. Questo è anche il motivo per cui si inviano i dati in ingresso a /dev/null piuttosto che dentro il disco.

4.1 Concetti generali

Anche una scheda a 8 bit è in grado di ricevere pacchetti back-to-back (uno dietro l'altro) senza alcun problema. Le difficoltà nascono quando il computer non riesce a estrarre i pacchetti ricevuti dalla scheda abbastanza velocemente da far spazio ai pacchetti in arrivo. Se il computer non libera abbastanza velocemente la memoria della scheda dai pacchetti già ricevuti, la scheda non avrà spazio per mettere i nuovi pacchetti.

In questo caso o si scartano (drop) i nuovi pacchetti oppure si scrivono sopra a quelli già ricevuti (overrun). In entrambi i casi si interrompe seriamente il flusso regolare del traffico causando/richiedendo la ritramissione e degradando seriamente le prestazioni anche di un fattore 5!

Le schede con a bordo più memoria possono fare la ``bufferizzazione'' di più pacchetti e quindi gestire grossi picchi (burst) di pacchetti back-to-back senza perderne nessuno. D'altra parte ciò significa che la scheda non necessita più di una bassa latenza dal computer riguardo all'estrazione dei pacchetti dal buffer per evitare la perdita di pacchetti.

La maggior parte delle schede a 8 bit hanno un buffer da 8kB e la maggior parte di quelle a 16 ne hanno uno da 16kB. La maggior parte dei driver di Linux riserva 3kB del buffer per due buffer Tx, quindi nel caso di una scheda a 8 bit rimangono solo 5kB di spazio per la ricezione. Questo spazio è sufficiente solo per tre pacchetti Ethernet a dimensione massima (1500 byte).

4.2 Schede ISA e velocità del bus ISA

Come menzionato in precedenza, se i pacchetti sono rimossi abbastanza velocemente dalla scheda allora la condizione di drop/overrun non avverrà anche se la dimensione del buffer per i pacchetti Rx è piccola. Il fattore che determina la frequenza con la quale i pacchetti sono rimossi dalla scheda e messi nella memoria del computer è la velocità del percorso dati che collega le due, ovvero la velocità del bus ISA (se la CPU è un vecchio e lento 386sx-16 allora anche questo avrà la sua influenza).

Il clock del bus ISA raccomandato è circa 8Mhz, ma molte schede madri e dispositivi periferici possono essere fatti funzionare a frequenze più elevate. La frequenza di clock per il bus ISA solitamente può essere impostata nel CMOS setup, selezionando un divisore della frequenza di clock della scheda madre/CPU. Alcune schede madri ISA e PCI/ISA possono non avere questa opzione e quindi si è incastrati nelle impostazioni di fabbrica.

Per esempio, ecco qui alcune velocità di ricezione misurate dal programma TTCP su un 486 a 40Mhz, con una scheda a 8 bit WD8003EP, a diverse velocità del bus ISA.


        Velocità bus ISA (MHz)     Rx TTCP (kB/s)
        ----------------------    --------------
        6.7                       740
        13.4                      970
        20.0                      1030
        26.7                      1075

Voglio vedere chi riesce a far meglio di 1075kB/s con una qualsiasi scheda Ethernet a 10Mb/s usando TCP/IP. Comunque, non ci si aspetti che qualsiasi sistema funzioni a velocità del bus ISA molto elevate. La maggior parte dei sistemi non funzioneranno correttamente a velocità superiori a 13MHz (inoltre, in alcuni sistemi PCI la velocità del bus ISA è fissata a 8 Mhz, cosicché l'utente finale non ha la possibilità di incrementarla).

Oltre a una velocità di trasferimento più elevata, si trarrà anche beneficio da una riduzione nell'uso della CPU dovuta alla durata minore dei cicli di memoria e di I/O (si noti che anche i dischi fissi e le schede video presenti nel bus ISA mostreranno solitamente un aumento delle prestazioni dovuto all'incremento della velocità del bus ISA).

Ci si assicuri di fare un back up dei propri dati prima di fare esperimenti con velocità del bus ISA superiori agli 8Mhz e di controllare accuratamente che tutte le periferiche ISA funzionino correttamente dopo aver fatto qualsiasi incremento alla velocità del bus.

4.3 Impostare la finestra TCP di ricezione (TCP Rx Window)

Ancora una volta, le schede con poca memoria RAM a bordo e percorsi dati tra la scheda e la memoria del computer relativamente lenti avranno problemi. L'impostazione predefinita per la finestra di ricezione TCP è di 32kB, il che significa che un computer veloce nella sottorete a cui appartiene la propria macchina, può scaricare in quest'ultima 32kB di dati senza fermarsi per controllare se tutti sono stati ricevuti correttamente.

Le versioni recenti del comando route hanno la possibilità di impostare al volo la dimensione di questa finestra. Solitamente la riduzione della dimensione di questa finestra è necessaria solo per la rete locale, poiché i computer che sono dietro ad un paio di router e gateway sono abbastanza `bufferizzati' da non porre problemi. Un esempio d'uso potrebbe essere:


        route add <qualcosa> ... window <dim_fin>

dove dim_fin è la dimensione della finestra che si vuole usare (in byte). Una scheda 3c503 a 8 bit su un bus ISA che va a 8Mhz o meno dovrebbe funzionare bene con una dimensione della finestra di circa 4kB. Una finestra troppo grande causerà drop e overrun dei pacchetti e una riduzione drastica del throughput. Si può verificare lo stato operativo facendo cat /proc/net/dev che mostrerà tutte le situazioni di drop/overrun avvenute.

4.4 Incrementare le prestazioni NFS

Alcuni hanno scoperto che l'uso di una scheda a 8 bit in client NFS causa prestazioni più povere di quelle che ci si aspetta, quando si usa la dimensione dei paccheti NFS di 8kB (nativa della Sun).

Una possibile causa per questa cosa potrebbe essere la differente dimensione del buffer a bordo tra schede a 8 e 16 bit. La dimensione massima di un pacchetto Ethernet è circa 1500 byte. Affinché arrivi un pacchetto NFS di 8kB ci vogliono circa sei pacchetti back to back Ethernet di dimensione massima. Sia le schede a 8 bit che quelle a 16 non hanno problemi a ricevere pacchetti back to back. Il problema sorge quando la macchina non rimuove in tempo i pacchetti dal buffer della scheda e il buffer va in overflow. E nemmeno il fatto che le schede a 8 bit necessitano di un ulteriore ciclo di bus ISA per ogni trasferimento aiuta. Quel che si può fare se si ha una scheda a 8 bit è di impostare la dimensione del trasferimento NFS a 2kB (o anche 1kB) o provare a incrementare la velocità del bus ISA per far sì che il buffer della scheda venga ripulito più velocemente. Ho scoperto che una vecchia scheda WD8003E a 8MHz (senza altro carico di sistema) può sostenere grosse ricezioni a dimensioni NFS di 2kB, ma non a 4kB, dove le prestazioni si degradano di un fattore tre.

D'altra parte, se l'opzione predefinita di mount è di usare la dimensione di 1kB e si ha almeno una scheda isa a 16 bit, si troverà un incremento significativo nel passare a 4kB (o anche 8kB).


Avanti Indietro Indice