2008-12-10 12 views
7

Auf meinem Computer (XP, 64) startet der ASP.net Worker-Prozess (w3wp.exe) immer mit 5.5 GB virtuellem Speicher reserviert. Dies geschieht unabhängig von der Webanwendung, die es hostet (es kann alles sein, sogar eine leere Webseite in aspx).Ermitteln, wer/was reserviert 5.5 GB virtueller Speicher in w3wp.exe

Dieser große alte Teil des virtuellen Speichers ist in dem Moment reserviert, in dem der Prozess beginnt, also ist dies kein allmähliches "Speicherleck" irgendeiner Art.

Einige herumschnüffeln mit windbg zeigt, dass die Speicherfrage ist Private, Reserved und RegionUsageIsVAD, was darauf hinweist, dass es die Arbeit von jemandem sein kann, der VirtualAlloc aufruft. Es zeigt auch, dass der betreffende Speicher in 4 großen Blöcken von jeweils 1 GB und mehreren kleineren (jeweils 1/4 GB) zugewiesen/reserviert ist.

Also ich denke, ich muss herausfinden, wer VirtualAlloc anruft und all diesen Speicher reserviert. Wie mache ich das?

Das Anhängen eines Debuggers an den Prozess vor der Speicherzuweisung ist schwierig, weil w3wp.exe ein Prozess ist, der von svchost.exe (dh IIS/ASP.Net-Filter) gestartet wird und wenn ich versuche, es selbst zu starten Um es zu debuggen, schließt es einfach ohne all diese umfangreiche Speicherreservierung. Außerdem sind die Befehlszeilenparameter ungültig, wenn ich sie erneut verwende (was sinnvoll ist, weil es sich um eine vom aufrufenden Prozess erstellte Pipe handelt).

Ich kann windbg es nach der Tatsache an den Prozess anhängen (so habe ich die Speicherbereiche in Frage), aber ich bin mir nicht sicher, es ist zu diesem Zeitpunkt möglich zu bestimmen, wer was zugewiesen.

+1

Ich möchte nur sagen "Oh mein Gott"! – StingyJack

+0

Das ist die erste relevante Verwendung des neuen Tags , den ich gesehen habe (natürlich außerhalb der Heroes-Seiten auf NBC.com)! –

+0

Ich sehe das gleiche Verhalten auf Server 2008, IIS7 –

Antwort

7

David Wang answers this to a similar question:

[...] die ASP.Net Leistung develo pro sagt mir das:

  • Der reservierte virtuelle Speicher ist nichts, worüber man sich sorgen. Sie können es als Performance/Caching-Voraussetzung der CLR anzeigen. Und schwere Belastungstests zeigt, dass es keine Sorgen über ist.
  • System.Windows.Forms - Es ist nicht durch leere hallo Welt ASPX Seite gezogen. Sie können Microsoft Debugging Tools und "sx e ld system.windows.forms" verwenden, um zu identifizieren, was es tatsächlich zur Laufzeit zieht. Oder Sie können ildasm die Abhängigkeit finden.
  • mscorlib - vergewissern Sie sich, dass es richtig gecact ist.
3

Der virtuelle Speicher ist nur der Adressraum, der dem Prozess zugewiesen ist. Es hat nichts mit der Speichernutzung zu tun.

See:

  1. Virtual Memory
  2. Pushing the Limits of Windows: Virtual Memory
  3. http://support.microsoft.com/kb/555223
+0

Die Menge des reservierten virtuellen Arbeitsspeichers wirkt sich auf die "virtuelle Größe" des Prozesses aus, wodurch das Prozessrecycling in asp.net auf der Grundlage virtueller Speichergrenzen unbrauchbar wird. –

+0

Und was soll das heißen? Die VM kann aufgrund der erhöhten Adressierungsanforderungen zunehmen. Ich bin mir nicht sicher, ob das jemals zu groß werden wird. Ich kann wirklich nicht testen, nur 32 Bit Vista hier. Sie erhalten maximal 3 GB VM AFAIK, aber nur maximal 2 GB pro Arbeitsspeicher. – leppie

0

Reservierter Speicher ist sehr verschieden von zugeordnet Speicher. Reservieren von Speicher reserviert nur Adressraum.Es legt keine physischen Seiten fest.

Dieser Adressraum wird wahrscheinlich von IIS für seinen Heap zugewiesen. Es wird nur bei Bedarf Seiten binden.

Wenn Sie w3wp.exe wirklich von windbg starten möchten, müssen Sie es wahrscheinlich mit gültigen Befehlszeilenargumenten starten. Sie können Process Explorer verwenden, um festzustellen, wie die Befehlszeile für den aktuellen w3wp.exe-Prozess lautet. Zum Beispiel auf meinem Server, ich war:

c. \ Windows \ system32 \ inetsrv \ w3wp.exe -a \ \ pipe \ iisipmeca56ca2-3a28-452a-9ad3-9e3da7b7c765 -t 20 -ap " DefaultAppPool“

ich bin mir nicht sicher, was die UID dort gibt an, aber es sieht es wohl im laufenden Betrieb durch den W3SVC-Dienst generiert wird (das, was w3wp.exe gestartet ist), um das Rohr dort angegeben zu nennen. Sie sollten sich also unbedingt Ihre Befehlszeile ansehen, bevor Sie w3wp von windbg starten.

+0

Diese Befehlszeilenargumente sind einmalig und können nicht wiederverwendet werden, ich habe es versucht. –