Gentoo Logo

Disclaimer : La versione originale di questo articolo è stata pubblicata da IBM developerWorks ed è di proprietà di Westtech Information Services. Questo documento è una versione aggiornata dell'articolo originale, e contiene numerosi miglioramenti apportati dal Gentoo Linux Documentation team.
Questo documento non è mantenuto attivamente.


Guida alla stabilità dell'hardware Linux, parte 2

Indice:

1.  Driver

Le molte cause di instabilità

Un problema di stabilità non è quasi mai causato da un hardware difettoso, ma da una impropria configurazione dell'hardware o da driver sbagliati. La mia esperienza in questa area è iniziata quando ho cercato di utilizzare Linux con la mia Diamond Viper V550, una scheda grafica NVIDIA TNT, usando il driver proprietario NVIDIA con accelerazione grafica.

NVIDIA ha i propri driver grafici per Linux, sviluppati in collaborazione con SGI e VA Linux. Questi driver hanno parecchi vantaggi rispetto i driver standard NVIDIA, solamente 2D, inclusi in XFree86 4.0. Uno su tutti, supportano interamente l'accelerazione 3D. Ancora meglio, eseguono una versione ufficiale di OpenGL 1.2, invece di una versione appena migliorata di Mesa. Cosi, in definitiva, questi driver accelerati sono quelli che voi vorreste utilizzare se possedeste una scheda grafica NVIDIA, almeno in teoria. Il mio tentativo di farli lavorare al meglio è stato, come minimo, una eccellente esperienza di apprendimento.

Dopo aver installato i driver NVIDIA con accelerazione per Linux (si veda Risorse al termine di questo articolo), ho riavviato XFree86 e iniziato a "giocare" con le mie applicazioni 3D, ora magnificamente accelerate come dovrebbe essere. Fino a quel momento, avevo dovuto utilizzare Windows NT per approfittare dei vantaggi della accelerazione 3D. Tuttavia, dopo circa un'ora, le mie aspirazioni di utilizzare il 3D in Linux hanno subito una battuta d'arresto -- la mia macchina si è bloccata. Il mouse ha smesso di muoversi, il mio schermo si è congelato e ho dovuto riavviare il mio sistema.

Si, stavo avendo alcuni problemi di stabilità. Ma non sapevo esattamente cosa stava causando il problema. Avevo un hardware difettoso, o era la scheda malconfigurata? Oppure era un problema con il driver -- a cui non piaceva la mia schedamadre VIA KT133 per Athlon? Qualunque fosse il problema, volevo risolverlo velocemente. In questo articolo, condividerò con voi la procedura con la quale ho risolto i miei problemi di stabilità dell'hardware. Sebbene voi potreste non lottare esattamente con gli stessi problemi, i passi che io ho utilizzato per diagnosticare e (probabilmente) risolvere il problema sono generalmente validi e applicabili a molti diversi problemi di hardware con Linux.

Primo, l'hardware

La prima cosa che mi passò per la mente era che potevo avere dell'hardware difettoso o poco raffreddato. Da un lato, la mia Diamond Viper V550 sembrava non avere problemi sotto Windows NT. Dall'altro, probabilmente Linux in qualche maniera sollecitava di più il mio hardware generando blocchi per sovratemperatura. La mia V550 diventava estremamente calda, e il suo sistema di raffreddamento originale sembrava a malapena sufficiente. La combinazione dei blocchi e il fatto che la scheda era poco raffreddata mi convinse ad acquistare una ventola con estrattore di calore integrato per la mia V550 (si veda Risorse).

Cosi, ricevuto il mio nuovo dissipatore, ho tolto l'originale sulla scheda video (facendo decadere la garanzia), pulito il chip TNT e montato il nuovo dissipatore. Verdetto? La mia scheda video non era più estremamente calda ora, ma i blocchi continuavano. La lezione insegnatami da questa particolare esperienza è questa -- Se ci si è assicurati che i sistemi sono adeguatamente raffreddati, non ci si deve preoccupare dei malunzionamenti dovuti a raffreddamento inadeguato. Questa è una buona ragione per investire un po' di tempo e lavoro per assicurarsi che le vostre workstation e i vostri server lavorino con un buon raffreddamento. Ora che mi ero occupato del problema del raffreddamento, sapevo che i blocchi non erano probabilmente dovuti ad hardware difettoso e ho iniziato a guardare altrove.

Nuovi driver -- e una possibile soluzione?

