w3wp.exe hogs Speicher

8

Bei einer Installation von Small Business Server 2011 scheint eine ganze Reihe von w3wp.exe-Prozessen überproportional viel Speicher zu verwenden. Die sofort einsatzbereiten SBS-Installationen umfassen insgesamt 7 Standorte und 20 ASP.NET-Anwendungspools (Sharepoint, Exchange, WSUS und SBS-spezifische Inhalte wie Remote Web Workplace).

Das resultierende Dutzend von w3wp.exe-Prozessen verbraucht im Laufe der Zeit tendenziell mehr als 4 GB Arbeitsspeicher des Servers, wobei der maximale Anwendungspool derjenige ist, der zu WSUS gehört, mit etwa 800 MB im Arbeitssatz. Das manuelle Recycling der Anwendungspools über die IIS-MMC hilft dabei, die Speichernutzung vorübergehend zu reduzieren (die Prozesse von w3wp.exe werden auf 10 MB reduziert, von denen einige schnell nachwachsen), aber offensichtlich möchte ein Administrator dies nicht den ganzen Tag tun. Ich konnte keine Empfehlungen zum automatischen Recycling der von SBS vorinstallierten Anwendungspools finden, daher zögere ich etwas, dies nur auf Produktionssystemen zu tun.

Meine Recherchen im Internet, wie dies begrenzt werden kann, haben nur eine Reihe von Beiträgen ergeben, die besagten, dass der Speicherverbrauch von w3wp nicht schaden, sondern die Leistung verbessern würde, da der Speicher "freigegeben würde, wenn er von anderen Anwendungen benötigt wird". Das Problem ist, dass es nicht funktioniert:

  • Zum einen ist ein SBS ein Server mit mehreren Rollen, wobei eine der Rollen (die wichtigste) der CIFS-Netzwerkspeicher ist, der immens vom Caching des Dateisystems profitiert, das wiederum davon abhängt, dass der Speicher "frei" ist, wie in "nicht von anderen Prozessen in irgendwelchen verwendet" way "- ASP.NET-Anwendungspools, die kaum Benutzer sehen und Speicher verbrauchen, sind kontraproduktiv
  • Eine andere Sache ist, dass ich immer noch einen erheblichen Rückgang des Speicherverbrauchs der w3wp-Instanzen bei Speichermangel feststellen muss - was ich sehe, ist ein geringfügiger Rückgang um deutlich weniger als 100 MB und stattdessen ein übermäßiges Auslagern -, was wiederum die Leistung beeinträchtigt

Ich verwalte kaum IIS- oder ASP.NET-Apps. Daher sind Ideen zur effektiven Reduzierung der Speicheranforderungen für die Anwendungspools willkommen.

the-wabbit
quelle
Was macht diese ASP.NET-App? Ich habe gesehen, dass w3wp.exe viel Speicher verwendet, wenn eine App keine Verbindungen mit Linq-To-SQL oder Entity Framework herstellen kann.
Nate
Es gibt einige. Viele beziehen sich auf Exchange wie OWA / OMA- und Sync-Dienste, einer davon ist WSUS, einige werden für Sharepoint- oder angepasste SBS-spezifische Sites (CompanyWeb, Remote Web Workplace) verwendet
the-wabbit

Antworten:

7

Willkommen in der wundervollen Welt von SBS. Empfohlene Anforderungen für RAM = 10 GB ... und es sind mindestens 8 GB erforderlich. ( laut Microsoft .) aus gutem Grund. Es ist keine fein abgestimmte, gut geölte Maschine ... sie ist sehr schlampig, aufgebläht und hat alles unter der Sonne gebündelt. Je mehr RAM Sie in diese Box werfen können ... desto besser. Leider sind Sie auf max. 32 GB beschränkt. Welches imho ... ist dumm.

