2008-09-12 5 views
2

Wir haben einige Win32-Konsole-Anwendungen auf Windows Server 2003 Service Pack 2, die regelmäßig mit dieser fehlschlagen:Gibt Windows Server 2003 SP2 die Wahrheit über freie Systempage-Tabelleneinträge?

Fehler 1450 (ERROR_NO_SYSTEM_RESOURCES): "Nicht genügend Systemressourcen, um den angeforderten Dienst auszuführen"

Die gesamte Dokumentation wir gefunden haben, deutet darauf hin, es auf die Anzahl der Freie Seitentabelleneinträge knapp verknüpft ist. Wir haben 16GB RAM in diesen Maschinen und verwenden den Betriebssystem-Schalter, um den Windows-Kernel in 1 GB zu komprimieren und unseren Prozessen Zugriff auf 3 GB Adressraum zu gewähren. Dies reduziert drastisch die Gesamtzahl der freien System-Seitentabelleneinträge, so ist es in Kombination mit unserer starken Verwendung von MapViewOfFile() vielleicht nicht überraschend, dass die Einträge in der Kernelseitentabelle zu Ende gehen.

Wenn jedoch der Systemmonitor zum Anzeigen des Zählers für freie Systemseiten-Tabelleneinträge verwendet wird, ist der Wert beim Neustart auf etwa 36.000 und wird nicht zurückgesetzt, wenn die Anwendung gestartet wird. Ich kann es kaum glauben, dass unsere Anwendung, die viele große Speicher-Mapped-Dateien öffnet, keine Auswirkungen auf die Kernel-Seitentabelle hat. Wenn wir den Zähler nicht glauben können, ist es viel schwieriger, die Auswirkungen von Systemänderungen, die wir vornehmen, zu testen.

Es ist ein vielversprechender Knowledge Base-Artikel, The Performance tool does not accurately show the available Free System Page Table entries in Windows Server 2003, aber es sagt, das Problem in Service Pack 1 behoben worden, und wir sind bereits auf Service Pack 2.

Hat jemand anderes kämpft mit oder diesem Problem gelöst?

Update: Ich habe überprüft! Sysptes in Windbg (Debuggen des Kernels) und der Wert entspricht dem Leistungsindikator, etwa 36.000. Ich nehme an, dass dies wahrscheinlich bedeutet, dass es wirklich so viele freie Seitentabelleneinträge gibt und dass Windows die Wahrheit sagt. Es bleibt die Frage, warum wir 1450 Fehler bekommen, wenn die PTEs nicht ausgehen.

Weitere Aktualisierung: Wir sind nie auf den Grund gegangen, warum die 1450 Fehler aufgetreten sind. Allerdings, stattdessen aktualisierten wir das Betriebssystem auf diesen Servern auf 64-Bit-Windows. Dadurch können die vorhandenen 32-Bit-Anwendungen (ohne Neukompilierung) auf volle 4 GB virtuellen Adressraum zugreifen, und der Kernel-Speicherbereich mit diesen lästigen Seitentabelleneinträgen kann ebenfalls so groß werden, wie er möchte. Ich glaube nicht, dass wir seit 1450 einen Fehler hatten.

Antwort

1

Können Sie versuchen, den Windbg-Befehl "! Sysptes" System PTE Informationen zu erhalten? Ich bin nicht sicher, ob Sie dies mit Live-Kernel-Debug tun können, müssen Sie möglicherweise einen Speicherabbild abrufen.

+0

Wir untersuchen haben einen Kernel-Debugger Arbeits bekommen, und ich _think_ wir haben so weit wie zu tun, entweder die! Sysptes oder! Vm Befehl. Wenn ich mich richtig erinnere, stimmten die Zahlen mit dem Leistungsindikator überein (was ein bisschen enttäuschend war), aber ich bin unklar in den Details. Danke für die Antwort. –

+0

Kein Problem, danke für die Kommentare .. –

0

Ich bin mir nicht sicher, warum Sie davon ausgehen, dass ERROR_NO_SYSTEM_RESOURCES verursacht wird nur durch aus freien Systemseite Tabelleneinträge? Soweit ich weiß, werden solche generischen Fehlercodes für mehr als einen Ressourcentyp verwendet. Tatsächlich deutet der erste Google-Treffer darauf hin, dass der Cache-Speicher nicht mehr ausreicht. (KB bei einem XP-Bug, der diesen Fehlermodus ausgelöst hat).

