
Continuiamo la nostra serie di articoli (Creare una copia "bit-image" di un server, Cosa fare quando il vostro server Windows si blocca, Come risolvere i crash dello spooler di stampa) volta a individuare come risolvere alcuni dei più seri (e frequenti) malfunzionamenti dei server Windows. È ora il momento di analizzare i tool e le tecniche utilizzate per ovviare all'esaurimento della memoria del sistema operativo.
In genere una situazione di esaurimento della memoria è causata da applicazioni scritte male o da driver che allocano la memoria e che, in un secondo momento, non sono in grado di svuotarla del tutto. Dopo un po' di tempo, questo può portare al depauperamento del pool di memoria di sistema (paged o non-paged) e quindi causare un possibile blocco del server.
Però, molto tempo prima che un server Windows si blocchi, si evidenziano diversi sintomi tipici di una situazione di memoria che sta per esaurirsi. Le aree principali a cui prestare attenzione sono le voci nel registro degli eventi di sistema del servizio del server (componente SRV). In particolare, cercate le voci:
Event ID 2019: The server was unable to allocate from the system nonpaged pool because the pool was empty
Event ID 2020: The server was unable to allocate from the system paged pool because the pool was empty
Questi due eventi sono indicativi della carenza di memoria in Windows e devono essere immediatamente verificati. Altri segnali dell'esaurimento della memoria includono un eccessivo utilizzo del pagefile e la diminuzione della quantità di memoria disponibile.
Perfmon
Il tool più frequentemente usato per diagnosticare la carenza di memoria è Perfmon, uno strumento grafico integrato in Windows. Attraverso la raccolta di misurazioni delle performance all'interno di determinati counter, è possibile stabilire se l'esaurimento della memoria è stato causato da un processo utente (applicazione) o da un driver in modalità kernel.
Le misurazioni delle performance possono essere raccolte in background con i counter scritti in un file log, che può essere successivamente letto da Perfmon o dal Performance Analysis of Logs (PAL) di CodePlex. L'articolo 811237 della Knowledge Base di Microsoft spiega come impostare Perfmon per accedere ai counter delle performance.
Esiste anche un tool gratuito di Microsoft, denominato PerfWiz, che prevede una procedura guidata per l'installazione e la configurazione di Perfmon.
Se sospettate che a esaurire la memoria sia l'utilizzo di un'applicazione in modalità utente, potete utilizzare Perfmon per raccogliere i Process object counter, i Pool Paged Bytes e i Pool Nonpaged Bytes di tutte le istanze. Questo vi mostrerà se uno qualsiasi dei processi continua ad allocare pool paged o non-paged, senza poi disallocarli. Se ritenete invece che a causare l'esaurimento della memoria sia un driver in modalità kernel, usate Perfmon per raccogliere i Memory object counter, i Pool Nonpaged Bytes e i Pool Paged Bytes.
Nel seguente esempio, Perfmon viene usato per monitorare i counter delle prestazioni dell'oggetto memoria, vale a dire i pool paged e non-paged. Facendo clic con il tasto destro su ogni counter, è possibile regolare la scala per avere entrambi i counter visualizzati sullo stesso grafico. Come si può vedere nella figura, il counter di Pool Paged Bytes (linea rossa) continua a crescere senza mai diminuire, il che significa che sta riempiendo la memoria. Guardando il valore minimo per il counter del paged pool, sembra sia passato da un valore di 118 MB a un valore massimo di oltre 350 MB.

A questo punto, nel nostro esempio, sappiamo di avere una carenza di paged pool. Possiamo perciò utilizzare Perfmon per esaminare il Process object per Pool Paged Bytes. Se nessun processo mostra un corrispondente aumento dell'utilizzo del paged pool, possiamo concludere che un driver o un codice in modalità kernel sta esaurendo la memoria.
Poolmon
Per isolare maggiormente la carenza di memoria, è necessario determinare quale driver sta allocando la memoria stessa. Quando i driver allocano la memoria, inseriscono un tag di quattro caratteri nella struttura dati del pool di memoria per identificare quale driver la sta allocando. Esaminando i vari pool di allocazione, è possibile determinare quali driver sono responsabili e a quali pool sono associati. Attraverso l'articolo 298102 della Knowledge Base Microsoft potete capire come associare i tag ai rispettivi driver. Potreste anche installare il Debugging Tools for Windows e controllare il seguente file:
\Program Files\Debugging Tools for Windows\Triage\Pooltag.txt
L'utility Memory Pool Monitor (Poolmon) è un tool gratuito di Microsoft che controlla le allocazioni dei pool e visualizza i risultati, evidenziando i driver corrispondenti. Nel seguente esempio, Poolmon viene utilizzato per monitorare il tag “Leak” che è in cima alla lista. Poolmon mostra il numero di allocazioni e il numero di byte liberi, allocati e la loro differenza. Poolmon mostra anche il nome del driver, se questo è configurato correttamente.
Nel nostro esempio possiamo vedere che il tag "Leak" appartiene al driver Notmyfault.sys che ha allocato un paged pool di oltre 83 MB.

Windbg
Se quanto visto sinora non è sufficiente a risolvere il problema e il server si blocca completamente a causa dell'esaurimento della memoria, è sempre possibile forzare un crash dump e successivamente, cercare di stabilire perché il server Windows si è bloccato. Le cose fondamentali da cercare quando si analizza il crash con l'utility Windows Kernel Debugger (Windbg) sono l'utilizzo dei pool di memoria e quali strutture di dati stanno consumando il pool.
Il primo comando da utilizzare per il debugger è !vm 1, come mostrato nell'esempio seguente. Questo comando visualizza l'uso attuale della memoria virtuale, in particolare i pool delle regioni non-paged e paged. Il debugger contrassegnerà qualsiasi impiego eccessivo dei pool e gli eventuali errori nell'allocazione dei pool come illustrato in figura. Il trucco è quello di confrontare l'utilizzo con il massimo consentito, come evidenziato in giallo qui sotto. Se l'utilizzo è al massimo (o molto vicino), il server è destinato a bloccarsi perché è a corto di pool.

Infine, potete utilizzare il debugger per visualizzare le strutture dati paged o non-paged con il comando !poolused. Le varie opzioni del comando consentono di specificare sia i pool paged e non-paged sia di ordinare l'output. Nel seguente esempio, è usato il comando !poolused 5 per visualizzare le strutture dati del paged pool, ordinate in ordine decrescente di utilizzo. Nella Figura 4, potete vedere la struttura del pool con il tag "Leak" che sta consumando la maggior parte del paged pool (oltre 115 MB) ed è associato al driver notmyfault.sys.

Conclusioni
Come abbiamo visto, utilizzando tool come Perfmon, PerfWiz, PAL, Poolmon e Windbg, è possibile monitorare l'esaurimento della memoria, determinare se si tratta di memoria paged o non-paged e scoprire quale driver o applicazione è responsabile. Fatto ciò, contattare il fornitore di software è di solito la soluzione migliore per vedere se è disponibile un driver o un'immagine aggiornata in grado di risolvere il problema.
*system software engineer
