fragen stichworte

Nachteile der Aktivierung des Low-Fragmentation-Heap-LFH unter Windows Server 2003?

Ich habe ein Problem mit einer Classic ASP-Produktionswebsite unter IIS6 untersucht, die auf eine Fragmentierung des Speichers schließen lässt.

Einer der Vorschläge, wie Sie dies verbessern können, kam von Stackoverflow: Wie kann ich feststellen, warum einige klassische Asp-Seiten zufällig sehr lange ausgeführt werden müssen?. Es wurde vorgeschlagen, eine Einstellung in der global.asa -Datei der Site umzuschalten, um Low Fragmentation Heap (LFH) zu aktivieren.

Der folgende Code (mit einer registrierten Version der beiliegenden DLL) hat den Trick ausgeführt.

Set LFHObj=CreateObject("TURNONLFH.ObjTurnOnLFH")
LFHObj.TurnOnLFH()
application("TurnOnLFHResult")=CStr(LFHObj.TurnOnLFHResult)

(Der Code ist für die Frage wirklich nicht so wichtig).

Ein Autor eines verknüpften Posts meldete eine scheinbar magische Lösung für dieses Problem, und als ich etwas mehr las, entdeckte ich, dass diese Einstellung standardmäßig unter Windows Server 2008 aktiviert ist.

Das hat mich natürlich etwas besorgt gemacht:

  1. Warum ist diese Einstellung in 2003 nicht standardmäßig aktiviert oder
  2. ?
  3. Wenn es 2008 funktioniert, warum hat Microsoft keinen Patch herausgegeben, der standardmäßig für 2003 aktiviert ist?

Ich vermute, die Antwort auf das Obige ist für beide gleich (falls vorhanden).

Natürlich testen wir es in einer Nicht-Produktionsumgebung und führen eine Reihe von Metriken und Vergleichen durch, um festzustellen, ob es uns hilft. Abgesehen davon versuche ich eigentlich nur zu verstehen, ob es einen technischen Grund gibt, warum wir das tun sollten, oder ob es irgendwelche Probleme gibt, die wir beachten müssen.

antworten

In Windows werden Heaps fragmentiert, wenn eine schlecht geschriebene Anwendung Speicher auf ineffiziente Weise zuweist, sodass der Heap in einem fragmentierten Zustand verbleibt. Wenn der Heap einer Anwendung vollständig fragmentiert ist, kann keine Speicherzuordnung mehr vorgenommen werden, da im Heap kein zusammenhängender Speicherblock vorhanden ist, der groß genug ist, um die Anforderung zu erfüllen. Es ist alles in kleinen Fragmenten. Selbst wenn sich die Summe der Größen all dieser kleinen Fragmente zusammensetzt, um die Speicherzuordnung zu erfüllen.

Schwerpunkt liegt auf einer mangelhaft schriftlichen Bewerbung.

In Sysinternals VMMap können Sie den Adressraum eines Prozesses anzeigen und auf Fragmentierungsprobleme überprüfen.

Beachten Sie, dass ASLR auch 2008 eingeführt wurde, was dieses Fragmentierungsproblem bis zu einem gewissen Grad verschärft. Ich denke, das hatte etwas Einfluss auf die Entscheidung, LFH standardmäßig in diesem Betriebssystem zu aktivieren. Außerdem erfordert eine LFH-Politik im Vorfeld mehr AFAIK-Speicher, was in der Ära von 2003 möglicherweise ein größeres Problem war als in der Ära von 2008.

Um eine endgültigere Antwort darauf zu erhalten, warum Microsoft 2008 beschlossen hat, diese Richtlinie zu ändern, müssen Sie wahrscheinlich diese Ingenieure bei Microsoft fragen.