Wenn ich den folgenden Aufruf in C++ verwende, würde ich erwarten, dass das WorkingSet des Prozesses nie unter 100 MB fallen würde.Gibt es eine Möglichkeit, das WorkingSet eines Prozesses 1 GB in C++ zu erzwingen?
Allerdings schneidet das OS den Arbeitssatz immer noch auf 16MB zurück, auch wenn ich diesen Aufruf mache.
Die Einstellung von WorkingSet auf 100 MB würde zu einer dramatischen Steigerung der Anwendungsgeschwindigkeit führen, da Fehler auf der Seite der Seitenfehler vermieden werden (siehe Diagramm unten).
Was mache ich falsch?
SIZE_T workingSetSizeMB = 100;
int errorCode = SetProcessWorkingSetSizeEx(
GetCurrentProcess(),
(workingSetSizeMB - 1) * 1024 * 1024), // dwMinimumWorkingSetSize
workingSetSizeMB * 1024 * 1024, // dwMaximumWorkingSetSize,
QUOTA_LIMITS_HARDWS_MIN_ENABLE | QUOTA_LIMITS_HARDWS_MAX_DISABLE
);
// errorCode returns 1, so the call worked.
(extra für die Experten)Experimental Methodology
I einen Test C++ Projekt schrieb 100 MB Daten zuzuteilen die WorkingSet über 100MB zu bringen (wie in Process Explorer betrachtet), ausgeplant dann, dass Erinnerung. Das Betriebssystem hat das WorkingSet jedoch auf 16 MB reduziert, sobald ich diesen Speicher freigegeben habe. Ich kann das Test C++ Projekt zur Verfügung stellen, das ich verwendete, wenn Sie wünschen.
Warum bietet Windows einen Aufruf von SetProcessWorkingSetSizeEx() an, wenn es nicht zu funktionieren scheint? Ich muss etwas falsch machen.
Das folgende Diagramm zeigt die dramatische Zunahme der Anzahl der Soft-Page-Fehler (die roten Spitzen), wenn die grüne Linie (der Arbeitssatz) von 50 MB auf 30 MB abgefallen ist.
aktualisieren
Am Ende landeten wir ignorieren das Problem auf, da es nicht die Leistung viel, die einen Einfluss haben.
Noch wichtiger ist, tut SetProcessWorkingSetSizeEx nicht Kontrolle der aktuellen WorkingSet und ist nicht in irgendeiner Weise im Zusammenhang mit weichen Seitenfehler. Es verhindert nur harte Seitenfehler, indem verhindert wird, dass das aktuelle WorkingSet auf die Festplatte ausgelagert wird.
Mit anderen Worten, wenn Sie Soft-Page-Fehler reduzieren möchten, hat SetProcessWorkingSetSizeEx absolut keine Wirkung, da es sich auf Hard-Page-Fehler bezieht.
Es gibt eine tolle Beschreibung in "Windows via C/C++" (Richter), wie Windows mit Speicher umgeht.
Wie erwarten Sie, dass das Betriebssystem mehr Seiten im Speicher hält als Sie zugewiesen haben? –
@James McNellis Wenn das Betriebssystem mehr Seiten im WorkingSet behalten könnte, würde die Anzahl der Seitenfehler abnehmen, was das Programm erheblich beschleunigen würde. Wir haben 16GB freien RAM auf dem Server, und es wäre nicht schaden, 1GB dauerhaft diesem Prozess zugewiesen zu haben (was die Anzahl der Soft-Page-Fehler auf 0 reduzieren würde). – Contango
@Gravitas: Wie reservieren und greifen Sie auf den Speicher zu? – ybungalobill