Di recente mi è capitato di installare un File Server 2008 R2 e mi sono reso conto che ha dei grossi problemi di sovraccarico di RAM.
Essendo il server una macchina virtuale ho provato ad aumentare la RAM da 8GB a 16 GB fino ad arrivare a 32Gb ma il risultato non cambiava…. la RAM veniva allocata tutta!!!
Cercando un po su internet e analizzando il problema sono riuscito a trovare una soluzione tampone in attesa che Microsoft rilasci un hotfix per la risoluzione definitiva del problema.
Di seguito l’analisi e le attività da eseguire per risolvere definitivamente il problema.
ANALISI
Lo scenario in analisi è quello di un fileserver Windows 2008 R2 utilizzato per la condivisione in rete di molte cartelle. Il server aveva sempre una quantità di RAM occupata pari a circa il 100%, come si può vedere nell’immagine sottostante:
Il task manager non era di molto aiuto nell’identificazione della root cause del problema, un’ordinamento dei processi per occupazione di memoria non mostrava nulla di anomalo e nemmeno nessun processo con consumo eccessivo di memoria.
Occorreva perciò sapere come era occupata la memoria per poi cercare di capire se era un processo a consumarla, quindi anche per stabilire se era un comportamento lecito o se eravamo incappati in qualche bug, o altro. Cosa fare allora? Ho indagato un po’ con il tool RAMMap della Sysinternals.
Come si vede dall’immagine salta subito all’occhio che la gran parte della ram occupata, corrisponde alla voce Metafile:
Cosa sono i Metafile?
I Metafile sono parte della cache di sistema e si compongono di metadati NTFS. Metadati NTFS include il MFT, così come gli altri vari file di metadati NTFS (NTFS vedere come funziona per maggiori dettagli, e, naturalmente, Windows Internals è un grande riferimento). Nella MFT ogni record attributo di file prende 1k ed ogni file ha almeno un record attributo. Aggiungete a questo gli altri file di metadati NTFS e si può capire perché la categoria Metafile può crescere abbastanza grande su server con un sacco di file.
Apparentemente sembra un comportamento corretto, ma cosa si può fare per risolvere il problema?
Cercando su Internet ho visto che molti fanno riferimento al parametro System File Cache.
Infatti ho notato che tramite il RAMMap è possibile svuotare la Cache cliccando su Empty e quindi selezionando la voce Empty Working Sets o Emtpy System Working Sets (vedi immagine sottostante)
Riaggiornando il RAMMap noteremo che la parte fuxia relativa ai Metafile si è ridotta notevolmente.
A questo punto ho cercato di scriptare lo strumento RAMMap ma visto che non è molto semplice ho deciso di continuare a cercare su internet un metodo per svuotare la System File Cache.
WORKAROUND 1
Ho scoperto che esiste un workaround di Microsoft per raggirare il problema chiamato Microsoft Windows Dynamic Cache Service scaricabile dal sito ufficiale cliccando qui
Da qui potete prelevare direttamante lo ZIP con tutte le versione per i vari sistemi operativi
NOTA BENE:
E’ scaricabile la versione per tutti i sistemi operativi tranne che per il Windows Server 2008 R2 dato che stando al KB , il gestore di momoria di Windows 7 e Windows 2008 R2 è stato modificato per escludere questo problema.
Questo software ci permette di impostare un valore massimo per la DynCache
Per poterlo utilizzare bisogna prima installarlo seguendo questi semplici passi:
1) Copiare DynCache.exe nella cartella %SystemRoot%\System32.
2) Da una finestra di DOS lanciare la seguente riga di comando:
sc create DynCache binpath= %SystemRoot%\System32\DynCache.exe start= auto type= own DisplayName= “Dynamic Cache Service”
3) Importare il file di registro DynCache.reg. Questo file di registro contiene i settaggi di Default che possono esssere modificati in qualsiasi momento.
Se vuoi disinstallare il software lanciare i due comandi come di seguito:
sc stop DynCache
sc delete DynCache
Per configurare il software a nostro piacimento modificare solo le due chiavi di registro elencate di seguito:
NOTA BENE: Dopo aver modificato le chiavi di registro non c’è bisogno di riavvaire il server per renedere effettive le modifiche.
Aprire il registro di sistema e posizionarsi sulla chiave seguente:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\DynCache\Parameters
A questo punto modificare le seguenti chiavi:
- RegValue: MaxSystemCacheMBytes
Type: REG_DWORD
Values:
0 = Limit to 90% of Physical RAM (default)
1-99 = Limit the maximum size of the System File Cache to this percentage of Physical RAM
> 200 = Limit the maximum size of the System File Cache to x Mbytes - How this works:
This setting is the absolute maximum that the System File Cache’s working set could be set to. The default is 0, limiting it to 90% of physical RAM with an upper limit of total Physical RAM minus 300 Mbytes. The lower limit for absolute values is 200 Mbytes and it must be at least 100 Mbytes greater than the MinSystemCacheMBytes value, which defaults to 100 Mbytes.
- RegValue: MinSystemCacheMBytes
Type: REG_DWORD
Values:
0 = 100 Mbytes (default)
x = Limit the minimum size of the System File Cache to x Mbytes - How this works:
This setting is the minimum size of the System File Cache’s working set. The absolute lower limit is 100 Mbytes.The service does not dynamically change this value.
WORKAROUND 2
Questo workaround è utilizzabile su tutti i sistemi operativi Microsoft ed è OPEN.
Potete scaricare il pacchetto di installazione da qui Download “Set System File Cache” setsystemfilecachesize1.zip – Scaricato 5387 volte – 8,13 KB
Una volta scompattato il pacchetto è possibile schedulare il flush della memoria tramite il task manager di Micrososft seguendo gli steps elencati di seguito:
1) Copiare la cartella nel seguente pwercorso C:\setsystemfilecachesize
2) Verificare la versione del sistema operativo se è a 32Bit o 64bit
3) Creare un file CacheFlush.cmd ed inserire all’interno la seguente riga di comando
C:\setsystemfilecachesize\x64\SetSystemFileCacheSize.exe flush
4) A questo punto basta schedulare con il Task Manager di Micorosft il batch come mostrato in figura sottostante
Dopo alcuni test (incide molto l’accesso ai file da parte degli utenti, il numero dei file ospitati dal file server e le relative movimentazioni e modifiche) ho notato che per avere la memoria sempre scarica era opportuno lanciare lo script ogni ora.
Se le movimentazioni dei file e logicamante anche i file sono ridotti è possibile schedulare lo script anche una o due volte al giorno
Qui selezioniamo lo script creato in precedenza
Con questo workaround la memoria resta sempre bassa senza dover settare un tetto massimo della System Cache.
Se avete fatto tutto correttamente lanciando il RAMMap anche dopo una settimana dovreste avere una situazione come mostrat nella figura sottostante
Inoltre volevo segnalarvi che il tool Set System File Cache ha anche altre funzioni che è possibile utilizzare:
SetSystemFileCacheSize
Visualizza la configurazione corrente
SetSystemFileCacheSize /?
Visuallizza l’help
SetSystemFileCacheSize 8 128
Setta la dimensione minima a 8 MB e la massima a 128 MB
SetSystemFileCacheSize off 128
Disabilita la minima e setta la massima a 128 MB
SetSystemFileCacheSize off off
Disabilita la minima e la massima
SetSystemFileCacheSize flush
fa il flush della memoria (il comando che ho utilizzato nello script)
WORKAROUND 3
L’ultimo ma non perchè meno importante workaround è quello di settare l’indicizzazione dei dischi dove si trovano i file.
Questo farà si che la memoria non rilasciata dal sistema dovuta all’apertura dei file verrà riutilizzata dal sistema che indicizza i file.
Per la configurazione dell’indicizzazione seguire gli steps elencati di seguito:
1) Da Esegui lanicare il comando MMC
2) Selezionare il servizio Indexing Service
3) A questo punto aggiungere il disco che si vuole indicizzare ed attendere il termine (il tempo varia in basa ai file e le directory da indicizzare quindi può durare anche giorni)
NOTE E CONSIDERAZIONI
Io personalmente per risolvere definitivamente il problema ho adottato il Workaround 2 e il Workaround 3
In questo modo vi garantisco che non si avranno piu problemi di RAM anche con file server con milioni di File e Cartelle.
Sono Raffaele Chiatto, un appassionato di informatica a 360 gradi.
Tutto è iniziato nel 1996, quando ho scoperto il mondo dell'informatica grazie a Windows 95, e da quel momento non ho più smesso di esplorare e imparare.
Ogni giorno mi dedico con curiosità e passione a scoprire le nuove frontiere di questo settore in continua evoluzione.
0 Comments