Sospettavo che i driver NVIDIA fossero loro stessi in parte causa del problema. Fortunatamente, una nuova versione dei driver era appena stata realizzata, cosi immediatamente ho aggiornato, sperando che questo risolvesse i miei problemi di stabilità. Sfortunatamente non fu cosi e, dopo aver parlato con altri sul canale #nvidia di openprojects.net, ho capito che mentre nessuno era in grado di ottenere driver stabili, i driver funzionavano per molte persone.

In #nvidia, qualcuno suggerì di verificare che la V550 non condividesse un IRQ con un'altra scheda. Diversamente dal driver standard di XFree86, il driver NVIDIA con accelerazione richiede un indirizzo IRQ per il proprio funzionamento. Per verificare se il driver avesse un proprio IRQ dedicato, ho eseguito il comando cat /proc/interrupts, ed ecco! guarda! la mia scheda video condivideva un indirizzo con il mio controller IDE. Prima di spiegare come risolvere questo problema particolare, vi darò un abreve spiegazione sugli IRQ.

I PC usano gli IRQ e gli indirizzi hardware in generale, per permettere alle periferiche, come le schede video e i controller degli hard-disk, per informare la CPU che hanno dei dati pronti per essere trattati. Nel passato, prima che esistessro i bus PCI, era rigorosamente necessario che ogni dispositivo avesse un proprio IRQ dedicato. Nel caso in cui stiate ancora usando delle periferche ISA nella vostra macchina, questo è ancora necessario e tutti i dispositivi non PCI dovrebbero avere un proprio IRQ dedicato.

2.  IRQ

IRQ e PCI

Comunque, le cose sono un po' differenti con il bus PCI. PCI riserva quattro IRQ che possono essere utilizzate dalle schede PCI/AGP nel sistema. In generale, questi IRQ possono essere condivisi tra diversi dispositivi. (Se si fa questo, siate certi che tutti i dispositivi che condividono [gli IRQ] siano PCI o AGP.) La condivisione degli IRQ è importante, specialmente per le machine moderne che hanno cinque PCI ed uno slot AGP. Senza la condivisione degli IRQ, non si sarebbe in grado di avere più di quattro schede che utilizzano gli IRQ nel sistema.

Ci sono, tuttavia, alcune limitazioni alla condivisione di IRQ per PCI. Mentre i BIOS delle moderne schedemadri e il Linux kernel generalmente supportano la condivisione di IRQ per PCI, alcune schede video possono semplicemente rifiutarsi di lavorare correttamente quando condividono un IRQ con un altro dispositivo. Se avete blocchi casuali del sistema, specialmente blocchi che appaiono correlati con l'uso di un dispositivo hardware specifico, potreste volere cercare di imporre che tutti i vostri dispositivi PCI usino un loro proprio IRQ, giusto per essere sicuri. Il primo passo è vedere se nel vostro sistema ci sono degli IRQ condivisi. Per far questo, seguite questi passi:

  1. Utilizzare i diversi dispositivi hardware nel sistema, come hard-disk, audio, video, SCSI, etc. Questo assicurerà che Linux maneggerà gli indirizzi di questi diversi dispositivi.
  2. cat /proc/interrupts, che mostrerà una lista con tutti gli indirizzi che il kernel ha maneggiato fin dall'inizio. Osservate la colonna all'estrema destra in quella lista. Se due o più dispositivi sono elencati in una singola riga, significa che stanno condividendo quel particolare IRQ.

Se uno di quei dispositivi non è un dispositivo PCI (ISA o altre schede legacy), avete trovato voi stessi un conflito di IRQ, che potete tentare di risolvere con il vostro BIOS, con il pacchetto isapnptools, o con i jumper fisici sulle vostre schede periferiche. Fate attenzione che se il vostro dispositivo è costruito nella vostra scheda madre, è molto probabile che sia un dispositivo PCI che non occupa uno slot fisico PCI.

Se tutti i dispositivi in questione sono PCI o AGP, avere o non avere un problema dipende dal vostro hardware. Qui ci sono alcuni passi con i quali potete tentare di stabilire per i vostri dispositivi PCI/AGP i loro IRQ:

  1. Entrate nel BIOS del vostro sistema e disabilitate ogni periferica non utilizzata (USB, porte parallele, etc). Questo libererà parecchi IRQ, dando un ogni parte di hardware in uso una maggiore possibilità di ottenere un unico ed esclusivo IRQ.
  2. Entrate nella sezione PnP del vostro BIOS e siate sicuri che il vostro BIOS sia configurato per un sistema operativo "non PnP". Selezionate l'opzione "Reset ESCD data". Questo forzerà il vostro BIOS a riassegnare gli IRQ a tutti i dispositivi al vostro prossimo riavvio.
  3. Avviate Linux, utilizzate il vostro hardware, cat /proc/interrupts e guardate il risultato. Probabilmente, tutti i vostri dispositivi avranno un loro esclusivo IRQ.

