Was ist der maximale Speicher, den eine IIS6-Website / ein App-Pool verwenden kann?

8

Ich habe einen IIS 6-Server unter Windows 2003 SP2 x86. Der Server verfügt über 4 GB RAM und wird konsistent mit 2 GB zugewiesen.

Mir ist klar, dass mit x86 der Server nicht den gesamten 4 GB RAM nutzt und der Anwendungsbereich ebenfalls begrenzt ist, aber die IIS-Prozesse scheinen an anderer Stelle begrenzt zu sein. In w3wp.exe sind nie mehr als 500 MB zugewiesen, und gelegentlich werden OutOfMemory-Ausnahmen von einer ausgelasteten .NET-Anwendung angezeigt (es werden mehrere Anwendungen mit jeweils einem separaten Anwendungspool ausgeführt).

Was ist der maximale Speicher, den eine IIS6-Website / ein App-Pool verwenden kann?

Robin M.
quelle

Antworten:

7

Apps unter Windows x86 sind auf 2 GB / Stück beschränkt. Sie können dies ändern, indem Sie das Flag / 3gb zur Datei boot.ini hinzufügen. Dies kann jedoch zu unerwartetem Anwendungsverhalten führen und sollte mit Vorsicht verwendet werden. MS unterstützt dies offiziell nicht ( http://technet.microsoft.com/en-us/library/bb124810.aspx )

Die Speicherbeschränkungen von IIS können auf der Registerkarte Recycling im entsprechenden App-Pool festgelegt werden.

Wie stellen Sie fest, dass die Anwendung niemals über 500 MB hinausgeht? Wenn Sie den Task-Manager verwenden, denken Sie daran, dass es sich selten (wenn überhaupt) um eine genaue Darstellung der Speichernutzung handelt, wie Windows sie versteht. Verwenden Sie den Prozess-Explorer: http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx

Es gibt eine Reihe weiterer relevanter Fragen:

  • Sind in Ihren Ereignisprotokollen Fehler protokolliert?
  • Ist es eine bestimmte Codezeile, die die Ausnahmen auslöst? Wenn ja, handelt es sich bei dieser OutOfMemory-Ausnahme tatsächlich um ein IIS-Problem oder um ein Codeproblem?
  • Beschränken Sie Ihre Anwendungspools überhaupt mit der Einstellung Recyling?
  • Gibt es andere Dienste, die auf diesem Computer ausgeführt werden?

Höchstwahrscheinlich erreichen IIS, ASP.NET und das gesamte zugehörige Gepäck die 2-GB-Grenze, obwohl der Windows Task-Manager dies nicht anzeigt. Das Festlegen von Recycling-Grenzwerten oder das Aktualisieren auf x64 wird wahrscheinlich einen großen Unterschied machen.

sh-beta
quelle
3

Erhalten Sie gelegentlich OutOfMemory-Ausnahmen von einer ausgelasteten .NET-Anwendung

Die Antwort darauf ist zu komplex, um in eine Antwort zu passen. Eine vollständige Beschreibung des Themas finden Sie unter " Optimieren der Leistung von .NET-Anwendungen " .

Hier ist eine stark vereinfachte (aber immer noch recht gute) Zusammenfassung von Bruno Jouhier :

Darüber hinaus können Sie mit der .NET-Laufzeit nicht bis zu 2 GB erreichen. Der Garbage Collector kopiert lebende Objekte und benötigt daher ausreichend Platz, um seine Kopien auszuführen.

Bearbeiten:

Hier ist mein Erklärungsversuch ...

Wenn Sie sich fragen, wie groß der maximale Arbeitsspeicher des Arbeitsprozesses (wie vom Task-Manager angegeben) für einen ASP.NET-Arbeitsprozess unter x86 ist, lautet die Antwort "es hängt davon ab" .

In jeder Art von verwaltetem Code wie Java oder .NET gibt der Programmierer die fein abgestimmte Kontrolle des Speichers auf, um nicht mit Zeigern umgehen zu müssen. Während ein Programm ausgeführt wird, werden Heap und Stack regelmäßig vom Garbage Collector bereinigt .

Insbesondere in Bezug auf ASP.NET wird der Garbage Collector im selben Arbeitsprozess wie die Website ausgeführt. Der GC verbraucht eigenen Speicher. Wie viel Speicher hängt ganz davon ab, wie der Code Ihrer Anwendung geschrieben wird. Eine App kann möglicherweise 1,8 GB Speicher verwenden, während eine andere bei 500 MB erstickt. Um zu verstehen, warum , müssen Sie Ihre spezifische Anwendung profilieren.

Portman
quelle
Ich bin damit einverstanden, dass das Debuggen von OutOfMemory-Ausnahmen komplex ist - danke für den Link. Ich frage jedoch, wie der Speicher begrenzt ist und es sollte möglich sein, darauf zu antworten.
Robin M
2

Jeder Prozess unter einem x86-Windows-Betriebssystem ist auf 2 GB beschränkt, es sei denn, Sie haben den Schalter / 3 GB in Ihrer Datei boot.ini festgelegt. In diesem Fall kann ein Prozess 3 GB verwenden.

Steve Evans
quelle
Ja, aber ich bin nicht annähernd 2 GB für einen Prozess?
Robin M
2

Aus diesem Blog-Beitrag "Empfehlungen für die Einstellungen des SharePoint-Anwendungspools" :

Ich konzentriere mich auf physische Geräte. Normalerweise beschränke ich App-Pools auf maximal 800 MB bis maximal 1200 MB in einer 32-Bit-App mit sehr wenigen App-Pools, abhängig von der Anzahl und Menge des Speichers. Auf einem Server mit 2 GB RAM würde ich ihn auf maximal 800 MB einstellen. Auf einem 4 GB RAM-Server um 1 GB und mehr, wenn mehr mit einem Maximum um 1200. Auf einem 64-Bit-Web-Frontend mit 8-16 GB Speicher habe ich von Einstellungen von 2 GB RAM gehört oder sogar zugelassen, dass es läuft. anstatt es einzuschränken.

Sie müssen es wirklich profilieren, da diese wirklich wachsen können, um sie zu verarbeiten und zwischenzuspeichern. Je größer der Arbeitsspeicher und je größer die Last, desto höher wird der Arbeitsprozess. Wenn Leute nach der Konfiguration des App-Pools fragen, fragen sie hier normalerweise, wie die Zahlen lauten sollen. Was Sie hier tun, ist explizit, den App-Pool daran zu hindern, mehr Speicher zu verbrauchen. Beachten Sie, dass sich diese Einstellung auf der Registerkarte "Recyceln" befindet. Dafür gibt es einen Grund.

Wenn ein App-Pool das Maximum erreicht, entspricht dies nicht der maximalen Prozessoreinstellung. Es wird den Worker-Prozess durchlaufen, der einem winzigen Neustart oder einem iisreset ähnelt, aber nicht, da dies manchmal geschehen soll, damit wir unseren Speicher freigeben können. In einer idealen Welt möchten Sie wirklich nicht mehr als ein paar Mal pro 24-Stunden-Zeitraum radeln. Ich habe von einigen gehört, die versucht haben, kurz vor dem Auftreten des morgendlichen Höhepunkts einen Zyklus durchzuführen, damit sie über den größten verfügbaren Speicher verfügen, und dann einen Zyklus direkt am Ende des Tages, bevor die Sicherungen oder das Crawlen beginnen.

Nach meiner Erfahrung ist 800 MB die Schwelle für 32-Bit-Maschinen (2-4 GB RAM). Es recycelt App-Pools, bevor Ausnahmen "aus dem Speicher" ausgelöst werden.

splattne
quelle
2

Stellen Sie sicher, dass Sie die Größe des virtuellen Speichers in Ihrem App-Pool nicht festlegen. Wenn Sie diesen Wert auf eine Zahl außerhalb des zulässigen Bereichs einstellen, wird er auf 512 MB zurückgesetzt. Siehe KB923197 .

Beachten Sie außerdem, dass ASP.Net den Pool bei Ausführung einer ASP.Net-Anwendung mit 60% des 2-GB-Speicherlimits oder 1,2 GB recycelt. Dies ist nicht Ihr ~ 500-Szenario, aber bei 32-Bit-Apppools mit großer Speichernutzung wird dies manchmal über Wochen durchgeführt, um etwas mehr Speicher zu erhalten.

<system.web> 
  <processModel memoryLimit="80" />
</system.web> 
Christopher_G_Lewis
quelle
1

Unter Windows 2003 können Sie die PAE ( Physical Allocation Extension ) so einstellen , dass der gesamte Speicher verwendet wird. Der Standardspeicher für einen IIS6-Apppool beträgt 5 MB .

Gemeinschaft
quelle
Ok, aber das erklärt nicht, warum der Prozess auf 500 MB beschränkt ist. Der Standardspeicher für einen App-Pool ist interessant, aber nicht wirklich relevant oder nützlich, sorry!
Robin M
Führen Sie SQL zufällig auf derselben Box aus?
Nein. SQL befindet sich nicht in derselben Box. Es ist auf Web / FTP / SMTP mit IIS beschränkt.
Robin M