TheCompWiz
quelle
Ich denke, ich sollte meine Antwort ein wenig verfeinern. Wenn Sie sich Sorgen über die Menge an RAM machen, die es verbraucht, sparen Sie sich viel Zeit und Kopfschmerzen, indem Sie einen der folgenden Schritte ausführen: A) Verwenden Sie nicht SBS ... verwenden Sie den Standardserver und richten Sie die Rollen ein, die Sie benötigen individuell. oder B) Wirf mehr RAM in das System ... da RAM ziemlich billig ist. SBS ist für sehr kleine Büros ausgelegt ... (10-20 Arbeitsplätze ...) und lässt sich nicht sehr gut skalieren.
TheCompWiz
Danke für deine Antwort. Das System, auf dem ich das Verhalten beobachtet habe, hatte 16 GB RAM, was die physikalische Grenze darstellt. Der verfügbare Speicher füllte sich schnell mit der Datei store.exe von Exchange und zahlreichen Instanzen von SQL Server und w3wp.exe, die nicht nur "nicht fein abgestimmt", sondern geradezu verrückt sind. Ich weiß, wie ich mit Problemen mit übermäßigem Speicherverbrauch der beiden anderen umgehen kann, da ich häufig Exchange- und SQL Server-Systeme verwalte, aber mit w3wp bin ich etwas ratlos. Das Netzwerk selbst hat nur 11 Benutzer.
The-Wabbit
Exchange, SQL Server und IIS verfügen alle über Mechanismen, die versuchen, 100% des Arbeitsspeichers für "zwischengespeicherte" Daten zu verbrauchen. Wenn etwas andere Anfragen mehr RAM ... alle 3 soll maßstabsRück andere Dienste ermöglichen , ohne auf Swapping zu laufen. (in der Theorie) In der Praxis finde ich jedoch, dass Sie bei einigen Dingen nur mit den Schlägen rollen müssen ... Sie können versuchen, alles manuell zu optimieren und harte Grenzen zu setzen ... aber Sie werden immer Ihren Schwanz verfolgen Das hier. Ich werde sehen, ob ich einen Artikel finden kann, den ich vor einigen Jahren über die Begrenzung von Anwendungspools in IIS für Sie gelesen habe ...
TheCompWiz
7

Das habe ich letztendlich getan:

Setzen Sie den Serveranwendungscache für die .NET AppPools auf einen niedrigen Wert (5 MB), indem Sie den Parameter privateBytesLimit im web.configat %WINDIR%\Microsoft.NET\Framework\<version>\Configwie in dieser Antwort vorgeschlagen festlegen :

    <configuration>
      <system.web>
         <caching>
           <cache privateBytesLimit="5242880" privateBytesPollTime="00:01:00" />
         </caching>
      </system.web>
    </configuration>

Dies trug dazu bei, die Speichernutzung mit den Standardeinstellungen für das Poolrecycling auf etwas mehr als 1 GB zu reduzieren.

Anscheinend kann die Verwendung des Garbage Collector ( <gcServer = "true">) vom Typ "Server" ebenfalls zu einem erheblichen Speicherverbrauch führen , ist jedoch anscheinend <gcServer>standardmäßig auf "false" gesetzt.

the-wabbit
quelle
Zu Ihrer Information
Greg Askew
@ the-wabbit Ist der Ratschlag, gcServer = false zu setzen, immer noch aktuell, da die Server-Garbage-Collection gleichzeitig erfolgt?
Michael Steele
6

Wenn Sie den Verdacht haben, dass der resultierende Speicherverbrauch aufgrund eines Softwarefehlers ein Problem darstellt, können Sie mit Microsoft DebugDiag 1.2 einen vollständigen Speicherauszug erstellen und den Speicherauszug auf häufig auftretende Probleme analysieren. Wenn Sie glauben, dass ein Speicherproblem vorliegt, müssen Sie die Leckverfolgung aktivieren, indem Sie die Option "Auf Lecks überwachen" auswählen und eine Weile laufen lassen, bevor Sie den Speicherauszug erstellen / analysieren.