Se sospettate che due vostri dispositivi PCI stiano ancora condividendo un IRQ, avete ancora due opzioni. Alcuni BIOS permettono di assegnare alcuni IRQ ad uno slot PCI specifico. Se possedete uno di queti rari BIOS configurabili, potete usare queste funzionalità per eliminare i conflitti. Se non avete questa opzione nel vostro BIOS (molti non ce l'hanno), c'è un altro modo sicuro per risolvere questo problema -- Spegnete la macchina, staccate l'alimentazione e aspettate alcuni minuti. Ora, aprite il case e rimuovete fisicamente le schede dai differenti slot. Queta opzione può sembrare un po' strana, ma funzionerà sicuramente, specialmente se avete pochi slot PCI liberi nel vostro sistema (ma potrà farvi perdere un po' di tempo per trovare la corretta disposizione per ognuna delle vostre schede).

Io ho ottimizzato il "trucco di permutazione delle schede PCI" e sono stato abile nel permettere a tutti i miei dispositivi di usare un unico IRQ. O quasi. Come potete osservare, due dei miei hard-disk ancora condividono un IRQ:

Codice 2.1: IRQ condivisi

# cat /proc/interrupts
           CPU0
  0:   52063600          XT-PIC  timer
  1:     616810          XT-PIC  keyboard
  2:          0          XT-PIC  cascade
  5:      89084          XT-PIC  ide2, ide3
  7:    1515741          XT-PIC  eth0
  8:     155928          XT-PIC  rtc
  9: 1139761505          XT-PIC  nvidia
 10:     164000          XT-PIC  Ensoniq AudioPCI
 12:    4458823          XT-PIC  PS/2 Mouse
 14:     664176          XT-PIC  ide0
 15:      38661          XT-PIC  ide1
NMI:          0
ERR:          0

Tuttavia, questo è normale poichè i dispositivi IDE2 e IDE3 sono integrati nello stesso chip del mio Promise FastTrak IDE Card

cosi, ora (quasi) tutti i miei dispositivi hanno un solo IRQ, ho utilizzato i miei driver con accelerazione e... un nuovo blocco in meno di un ora. Apparentemente, la condivisione di IRQ tra PCI non era il solo problema. Oh, bene ... è tempo di cercare altrove (ancora una volta).

Risolto un problema, trovane un altro

Dopo un po' di tempo, ho trovato qualcosa d'altro che avrei potuto fare affinché i driver NVIDIA funzionassero perfettamente, sebbene più lentamente -- disabilitare AGP. Anche se non volevo farlo, l'ultima versione dei driver permetteva alla AGP di essere disabilitata interamente semplicemente aggiungendo una linea in XF86Config. Con AGP disabilitata, avevo ridotto la larghezza di banda della mia memoria video di 4 volte, ma un 3D significativamente più lento era molto più veloce di un hardware completamente senza un'accelerazione 3D. Dopo aver disabilitato AGP avevo finalmente un sistema stabile! Tuttavia, questa soluzione temporanea creava un altro problema. Ogni volta che una animazione 3D OpenGL era in funzione, l'audio diventava estremamente confuso e disturbato. Aha!

Fortunatamente ero in grado di trovare una soluzione al mio problema audio. Ho utilizzato l'utility setpci per fissare più appropriatamente il tempi di latenza del bus PCI per i miei dispositivi PCI. Vi mostrerò la soluzione in particolare tra poco -- ma prima qualche spiegazione.

Come probabilmente sapete, il bus PCI è una risorsa condivisa -- tutte le schede PCI hanno un turno per la comunicazione sul bus, e normalmente, va tutto bene. Tuttavia, poichè il bus PCI è una risorsa condivisa con una banda limitata (di solito adeguata), è possibile che una scheda influisca negativamente sulle prestazioni delle altre schede nel sistema. Per esempio, che cosa succederebbe se la scheda PCI A stesse inviando dati attraverso il bus e nello stesso momento la scheda B tentasse di spedire dei dati? La scheda A potrebbe garbatamente concedere l'uso del bus, o continuerebbe con il suo trasferimento dati -- e se cosi fosse per quanto tempo?

3.  Stati latenti di PCI

Il tempo degli stati di latenza di PCI

La risposta a questa domanda dipende sempre dai parametri di configurazione di ogni dispositivo PCI, il tempo dello stato di latenza di PCI. Normalmente è il modello del driver Linux a fissare il valore del tempo di latenza di ogni dispositivo PCI, e il più delle volte il valore è adeguato (per non dire ottimo), tutti i dispositivi funzionano bene e il sistema lavora adeguatamente. Il tempo di latenza può variare da zero a 248. Se il dispositivo è configurato a zero, darà immediatamente il bus ad un altro dispositivo che ha la necessità di trasmettere. Se il dispositivo è impostato a 248, continuerà ad usare il bus per un lungo periodo prima di fermarsi, mentre l'altro dispositivo aspetterà il suo turno.

Se tutti i dispositivi sono configurati con tempo di latenza relativamente alto e molti dati devono essere spediti attraverso il bus, allora le schede PCI generalmente dovranno aspettare più a lungo prima di ottenere il controllo del bus e poter iniziare a trasmettere i dati. Una volta ottenuto il controllo del bus, saranno in grado di spedire una grande quantità di dati attraverso di esso prima di dare il bus ad un altro dispositivo. Questo perchè un alto valore del tempo di latenzaaumenta la latenza (il ritardo tra la richiesta e il momento in cui viene ceduto il controllo del bus), ma anche aumenta la larghezza di banda effettiva. Ogni dispositivo invia una grande quantità di dati attraverso il bus senza interruzioni, il bus PCI è usato in modo più efficiente e il bus PCI può trasmettere più dati.

D'altra parte, se tutti i tuoi dispositivi PCI hanno un basso valore del tempo di latenza, allora concederanno velocemente il bus se un'altro dispositivo richiede di trasmettere dati. Questo significa che una minore quantità di dati rimane in attesa, dato che nessun dispositivo mantiene il controllo del bus per un lungo periodo di tempo, lasciando gli altri dispositivi in attesa. Lo svantaggio di tutto questo è che un basso valore del tempo di latenza riduce l'effettiva larghezza di banda quando due o piu dispositivi PCI stanno operando simultaneamente. Questo succede perchè l'invio di una grossa quantità di dati diventa molto meno frequente e il controllo del bus cambia spesso, incrementando l'overhead.

Molte distribuzioni Linux includono una suite di tool chiamati pci-utils che permettono di vedere e cambiare il tempo di latenza per i dispositivi PCI. Per vedere i vostri tempi di latenza, eseguite:

Codice 3.1: Vedere i valori dei tempi di latenza

# lspci -v

Eseguendo questo comando compariranno informazioni molto dettaliate di tutti i vostri dispositivi PCI. I valori dei tempi di latenza di ogni dispositivo sono elencati nella terza riga, prima del valore degli IRQ.

Approci alla latenza di PCI

Come tutto questo è collegato al mio problema di audio confuso? Avevo audio distorto perchè, per come i tempi di latenza erano impostati, la V550 dominava il bus PCI quando eseguiva accelerazioni 3D. Infatti, la mia V50 è una scheda AGP 2X, cosi quando ho disabilitato AGP (per incrementare la stabilità), avevo ridotto la larghezza di banda alla memoria principale del 75%! Poichè ora la mia V550 stava cercando di pompare la stesa quantità di dati attraverso il bus PCI più lento, il bus era vicino al 100% dell'utilizzo, e questo stava causando i problemi al mio hardware audio. I dispositivi audio sono particolarmente sensibili alla latenza di PCI poichè generalmente hanno un buffer dati piccolo e hanno bisogno che i loro dati vengano trasmessi in tempo per evitare buffer underrun. Con la mia configurazione, la V550 stava usando cosi tanto la larghezza di banda del PCI che non ce ne era abbastanza per i dati della mia scheda audio e il fenomeno dell'audio distorto era causato da buffer underrun.

Ci sono due possibili soluzioni a questo problema. La prima e più ovvia soluzione, sarebbe usare il comando setpci per ridurre il tempo di latenza della mia V550. Questa le consentirebbe di condividere il bus PCI più prontamente, permettendo algli altri dispositivi di trasmettere i loro dati con minore latenza. Ho provato questa soluzione usando il comando setpci e funziona. Tuttavia, ho deciso di non seguire questa strada poichè volevo massimizzare le mie prestazioni grafiche 3D già paralizzate senza aggiungere altri ostacoli.

Decisi di provare la seconda opzione per aumentare le prestazioni. Invece di ridurre la latenza del bus della V550, ho incrementato la latenza PCI di tutti gli altri dispositivi al valore relartivamente alto di 176 (normalmente i dispositivi hanno un valore di default di circa 32, ad eccetto della mia V550 che di default aveva 200). Dopo ho fissato la latenza dei miei dispositivi sensibili al massimo dei valori possibili, 248. Questo risolse il problema, come speravo, permettendo alla mia scheda video di trasmettere una relativamente grande quantità di dati attraverso il bus in una sola volta, ottimizzando l'uso del bus ed evitando condizioni di buffer underrun. Allo stesso tempo, i miei altri dispositivi possono trasmettere dati in quantità abbastanza piccole senza intasare il bus, ma abbastanza grandi da usare il bus in modo efficiente. Ero particolarmente compiaciuto con questa soluzione perchè risolveva i miei problemi audio mentre allo stesso tempo incrementavo la larghezza di banda effettiva del bus della mia macchina di sviluppo. Qui c'è la parte dello script di startup del mio sistema che implementa la soluzione:

Codice 3.2: Accorgimento per la latenza

# "open up" the PCI bus by allowing fairly long bursts
# for all devices, increasing performance
setpci -v -d *:* latency_timer=b0

# maximize latency timers for network and audio,
# allowing them to transmit more data per burst,
# preventing buffer over/underrun conditions

setpci -v -s 00:0f.0 latency_timer=ff
setpci -v -s 00:0e.0 latency_timer=ff

Nella prima riga, l'opzione -d *:* dice a setpci di applicare il comando a tutti i dispositivi PCI. L'opzione latency_timer=b0 fissa il tempo di latenza a 176 (b0 è la notazione esadecimale di 176). L'opzione -s nelle due ultime righe specifica i dispositivi PCI, che saranno interessati dal comando, attraverso il numero dello slot del bus, invece che il nome e l'ID del dispositivo. Il numero dello slot è il primo che compare per ogni dispositivo quando si esegue setpci. Il valore ff indica un tempo di latenza di 256, che viene diminuito a 248 da setpci. Se avete problemi di latenza PCI, dovrete sperimentare con i comandi lspci e setpci per trovare i valori ottimali per il vostro sistema. Se il vostro hardware lo permette, valori alti del tempo di latenza sono i migliori.

Risorse

Spero abbiate trovato il mio problema hardware un buon esempio per imparare. Ora sto pazientemente aspettando la prossima realise dei driver NVIDIA. Speriamo che questi risolvano i problemi legati alla stabilità di AGP. Più sotto troverete molte risorse interessanti che riguardano NVIDIA che potrebbero interessarvi.

  • Leggete il precedente articolo di Daniel di questa serie, Guida alla stabilità dell'hardware Linux, parte 1, nel quale è mostrato come diagnosticare e risolvere errori della CPU flakiness e come testare i difetti della RAM.
  • Controllate i driver NVIDIA con accelerazione per LInux.
  • Se state cercando di diagnosticare i problemi relativi alle schede grafiche NVIDIA, controllate le GeForce FAQ. Ci sono molte informazioni interessanti per Linux e Windows.
  • Per ulteriori informazioni sui problemicon NVIDIA, controllate la NVIDIA Guide di Sven Vermeulen.
  • Potreste voler controllare il Linux Powertweak project. Powertweak permette di configurare i tempi di latenza (oltre ad altro) usando una interfaccia grafica basata su GTK.
  • Visitate PC Power and Cooling per acquistare dissipatori ventole integrate ed altro.
  • Controllate la serie Lasagna della Tennmax, che sulla base della mia esperienza hanno un ottima capacità di raffreddamento.

Note sull'autore

Daniel Robbins vive ad Albuquerque, New Mexico (USA). Era presidente/CEO della Gentoo Technologies Inc, Chief Architect del Gentoo Project ed è co-autore di parecchi libri pubblicati da MacMillan: Caldera OpenLinux Unleashed, SuSE Linux Unleashed, and Samba Unleashed. Daniel è stato affascinato dai computer fin dalla seconda elementare, quando fu esposto per la prima volta al linguaggio di programmazione Logo e a una dose letale di PacMan. Questo probabilmente spiega perchè ha lavorato come Lead Graphic Artist alla SONY Electronic Publishing/Psygnosis. Daniel ama passare il suo tempo con sua moglie Mary e la sua bambina Hadassah. Potete contattare Daniel al suo indirizzo mail, Daniel Robbins.



Stampa

Aggiornato il 9 ottobre 2005

Oggetto: In questo articolo, Daniel Robbins mostra le sue esperienze con la scheda grafica NVIDIA TNT in Linux usando i driver di NVIDIA con accelerazione. Mostrerà come diagnosticare e fissare gli IRQ e i tempi di latenza PCI -- tecniche che potrete usare sicuri di non avere blocchi, comportamenti inconsistenti e perdite di dati.

Daniel Robbins
Autore

Danilo Bazzani
Traduttore

Donate to support our development efforts.

Copyright 2001-2014 Gentoo Foundation, Inc. Questions, Comments? Contact us.