Risolvere i problemi di prestazioni per la gestione di cache e memoria

Prima di Windows Server 2012, due potenziali problemi principali causavano l'aumento della cache dei file di sistema fino a quando la memoria disponibile non veniva quasi esaurita in determinati carichi di lavoro. Quando questa situazione comporta un rallentamento del sistema, è possibile determinare se il server riscontra uno di questi problemi.

Contatori da monitorare

  • Memoria\Durata media cache standby a lungo termine (s) < 1800 secondi

  • Memoria\Disponibile (in byte, KByte o MByte)

  • Memoria\Byte residenti cache di sistema

Se il valore di Memoria\Mbyte disponibili è basso e allo stesso tempo Memoria\Byte residenti cache di sistema sta consumando una parte significativa della memoria fisica, è possibile usare RAMMAP per scoprire per cosa viene usata la cache.

La cache dei file di sistema contiene strutture di dati metafile NTFS

Questo problema è indicato da un numero elevato di pagine di metafile attive nell'output RAMMAP, come illustrato nella figura seguente. Questo problema potrebbe essere stato osservato nei server occupati con accesso a milioni di file, con conseguente memorizzazione nella cache dei dati dei metafile NTFS non rilasciati dalla cache.

rammap view

Il problema veniva attenuato tramite lo strumento DynCache. In Windows Server 2012+ l'architettura è stata riprogettata e questo problema non dovrebbe più esistere.

La cache dei file di sistema contiene file mappati alla memoria

Questo problema è indicato da un numero elevato di pagine di file mappate attive nell'output di RAMMAP. Questo in genere indica che alcune applicazioni sul server stanno aprendo numerosi file di grandi dimensioni utilizzando l'API CreateFile con FILE_FLAG_RANDOM_ACCESS il flag impostato.

Questo problema è descritto in dettaglio nell'articolo 2549369 della Knowledge Base. FILE_FLAG_RANDOM_ACCESS flag è un suggerimento per Gestione cache per mantenere le visualizzazioni mappate del file in memoria il più a lungo possibile (fino a quando Gestione memoria non segnala una condizione di memoria insufficiente). Allo stesso tempo, questo flag indica allo strumento di gestione della cache di disabilitare la prelettura dei dati dei file.

Questa situazione è stata attenuata in una certa misura grazie ai miglioramenti apportati alla riduzione del set di processo in Windows Server 2012+, ma il problema stesso deve essere risolto principalmente dal fornitore dell'applicazione non utilizzandolo FILE_FLAG_RANDOM_ACCESS. Una soluzione alternativa per il fornitore dell'app potrebbe essere quella di usare la priorità di memoria bassa durante l'accesso ai file. A questo scopo, è possibile usare l'API SetThreadInformation. Le pagine a cui si accede con priorità di memoria bassa vengono rimosse dal working set in modo più aggressivo.

Gestione cache, a partire da Windows Server 2016, attenua ulteriormente questo problema ignorando FILE_FLAG_RANDOM_ACCESS quando si prendono decisioni di limitazione, per cui viene considerato come qualsiasi altro file aperto senza il flag (Gestione cache rispetta ancora questo flag per disabilitare la FILE_FLAG_RANDOM_ACCESS prelettura dei dati dei file). È comunque possibile causare dimensioni eccessive della cache di sistema se si ha un numero elevato di file aperti con questo flag e si accede a tali file in modo veramente casuale. Si consiglia vivamente di FILE_FLAG_RANDOM_ACCESS non utilizzarlo da parte delle applicazioni.

La soglia di pagina dirty del file remoto viene superata costantemente

Questo problema è segnalato se un sistema riscontra rallentamenti occasionali durante le scritture da un client remoto. Questo problema potrebbe verificarsi quando una grande quantità di dati viene scritta da un client remoto veloce a una destinazione server lenta.

Prima di Windows Server 2016, se in uno scenario di questo tipo viene raggiunta la soglia di pagina dirty nella cache, le scritture aggiuntive si comportano come se fosse presente un write-through. Ciò può causare uno scaricamento di una grande quantità di dati sul disco, che può provocare ritardi prolungati se l'archiviazione è lenta, generando timeout per la connessione remota.

In Window Server 2016 e versioni successive è stata applicata una mitigazione per ridurre la probabilità di timeout. Viene implementata una soglia separata di pagine dirty per le scritture remote e verrà eseguito uno scaricamento in linea quando viene superata. Ciò può causare rallentamenti occasionali durante attività di scrittura intensa, ma elimina il rischio di un timeout nella maggior parte dei casi. Questa soglia di pagina dirty remota è 5 GB per file per impostazione predefinita. Per alcune configurazioni e carichi di lavoro, un numero diverso offre prestazioni migliori.

Se la dimensione predefinita di 5 GB non funziona correttamente per la configurazione, è consigliabile provare ad aumentare il limite con incrementi di 256 MB fino a quando le prestazioni non sono soddisfacenti. Tenere presente quanto segue:

  • Per rendere effettive le modifiche apportate a questa chiave del Registro di sistema, è necessario un riavvio.

  • Le unità di RemoteFileDirtyPageThreshold sono indicate in numero di pagine, con dimensioni della pagina gestite dallo strumento di gestione della cache. Ciò significa che questo valore deve essere impostato sulla dimensione desiderata in byte, diviso per 4096.

  • I valori consigliati sono 128 MB <= N <= 50% della memoria disponibile.

  • Questa soglia può essere disabilitata completamente tramite impostazione su -1. Questa opzione non è consigliata perché può comportare timeout per le connessioni remote.

Ad esempio, se si desidera impostare il limite su 10GiB pari a 10.737.418.240 byte / 4096 = 2.621.440, ovvero un valore DWORD decimale di 2621440.

Questa soglia può essere controllata usando il seguente valore del Registro di Sistema.

  • Chiave: HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management
    • Tipo: DWORD
    • Nome valore: RemoteFileDirtyPageThreshold
    • Dati valore: Decimale - Numero di pagine (dimensioni della pagina gestite da Gestione cache).