Salve a tutti.

Può succedere su un server Windows 2008 o 2008 R2 con tanta memoria fisica a disposizione, di arrivare a trovarsi con tanta memoria utilizzata, senza riuscire a capire perchè quella memoria sia utilizzata e da chi.

before

Se poi usiamo RamMap della SysInternals, vediamo che la maggior parte della memoria in uso è costituita da Metafile.

Ma cosa sono esattamente i Metafile in oggetto? E come mai sono a quel livello così alto? Possiamo controllarli in qualche modo?

I Metafile in questione sono la cache di sistema dell’NTFS. Se il server ha installato il ruolo di File Server, questo farà si che se il server dispone di tanta RAM, il sistema la userà tutta o quasi, cercando di ottimizzare la cache per l’accesso ai file condivisi dal server stesso. In questo modo l’accesso ai file sarà molto più veloce.

Di default un server che utilizza il ruolo File Server, andrà ad utilizzare tutta la memoria fisica disponibile, meno 300MB, per la cache di sistema.

E’ possibile, programmaticamente impostare la dimensione massima di memoria a disposizione del sistema come Cache, attraverso le funzioni GetSystemFileCacheSize() e SetSystemFileCacheSize().

Come si fa? Con un servizio di esempio scaricabile da sito Microsoft.

Microsoft Windows Dynamic Cache Service
http://www.microsoft.com/download/en/details.aspx?id=9258

Il servizio di esempio, contiene tutto il necessario per crearsi un proprio programma o per usarlo direttamente.
Se volete usarlo direttamente, basta scompattare il file zip scaricato dal sito e modificare il file .reg impostando il valore della chiave MaxSystemCacheMBytes al valore preferito.

Qui sotto vedete due immagini relative ad un server che ha avviato il servizio DynCache dopo avere impostato il valore di MaxSystemCacheMBytes a 3000MB, ossia 3GB.

after

service

La memoria in uso come Metafile è passata da 16GB a 3 GB appena il servizio è stato avviato.

Quindi, quando succede che trovate il vostro server con tanta memoria utilizzata e non riuscite a capire chi la sta usando, usate RamMap per verificare il tipo di memoria in uso. Se la maggior parte è utilizzata per i Metafile, considerate se il vostro server sta usando il ruolo File Server, e se si, questo utilizzo il più delle volte è corretto. E’ comunque “by design” che se avete tanta memoria RAM il sistema cerchi di utilizzarla per migliorare le performance del sistema.

Se volete tenere sotto controllo la memoria del vostro server limitandone l’utilizzo per la System Cache, potete realizzare un programma o usare quello di esempio disponibile al sito Microsoft, che implementi le funzioni GetSystemFileCacheSize() e SetSystemFileCacheSize().

Per ulteriori approfondimenti sul tema, vi rimando ai seguenti post:

http://blogs.msdn.com/b/ntdebugging/archive/2007/11/27/too-much-cache.aspx

http://support.microsoft.com/default.aspx?scid=kb;EN-US;920739

 

Alla prossima!

Mario Raccagni
Support Escalation Engineer
Microsoft Enterprise Platform Support