In Ihrem Fall würde ich die "Handle Count" überprüfen. Ein anderes mögliches Problem ist die Adressraumfragmentierung. Wenn Sie eine 1 GB-Dateizuordnungsansicht erstellen möchten, benötigen Sie 1 GB freien Adressraum, und dieser muss zusammenhängend sein. Wenn Sie eine 1-GB-Datei, eine 800-MB-Datei und eine 1-GB-Datei zuordnen, schließen Sie die 800-MB-Datei und öffnen Sie eine 900-MB-Datei. Die 900-MB-Datei passt möglicherweise nicht in das verbleibende Loch.

+0

Danke MSalters. Ich schaue mir die Handle Count an. Wir haben bereits eine Fragmentierung des Adressraums festgestellt, aber das führt normalerweise zu einem Fehler 8. Ein Grund für meine Verwirrung über Free PTEs ist, dass ich sicher bin, dass es bei früheren Versionen von Windows deutlich herunterging, als unsere App lief. –

0

MS hat 2 Möglichkeiten zu erlauben 32-Bit-Betriebssystem mit Hardware, die 4 GB oder mehr RAM hat "umzugehen".

Option 1: ist das, was Sie mit dem Schalter/3GB in der Boot.ini getan haben.

Option 1 Vor- und Nachteile:

(CONS) Diese Option saugt 1 GB von dem normalen 2 GB Kernel-Bereich - daher den O Kampf für die Aufgaben der beiden ausgelagerten Pool Zuweisungen zu treffen und Kernel-Stack-Zuordnungen. So könnte eine Person denken, dass die Verwendung des/3GB Switch ihnen helfen wird, aber wirklich diese Option ist das 32-Bit-Windows-Betriebssystem in einen langsamen Tod zu schrauben.

(CONS) Aber das gibt meine App 3GB .... FALSCH (Daher ist dies eine CON) Der Haken ist, dass nur Anwendungen, die vom Hersteller rekompiliert wurden, "/ 3GB Switch aware" sein können nutze die zusätzlichen 1 GB wirklich. Daher ist die ganze Verwendung des/3GB Switch ein wirklich BAD J.O.K.E für alle.

Lesen Sie diesen Link für ein viel besseres write-up:

http://blogs.technet.com/askperf/archive/2007/03/23/memory-management-demystifying-3gb.aspx

Option 2: Verwenden Sie die/PAE in der Boot.ini.

Option 2 Vor- und Nachteile:

(PROS) Das ist wirklich die einzige Option, wenn Sie eine mehr als 4 GB RAM. Es trickst eine Anwendung, indem es den gesamten Arbeitsspeicher des Anwendungsspeichers in den Arbeitsspeicher legt. Normalerweise befindet sich nur eine Anwendung "Arbeitsgruppe" Arbeitsspeicher in Arbeitsspeicher und die verbleibenden Anwendungsspeicheranforderungen werden in Windows-Bilddatei gespeichert. Was ist ein Anwendungsgesamtspeicherbedarf? - Es nannte "Virtuelle Größe".

In meiner Welt habe ich ein großes fettes Java-basiertes IBM Produkt, mit dem ich mich beschäftige. Der Server, auf dem die "Anwendung" ausgeführt wird, verfügt über 16 GB RAM. Ich füge einfach den/PAE-Schalter hinzu und beobachte (dank sysinternals Processes Explorer), dass die Paging-Anfragen von 200 KB pro Sekunde auf bis zu 4 MB pro Sekunde gehen.

Frage: "Warum"?

Antwort: Die gesamte Anwendung ist im RAM.

Frage: „Ist die Anwendung weiß, dass es vollständig im RAM läuft

Antwort: Nein - Es läuft die gleiche alte Art und Weise, dass es immer laufen,‚denken‘, dass es hat Teil von sich selbst als „Working Set“ Speicher im RAM leben und die übrigen Anwendungsspeicheranforderungen gehen in die Windows-Auslagerungsdatei

Ja, es ist das gut Spiegeln

Bitte beachten sie:.. Microsoft hat einen schlechten Job gemacht zu erzählen jemand a über die großartige Windows OS Option.Duh

Probieren Sie es aus und berichten zu Stackoverflow ....

+0

Danke für Ihre Antwort brentmorrisrtp. Der/3GB-Schalter wurde für uns benötigt, weil es der Adressraum war, den wir brauchten, nicht nur den zusätzlichen physischen RAM. Es war unsere eigene App, so dass wir mit/LARGEADDRESSAWARE rekompilieren konnten, so dass Ihre Con kein Problem für uns war. Wir verwenden auch den/PAE-Schalter, wenn ich mich richtig erinnere. –