2009-09-23 9 views
12

Ich habe eine große Website, die den gesamten Speicher aufzusaugen scheint, der zugewiesen wird. Es gibt nichts anderes auf dem Server neben dieser Site. Innerhalb einer Woche frisst es die 2 Gigs und erfordert einen Neustart. Derzeit ist dies Server 2008 32 Bit mit IIS 7. Wir installieren neu, um 64bit zu verwenden und mehr Speicher hinzuzufügen. Es wäre schön, in der Lage zu sein, herauszufinden, wo die Lecks auftreten.Wie erkennt man, wo ein Memory Leak ist?

Was ist die beste Methode, um Speicherlecks zu verfolgen?

+0

Wir ähnliches Problem hatte, als wir viele Tools von Drittanbietern und viele benutzerdefinierte Anwendungen verwenden, seine schwer zu ändern alles, am besten ist Wir haben eine geplante Aufgabe jeden Morgen Soft-Reboot zu machen, wenn kein Benutzer eingeloggt ist, innerhalb von 5 Minuten Server ist aber sicher, dass hilft, dann viele Dinge neu zu kodieren, Problem ist, dass alle Entwickler nicht richtig programmieren und keine guten Tools verwenden! ! –

Antwort

1

Sie können versuchen, Profiler wie dotTrace zu verwenden - setzen Sie es in eine Gedächtnisspur und führen Sie Ihre Anwendung aus.

Dies sollte Ihnen Anhaltspunkte geben, in welche Baugruppen und Bereiche der Anwendung, die zu viel Speicher auffressen, loslegen.

1

Dies ist wahrscheinlich Prävention und dann Erkennung, aber auf der C# -Code-Ebene sollten Sie überprüfen, ob alle Klassen, die große Ressourcen wie Bilder und andere Dateien verwenden the dispose pattern korrekt implementieren. Bei Bedarf müssen Sie möglicherweise auch den Finalizer überschreiben.

MSDN hat eine gute Anleitung zu diesem Thema.

Wenn Sie Klassen in Ihrer Anwendung haben, von denen Sie wissen, dass sie große Ressourcen verwenden, sind dies die ersten Adressen, die nach Speicherproblemen suchen.

0

Machst du eine Office-Interop? Wenn ja, vergewissern Sie sich, dass Sie Ihre Anwendungsobjekte bereinigen. Das ist ein möglicher Täter.

Ein anderes ist globale Objekte, wie alles, was statisch ist.

3

Fügen Sie im Leistungsmonitor Leistungsindikatoren für Process/Private Bytes und .NET CLR Memory/# Bytes in All Heaps hinzu. Private Bytes sind alle Speicher und CLR-Speicher wird nur verwaltet. Wenn also der CLR-Speicher ziemlich gleichmäßig bleibt, aber die privaten Bytes im Laufe der Zeit weiter wachsen, bedeutet dies, dass das Leck in einer nicht verwalteten Ressource ist. Das bedeutet normalerweise, dass Sie die nativen Ressourcen nicht ordnungsgemäß entsorgen. Eine gute Sache, um zu sehen, ist Zeug wie COM oder IO (Streams und Dateien). Stellen Sie sicher, dass all das Zeug entsorgt wird, wenn Sie damit fertig sind.

0

Haben Sie viele dynamische Seiten auf Ihrer Website?

Sie können auch IBM's Purify

versuche ich vorschlagen, dass Sie mit einer kleinen Gruppe von dynamischen Seiten versuchen, alle anderen für die Zwischenzeit zu deaktivieren. Ich hasse es zu sagen, aber es ist sehr wahrscheinlich, dass IIS 7 auch Lecks haben kann.

1

Ich habe festgestellt, dass die EQATEC Profiler ist ziemlich gut, plus es ist kostenlos!

+1

EQUATEC ist ein leistungsfähiger (!) Profiler - kein Mittel zur Erkennung von Speicherlecks. –

1

Schauen Sie sich den Speicher und Speicherverlust Labors auf diesem Blog-Post:

.NET Debugging Demos

