2009-06-24 5 views
14

Gibt es eine Möglichkeit, Windows mitzuteilen, dass es den Speicher bestimmter Prozesse nicht auf Datenträger auslagern soll?Kann ich Windows mitteilen, dass es den Speicher bestimmter Prozesse nicht auslagern soll?

Es ist ein. Net-Windows-Dienst mit ziemlich großer Speicherauslastung. Ich habe viel physischen RAM, aber das OS scheint sowieso einen Teil des Prozessspeichers in die Auslagerungsdatei zu verschieben.

+2

Windows-bewegt Seiten von Prozessdatensätzen arbeiten auf einer zuletzt zugegriffenen Basis. Im Allgemeinen liefert dies gute Ergebnisse, aber bestimmte Anwendungsfälle können eine Kontrolle erfordern. Bevor Sie dies tun, lesen Sie Windows Internals (um mit zu beginnen), um besser zu verstehen, was Sie versuchen zu tun. – Richard

+1

Ich zweite den Kommentar. In den meisten Fällen führt der Versuch, den Windows-Speichermanager zu überlisten, zu einer schlechteren Leistung. –

+1

Schlüsselfrage: Warum ist das ("beweglicher Teil des Prozessspeichers zur Auslagerungsdatei") sowieso ein Problem? – Stobor

Antwort

17

Sie können VirtualLock verwenden, um zu verhindern, dass Speicher auf die Festplatte ausgelagert wird, aber ich bin der Meinung, dass es besser ist, das Betriebssystem den Systemspeicher verwalten zu lassen. Es ist ziemlich gut darin, und ich würde nicht zweitens raten, warum das OS Dinge auf die Platte tauschte, wenn ich nicht wirklich wusste, was ich tat.

+0

+1: besser dran, dies nicht zu tun. – Richard

+1

Wenn es gut war, würden wir sehen, dass so viele Apps Sekunden brauchen, um ein Kontextmenü zu öffnen, nur weil ein Kopiervorgang läuft und das Paging blockiert? – John

12

Bei VirtualLock wird die Quote in Eile nicht erreicht, auch wenn Sie dem Benutzer eine Berechtigung erteilen (standardmäßig enthält die Sicherheitsrichtlinieneinstellung "Seiten im Speicher sperren" keine Einträge (nicht einmal admin)).

Wenn Sie dies konfigurieren, müssen Sie auch "Speicherkontingente für einen Prozess anpassen" festlegen.

Diese Frage ist ein wenig mehrdeutig, welchen Teil des VM-Speicherplatzes möchten Sie nicht auslagern? Heap/Stack/Module? ...?

Insgesamt eine Lösung, die ich in der Vergangenheit verwendet hatte, ist eine DLL mit einem großen Abschnitt zu erstellen, der READ + WRITE, nicht bewegbar war, Sie können es auch als EXECUTE und SHARED markieren, aber dann würde ich HeapCreate in den Abschnitt dieses Moduls, so dass ich es als Heap verwenden kann.

Sie können die genauen Bits nachschlagen here, IMAGE_SCN_MEM_NOT_PAGED sieht aus wie es den Trick tun würde.

Wenn Sie alle Ihre Module und Abschnitte mit diesem Bit markieren, wird der Windows-Modullader keine spezifischen Benutzerkontingente berechnen oder erfordern, dass die Richtlinieneinstellungen auf jedem System geändert werden, auf dem Sie den Code bereitstellen. Sie müssen eine spezielle Shim-Codierung einprogrammieren, um Zugang zu den HEAPs zu erhalten, die Sie auch in diesen NON_PAGEABLE-DLLs erstellen.

Es ist ein bisschen Arbeit, aber es funktionierte für mich in der Vergangenheit, ich hatte die zusätzliche Anforderung, Speicher an mehrere Prozesse zu teilen, die an der gleichen Adresse basierte.

