
L'individuazione dei motivi per cui avviene un blocco o un malfunzionamento di un server Windows può essere un'attività davvero impegnativa. Quella di premere semplicemente il pulsante di reset è un'opzione che non è più ammessa da molte società che impiegano questi server in operazioni business-critical e in questo articolo analizzeremo le ragioni per cui un server Windows potrebbe bloccarsi.
Background
Quando Microsoft rilasciò le prime versioni del suo sistema operativo per server (Windows NT 3.5x e NT4), non esisteva un modo semplice per individuare i problemi che potevano causare il blocco di un server. Altri sistemi operativi molto diffusi, come per esempio VAX/VMS di Digital Equipment, offrivano alcuni vie di intervento manuale forzando un crash dump a partire dallo stato del server che poteva essere "catturato" nel momento del blocco. Lo stesso dump avrebbe potuto poi essere analizzato per determinare il motivo per cui il server si è bloccato. L'unica opzione per le prime piattaforme Windows, tuttavia, era di effettuare il reset della macchina.
Però il proliferare dei server Windows nel mondo business, ha fatto diventare assolutamente impercorribile la via che porta a premere il pulsante di reset. Di conseguenza, a partire da Windows 2000 Server, è diventato possibile forzare un crash dump per aiutare a determinare il motivo per cui il server si è bloccato. Microsoft ha introdotto questa funzione nel Knowledge Base 244139. Grazie a una combinazione di tasti (due volte CTRL destro + Scroll Lock) si può generare un crash dump usando tastiere PS/2.. Microsoft ha esteso questa funzionalità in Windows Server 2003 con un hotfix del driver Kbdhid.sys volto al supporto delle tastiere USB.
Esistono diverse altre opzioni per forzare un crash dump. Microsoft fornisce il comando Windows AmministrativeConsole (SAC) Crashdump come parte di Windows Emergency Management Services (EMS), che consente di avere un server “senza testa”, privo di console grafica locale. Ci sono anche vendor che propongono opzioni specifiche per forzare un crash dump, come per esempio HP con il comando Server Managed Processor TC (trasferimento di controllo) dei server Integrity, un tasto NMI (non-maskable interrupt) presente su alcuni modelli di Integrity, o il bottone virtuale NMI Integrated Lights Out (iLO).
Perché un server si blocca
C'è un insieme di motivi per cui un server potrebbe bloccarsi, sia hardware sia software. La più comune causa hardware è la ricezione di interrupt spuri da un dispositivo guasto. Per esempio, un controller dell'interfaccia di rete (NIC) può avere un componente difettoso o essere connesso a un cavo che produce falsi interrupt. Questi si verificano a un elevato livello di richiesta dell'interrupt (IRQL) e catalizzano l'attenzione del processore (o dei processori), facendo sì che richieste di priorità inferiore (livello utente) non abbiano risposta. Come risultato, il server sembra essersi bloccato.
Un altro esempio di blocco indotto dall'hardware riguarda le richieste di storage che rimangono senza risposta. Considerate, per esempio, il caso in cui un drive si guasta, per cui le richieste di I/O vengono tutte messe in coda. Tali richieste in attesa potrebbero innescare un effetto a cascata che porta al blocco dei processi dell'utente e del sistema, fino ad arrivare a un malfunzionamento del sistema nel suo complesso.
Più spesso, tuttavia, il blocco del server è il risultato di problemi relativi al software. Questi si possono presentare in varie forme, tra cui:
Esaurimento delle risorse di sistema (per esempio, della memoria disponibile). Il tipo più comune di blocco del software è il risultato della mancanza di memoria dovuta a un driver o a un thread kernel mode. L'esaurimento delle risorse può anche derivare dal superamento dei limiti superiori della memoria paged e nonpaged imposti dall'architettura (tipicamente si verifica su un sistema operativo x86 a 32 bit).
Condizioni di deadlock. Un deadlock si verifica quando due o più processi si contendono risorse comuni. Per esempio, esiste una situazione di deadlock quando un thread possiede un lock esclusivo su una risorsa che vuole un altro thread, e quest'ultimo possiede in modo esclusivo una risorsa che vuole il thread iniziale.
Condizioni di spinlock. I blocchi spinlock sono simili ai deadlock, ma in questo caso il problema risiede nella sincronizzazione d''accesso a strutture di dati in un ambiente multi-processore. Un altro caso è rappresentato da un driver che mantiene un lock per un lungo periodo di tempo mentre esegue altre attività.
Thread "compute-bound" ad alta priorità. Un blocco software può verificarsi anche se thread "compute-bound" ad alta priorità si impossessano dei processori. Poiché il sistema operativo Windows permette diversi livelli di priorità dei thread, uno o più thread possono essere eseguiti a una priorità più elevata rispetto al tipico user thread. Il risultato è che alle applicazioni e agli utenti con priorità normale è lasciata solo una minima frazione del tempo della CPU disponibile, provocando così la percezione di un blocco software.
La sintesi della situazione
Come accennato, vi sono numerose ragioni per cui un server potrebbe bloccarsi. Per dare un'idea migliore di quello che succede quando si forza un crash volto a generare un dump della memoria e, successivamente si effettua l'analisi di tale crash per determinare cosa ha causato il blocco, vi proponiamo la figura seguente.

A partire dalla sinistra, potete vedere il crash del server o il blocco. In caso di crash, il server potrebbe generare un dump della memoria se il dumpfile e il pagefile sono correttamente configurati (cfr. articoli della Microsoft Knowledge Base 254649, 197379 e 889654.)
In caso di blocco, sarebbe necessario un intervento manuale per forzare un crash dump come descritto in precedenza. In ogni modo, il contenuto della memoria viene scritto nel file pagefile.sys prima che il server venga riavviato.
Durante il riavvio, pagefile.sys viene scritto nel file memory.dmp. Infine, una volta che il server è stato riavviato, è possibile utilizzare il Windows Kernel Debugger (WinDbg) per analizzare la memoria utilizzando un symbol server (come documentato nell'articolo KB 311503) per tradurre le referenze della memoria in funzioni e variabili significative.