DebugDiag 1.2 Laden Sie https://www.microsoft.com/download/en/details.aspx?id=26798 herunter

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Greg Askew
quelle
Danke für den Link, ich werde es versuchen. Das MSI-Installationspaket hat anscheinend Probleme, wenn es auf lokalisierten (nicht US-Englisch) Windows-Versionen ausgeführt wird. Ich muss prüfen, ob es eine Problemumgehung gibt.
The-Wabbit
2

Sie benötigen nicht für jede App einen separaten App-Pool, sondern nur diejenigen, die unzuverlässig sind oder denen Sie Priorität einräumen möchten. Viele können teilen (verschiedene .net-Versionen getrennt halten). Sie können dann den Speicher, den ein App-Pool verwendet, realistischer begrenzen. Es sollte nicht erforderlich sein, Pools mehr als einmal am Tag wiederholt zu recyceln.

Außerdem kann auf diese Weise nur so viel Speicher freigegeben werden. Während ein Teil davon Cache sein wird, benötigt jede App eine bestimmte Menge an Arbeitsspeicher, die stark von der spezifischen Web-App abhängt. Der Versuch, dies zu sehr einzuschränken, wird die Dinge zum Erliegen bringen.

Das Problem ist wirklich, dass SBS versucht, zu viel auf einmal zu tun. Sie müssen sich ansehen, was Sie tatsächlich verwenden, und abschalten, was Sie nicht tun.

Aber um ehrlich zu sein für nur 11 Benutzer, wohin geht der Rest des Speichers? Exchange und SQL für den leichten Gebrauch benötigen sicherlich nicht mehr als 12 GB!

James Ryan
quelle
Ah, Sie haben noch nie die Schönheit eines SBS erlebt, oder? Der Exchange-Informationsspeicher wächst auf 8 GB, wenn er nicht eingeschränkt ist. Mehrere SQL Server-Instanzen belegen problemlos weitere 3 GB. In den meisten App-Pools werden nur 1-2 Anwendungen mit derselben .NET-Version und im selben Sicherheitskontext ausgeführt. Ich kann sie jedoch aufgrund von Supportproblemen nicht neu gruppieren. Es ist auch unwahrscheinlich, dass die Speicherprobleme gelöst werden - wenn ich nur 4 1-GB-Prozesse anstelle von 12 kleineren habe, wird nicht viel gewonnen.
The-Wabbit
Der Unterschied zu weniger App-Pools besteht darin, dass die verschiedenen Caches voll mit dem sind, was regelmäßig verwendet wird, und das, was nicht, herausgedrückt wird. Mit vielen App-Pools wird mehr verschwendet. Wie viele Sicherheitskontexte benötigen Sie tatsächlich mit 11 Benutzern? Ja, Exchange wird fröhlich so viel Speicher verwenden, wie es in die Hände bekommen kann, aber es wird auch gerne mit nur 2 GB für diese wenigen Benutzer ausgeführt, wenn Sie es einschränken. Mit SBS müssen Sie akzeptieren, dass Sie nicht überall Best Practices verwenden oder keine der Optionen optimal ausführen können. Sie müssen ein bisschen pragmatisch sein und nicht überentwickeln.
James Ryan
Wenn Sie versuchen, 20 Instanzen davon auf einem Server auszuführen, ist es kein Wunder, dass Sie versuchen, alles in den Speicher zu packen. Sie hätten das in der Frage wirklich erwähnen sollen, da es die Dinge in ein ganz anderes Licht rückt.
James Ryan
Das tue ich eigentlich nicht - wie ich bereits sagte, tritt das Problem bei einem physischen System auf, bei dem selten verwendete App-Pools Speicher aus dem viel wertvolleren Dateisystem-Cache stehlen. Ich vermutete, dass dies auf das Zwischenspeichern von Objekten in den Anwendungspools zurückzuführen war, und suchte nach Mitteln, um den Cache zu verkleinern / deaktivieren.
The-Wabbit