Sie können eine Hilfe sein. Im Grunde können Sie WinDBG verwenden, um einen Speicherabbild zu analysieren und zu bestimmen, was Ihren gesamten Speicher auffrischt.

Wir haben einen ähnlichen Ansatz verwendet, um zu bestimmen, dass Regex unseren gesamten Speicher kaute, aber nur, wenn das Produkt auf 64-Bit-Rechnern lief. Die Lernkurve ist ziemlich steil, aber WinDBG ist ein sehr mächtiges Werkzeug.

14

Speicherverluste in .NET sind nicht so häufig, aber wenn sie auftreten, ist dies meistens auf nicht zugeordnete Ereignishandler zurückzuführen. Stellen Sie sicher, dass Sie die Handler loslassen, bevor die Listener den Bereich verlassen.

Eine weitere Option ist, wenn Sie vergessen, Dispose() auf IDisposable Ressourcen aufrufen. Dies kann die Bereinigung von nicht verwalteten Ressourcen verhindern (die nicht vom GC verarbeitet werden).

Und noch ein anderer möglicher Grund ist ein festgefahrener Finalizer. Dadurch werden alle verbleibenden Objekte in der Finalizer-Warteschlange nicht erfasst.

Ich benutze WinDbg + Sos, um Lecks aufzuspüren. Die Schritte sind wie folgt

  • den Heap Dump und suchen nach Verdächtigen
  • Verwenden !gcroot um herauszufinden, was die Verdächtigen am Leben
  • Wiederholen Sie hält nach Bedarf

Seien Sie sich bewusst, dass große Speichernutzung kann auch auf eine Heapfragmentierung zurückzuführen sein. Die regulären Heaps werden komprimiert, aber angeheftete Objekte können zu Fragmentierung führen. Außerdem ist das LOH nicht kompaktiert, so dass eine Fragmentierung für LOH nicht ungewöhnlich ist.

Ausgezeichnete Tutorials auf WinDbg + sos hier: http://blogs.msdn.com/tess/

+0

+1 für einen anderen Anhänger von Tess! :) –

4

laufen, gehen nicht über zu Tess Ferrandez Blog, If broken it is, fix it you should, die zum Lernen gewidmet gut scripted Labs hat wie die Diagnose und Debuggen Absturz, hängen und Speicherprobleme mit .NET-Code. Sie hat einige der besten Materialien, die ich bis heute gefunden habe, um Ihnen den Einstieg zu erleichtern.

Gewerbe Speicher Profilometer wie ANTS und SciTech sind ausgezeichnete Ressourcen, die zeigen, welche Objekte in dem Haufen sind und wie sie verwurzelt sind. Die meisten kommerziellen Speicher-Profiler haben die Fähigkeit, einen 'Speicher' eines Prozesses zu laden (etwa aus Ihrer Produktionsumgebung).

Sie können einen Speicher 'Snap' (siehe Snap v. Dump) mit adplus.vbs oder DebugDiag erfassen. Adplus ist als Teil der Debugging Tools for Windows verfügbar. DebugDiag wird auch eine rudimentäre Analyse (scheint aber bei nicht verwaltetem Code zuverlässiger zu sein) automatisch haben.

Überwachen Sie die Anwendung
Für eine Idee auf, was Improving .NET Performance and Scalability, insbesondere Kapitel 15.

Wie zu überwachen, sehen Sie, wie zu überwachen, gibt es kommerzielle Tools auch für die zur Verfügung, aber jeder Windows- Maschine wird auch mit Perfmon.exe geliefert, mit dem relevante Leistungsindikatoren aufgezeichnet werden können.

Testen der Anwendung
Für eine Idee, wie Last auszuführen oder Stress, Tests, die Muster überprüfen und Praktiken Performance Testing Guidance for Web Applications.

Debuggen der Anwendung
Sobald Sie ein Problem (Monitoring) haben identifiziert haben und Ihr in der Lage, das Problem (testing) zu reproduzieren Sie das Debuggen des Problems nach unten kann. Siehe die Links für Tess - diese Informationen werden dich weit bringen.

Dann spülen und wiederholen! :)

Viel Glück!