Behandeln von Leistungsproblemen von Cache und Arbeitsspeicher-Manager

Vor Windows Server 2012 verursachten im Wesentlichen zwei potenzielle Probleme ein Anwachsen des Systemdateicaches, bis der verfügbare Arbeitsspeicher unter bestimmten Workloads nahezu voll war. Wenn diese Situation zu einer Verlangsamung des Systems führt, können Sie ermitteln, ob eins dieser Probleme auf dem Server auftritt.

Zu überwachende Leistungsindikatoren

  • Arbeitsspeicher\Langfristige durchschnittliche Lebensdauer im Standbycache (Sek.) < 1800 Sekunden

  • Arbeitsspeicher\Verfügbar (in Byte, KB oder MB)

  • Arbeitsspeicher\Systemcache: Residente Bytes

Wenn „Arbeitsspeicher\Verfügbare MB“ niedrig ist und gleichzeitig „Arbeitsspeicher\Systemcache: Residente Bytes“ einen erheblichen Teil des physischen Speichers belegt, können Sie mithilfe von RAMMAP herausfinden, wofür der Cache verwendet wird.

Systemdateicache enthält NTFS-Metadateidatenstrukturen

Dieses Problem lässt sich an einer hohen Anzahl aktiver Metadateiseiten in der RamMap-Ausgabe erkennen, wie in der folgenden Abbildung gezeigt. Dieses Problem kann auf Servern mit hoher Auslastung beobachtet werden, auf denen auf Millionen von Seiten zugegriffen wird, was dazu führt, dass NTFS-Metadateidaten im Cache gespeichert und nicht wieder freigegeben werden.

rammap view

Das Problem ließ sich in der Regel mit dem Tool DynCache abmildern. In Windows Server 2012+wurde die Architektur neu gestaltet, und dieses Problem sollte nicht mehr auftreten.

Systemdateicache enthält dem Arbeitsspeicher zugeordnete Dateien

Dieses Problem lässt sich anhand einer hohen Anzahl an aktiven zugeordneten Dateiseiten in der RamMap-Ausgabe erkennen. Dies weist in der Regel darauf hin, dass eine Anwendung auf dem Server zahlreiche große Dateien mit der API CreateFile mit festgelegtem FILE_FLAG_RANDOM_ACCESS-Flag öffnet.

Dieses Problem wird im KB-Artikel 2549369 ausführlich beschrieben. FILE_FLAG_RANDOM_ACCESS-Flag ist ein Hinweis für den Cache-Manager, zugeordnete Ansichten der Datei so lange wie möglich im Arbeitsspeicher zu behalten (bis der Arbeitsspeicher-Manager nicht mehr signalisiert, dass nur wenig Arbeitsspeicher verfügbar ist). Gleichzeitig weist dieses Flag den Cache-Manager an, das Vorabrufen von Dateidaten zu deaktivieren.

Diese Situation wurde in gewissem Maß durch Verbesserungen beim Trimmen von Arbeitssätzen in Windows Server 2012+ abgemildert, das Problem selbst muss aber in erster Linie vom Anwendungsanbieter vermieden werden, indem FILE_FLAG_RANDOM_ACCESS nicht verwendet wird. Eine alternative Lösung für den App-Anbieter kann sein, beim Zugriff auf die Dateien eine niedrige Speicherpriorität zu verwenden. Dies lässt sich über die SetThreadInformation-API erreichen. Seiten, auf die mit niedriger Speicherpriorität zugegriffen wird, werden aggressiver aus dem Arbeitssatz entfernt.

Ab Windows Server 2016 mildert der Cache-Manager das Problem noch weiter ab, indem FILE_FLAG_RANDOM_ACCESS beim Treffen von Entscheidungen zum Trimmen ignoriert wird, sodass eine Datei genauso wie jede andere Datei behandelt wird, die ohne das FILE_FLAG_RANDOM_ACCESS-Flag geöffnet wurde (der Cache-Manager nutzt dieses Flag weiterhin, um das Vorabrufen von Dateidaten zu deaktivieren). Eine Überfrachtung des Systemcaches kann weiterhin auftreten, wenn eine große Anzahl von Dateien mit diesem Flag geöffnet ist und auf wirklich zufällige Weise auf diese zugegriffen wird. Es wird dringend empfohlen, dass FILE_FLAG_RANDOM_ACCESS von Anwendungen nicht verwendet wird.

Der Schwellenwert für modifizierte Seiten in Remotedateien wird ständig überschritten

Ein Hinweis auf dieses Problem ist eine gelegentliche Verlangsamung des Systems bei Schreibvorgängen von einem Remoteclient. Dieses Problem kann auftreten, wenn eine große Menge von Daten von einem schnellen Remoteclient in ein langsames Serverziel geschrieben wird.

In Versionen vor Windows Server 2016 passiert in einem solchen Szenario Folgendes: Wenn der Schwellenwert für modifizierte Seiten im Cache erreicht wird, verhalten sich weitere Schreibvorgänge so, als handele es sich um Write-Through-Vorgänge. Dadurch kann eine große Menge an Daten auf den Datenträger geleert werden, was zu langen Verzögerungen führen kann, wenn nur wenig Speicher zur Verfügung steht. Dies wiederum kann Timeouts bei der Remoteverbindung verursachen.

Unter Windows Server 2016 und höheren Versionen wurde eine Entschärfung eingerichtet, um die Wahrscheinlichkeit von Timeouts zu verringern. Es wurde ein separater Schwellenwert für Remoteschreibvorgänge mit modifizierten Seiten implementiert, und bei Überschreitung dieses Werts wird eine Inlineleerung ausgeführt. Dies kann bei einer sehr großen Anzahl von Schreibaktivitäten gelegentlich zu Verlangsamungen führen, eliminiert aber in den meisten Fällen das Risiko eines Timeouts. Der Schwellenwert für Remoteschreibvorgänge mit modifizierten Seiten beträgt standardmäßig 5 GB pro Datei. Bei einigen Konfigurationen und Workloads führen andere Werte zu einer besseren Leistung.

Wenn der Standardwert von 5 GB für Ihre Konfiguration nicht gut funktioniert, versuchen Sie, den Wert in 256-MB-Schritten zu erhöhen, bis die Leistung zufriedenstellend ist. Bedenken Sie dabei Folgendes:

  • Damit Änderungen an diesem Registrierungsschlüssel wirksam werden, ist ein Neustart erforderlich.

  • Die Einheiten von RemoteFileDirtyPageThreshold sind Anzahl von Seiten (bei einer vom Cache-Manager verwalteten Seitengröße). Das bedeutet, dass der Wert auf die gewünschte Größe in Byte geteilt durch 4096 festgelegt werden sollte.

  • Empfohlene Werte sind 128 MB <= N <= 50 % des verfügbaren Arbeitsspeichers.

  • Dieser Schwellenwert kann durch Festlegen auf „-1“ vollständig deaktiviert werden. Dies wird nicht empfohlen, da es zu Timeouts für Remoteverbindungen führen kann.

Wenn Sie beispielsweise den Grenzwert auf 10 GiB festlegen möchten, ist dies 10.737.418.240 Bytes / 4096 = 2.621.440, bei dem es sich um einen dezimalen DWORD-Wert von 2621440 handelt.

Dieser Schwellenwert kann mithilfe des folgenden Registrierungswerts gesteuert werden.

  • Schlüssel: HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management
    • Typ:DWORD
    • Wertname: RemoteFileDirtyPageThreshold
    • Wertdaten: Dezimal - Anzahl der Seiten (Seitengröße wie vom Cache-Manager verwaltet).