Ich würde denken, die einfachste Sache zu versuchen wäre, Ihre Seite Datei vollständig zu deaktivieren. Aber vorher, wenn Sie Vista/2008 + OS verwenden, kann der Wechsel, den Sie sehen, auf Superfetch zurückzuführen sein, der Ihr System proaktiv mit der Annahme "anpas- sen" könnte, dass Sie in naher Zukunft die eine oder andere Anwendung verwenden müssen. Einige andere einfache Aufgaben wären, unbenutzte Dienste wie die Suche zu stoppen, die große Mengen von Dateien indizieren könnten. Sie sollten auch in Ihren "Task Scheduler" gehen, der Systemaufgaben konfiguriert. Standardmäßig sind auf den meisten Systemen einige Dutzend voreingestellt Aktionen, die alle Dr. Watson-Dumps an MS weiterleiten, defragmentieren Sie Ihr Laufwerk und eine Reihe anderer möglicherweise äußerst speicherintensiven Typ Operationen.

Sie könnten etwas detaillierter antworten, um bessere Antworten zu erhalten ... aber ein anderer Vorschlag wäre, einfach ein großes Solid-State-Laufwerk zu kaufen und dieses ausschließlich zum Tausch zu verwenden, achten Sie darauf, dass sich diese im Laufe der Zeit verschlechtern eine Größe aufgrund fehlerhafter Blockzuordnungen, die bei allen vorhandenen SSD-Technologien üblich sind.

ich auf einem Codeplex-Projekt vor kurzem kam "non-paged clr host" genannt, von ihrer Seite:

Umsetzung Von einer Umsetzung Sicht des nicht ausgelagerten CLR-Host verwendet den SetProcessWorkingSetSize, SetProcessWorkingSetSizeEx (unter Windows Server 2003 und höher) und VirtualLock APIs zu ensu Re, dass Speicher von ihm zugewiesen ist in physischen Speicher gesperrt. Beachten Sie, dass die oben genannten APIs tut nichtGarantie mit absoluter Sicherheit , dass kein Paging auftreten wird; stattdessen minimiert die Chancen davon zu sehr außergewöhnliche Szenarien auftreten. In einigen Belastungstests haben wir durchgeführt, auch , wenn das System als Ganzes durch einen Mangel an physischem Speicher in Beschlag genommen wurde, keine Seite Fehler im Prozess beobachtet wurden den nicht ausgelagerten CLR-Host verwenden.

0

Sind Sie sicher, dass die fraglichen Seiten aus dem Speicher gelöscht werden? Es ist möglich, dass das VM-Subsystem proaktiv unreine Seiten auf die Festplatte schreibt, ohne dass diese gelöscht werden, sodass potenzielle zukünftige Zuordnungen eine geringere Latenz haben.

Auch wenn das System eine große Menge an IO tut, kann es besser sein, die Performance für Puffer, um den Speicher in Frage zu verwenden, anstatt Anwendungsdaten, wie von Martin Pool beschrieben

+0

MS hat vor kurzem ein Tool DynCache veröffentlicht, mit dem Sie einige Einstellungen in diesen Szenarien vorkonfigurieren oder anderweitig einrichten können, http://blogs.msdn.com/ntdebugging/archive/2009/02/06/microsoft-windows-dynamic- cache-service.aspx & http://sqlblogcasts.com/blogs/grumpyolddba/archive/2009/03/18/x64-memory-problems.aspx – RandomNickName42

+0

Gheeze Ich hasse es auf dich zu reißen, aber ich brauche wirklich die Punkte;). Die Referenz, die Sie zitiert haben, ist für Linux, die subtile Varieance der Volkssprache kann ziemlich verwirrend sein, wenn nicht klar angegeben ... Wenn Sie sich beziehen auf (http://msdn.microsoft.com/en-us/library/cc644950(VS .85) .aspx), "Wenn FILE_FLAG_NO_BUFFERING mit FILE_FLAG_OVERLAPPED kombiniert wird, geben die Flags die maximale asynchrone Leistung, da die E/A nicht auf die synchronen Operationen des Speichermanagers angewiesen ist. Einige E/A-Vorgänge erfordern jedoch mehr Zeit, weil Daten nicht im Cache gehalten werden. " - Also Windows = NO_BUFFER> * :) – RandomNickName42

Verwandte Themen