2009-09-23 16 views
12

Mam dużą stronę internetową, która wydaje się wysysać całą pamięć, która jest przydzielana. Nie ma nic więcej na serwerze obok tej strony. W ciągu tygodnia zjada 2 koncerty i wymaga ponownego uruchomienia. Obecnie jest to 32-bitowy serwer 2008 wykorzystujący IIS 7. Ponownie instalujemy 64-bitową wersję i dodajemy więcej pamięci. Byłoby miło móc znaleźć miejsce, w którym występują wycieki.Jak wykryć miejsce wycieku pamięci?

Jaka jest najlepsza metoda śledzenia wycieków pamięci?

+0

Mieliśmy podobny problem, jednak gdy używamy wiele narzędzi firm trzecich i wiele niestandardowych aplikacji, jej trudno zmienić wszystko, najlepiej jest , mieliśmy zaplanowane zadanie, aby wykonać miękki restart co noc, gdy nie ma żadnego użytkownika zalogowanego, w ciągu 5 minut serwer jest już gotowy, ale pewnie to pomaga, a następnie przekodowuje wiele rzeczy, problem polega na tym, że wszyscy deweloperzy nie robią poprawnego kodowania i nie używają dobrych narzędzi! ! –

Odpowiedz

1

Możesz spróbować użyć profilerów, takich jak dotTrace - ustawić go w pamięci i uruchomić aplikację.

To powinno dać wskazówki, w których złożeniach i obszarach aplikacji, które zużywają zbyt dużo pamięci w drodze.

1

Prawdopodobnie jest to zapobieganie, a nie wykrywanie, ale na poziomie kodu C# należy sprawdzić, czy wszystkie klasy korzystające z dużych zasobów, takich jak obrazy i inne pliki, poprawnie implementują the dispose pattern. W razie potrzeby możesz również zastąpić finalizator.

MSDN ma dobre wskazówki na ten temat.

Jeśli masz jakieś zajęcia w swojej aplikacji, o których wiesz, że korzystają z dużych zasobów, są to pierwsze miejsca, w których można znaleźć problemy z pamięcią.

0

Czy współpracujesz z Office? Jeśli tak, upewnij się, że oczyściłeś obiekty aplikacji. To jeden z możliwych winowajców.

Kolejny obiekt to obiekt globalny, na przykład obiekt statyczny.

3

W monitorze wydajności dodaj liczniki dla Bajty procesowe/prywatne i .NET CLR Pamięć/liczba bajtów we wszystkich stertach. Prywatne bajty to cała pamięć, a pamięć CLR jest zarządzana. Więc jeśli pamięć CLR pozostaje dość wyrównana, ale prywatne bajty nadal rosną w czasie, oznacza to, że wyciek jest w niezarządzanym zasobie. Oznacza to zazwyczaj, że nie niszczysz prawidłowo zasobów natywnych. Dobrą rzeczą, na którą warto zwrócić uwagę są rzeczy takie jak COM lub IO (strumienie i pliki). Upewnij się, że wszystkie te rzeczy zostaną usunięte, gdy skończysz.

0

Czy masz wiele dynamicznych stron w swojej witrynie?

Możesz także spróbować IBM's Purify

Proponuję spróbować z małym zestawem dynamicznych stron wyłączenie wszystkich innych za międzyczasie. Nienawidzę tego mówić, ale jest bardzo możliwe, że IIS 7 może również mieć przecieki.

1

Zauważyłem, że EQATEC Profiler jest całkiem niezły, a za darmo!

+1

EQUATEC to profiler wydajności (!) - nie ma zastosowania do wykrywania wycieków pamięci. –

1

Sprawdź pamięć i wyciek pamięci laboratoriach na tym blogu:

.NET Debugging Demos

Mogą one być pomocne. Zasadniczo można użyć WinDBG do analizy zrzutu pamięci i pomóc ustalić, co pochłania całą twoją pamięć.

Zastosowaliśmy podobne podejście, aby ustalić, że Regex przeżuwał całą naszą pamięć, ale tylko wtedy, gdy produkt był uruchamiany na maszynach 64-bitowych. Krzywa uczenia się jest dość stroma, ale WinDBG to bardzo potężne narzędzie.

14

Przecieki pamięci w .NET nie są powszechne, ale gdy się zdarzą, najczęściej jest to spowodowane brakiem dołączonych programów obsługi zdarzeń. Upewnij się, że odłączasz procedury obsługi, zanim słuchacze wykroczą poza zakres.

Inną opcją jest, jeśli zapomnisz zadzwonić pod numer Dispose() na zasoby IDisposable. Może to zapobiec oczyszczaniu zasobów niezarządzanych (które nie są obsługiwane przez GC).

Kolejnym możliwym powodem jest zakleszczony finalizator. To uniemożliwi zbieranie wszystkich pozostałych obiektów w kolejce finalizatora.

Używam WinDbg + Sos do śledzenia wycieków. Kroki są następujące

  • Dump sterty i szukać podejrzanych
  • Zastosowanie !gcroot aby dowiedzieć się, co jest utrzymywanie podejrzanych żywcem
  • Powtórzyć w razie potrzeby

Należy pamiętać, że duże zużycie pamięci może również wynikać z fragmentacji sterty. Zwykłe hałdy są zagęszczane, ale przypięte obiekty mogą powodować fragmentację. Ponadto, LOH nie jest sprasowany, więc fragmentacja nie jest rzadkością dla LOH.

Doskonałe tutoriali na WinDbg + sos tutaj: http://blogs.msdn.com/tess/

+0

+1 dla kolejnego obserwatora Tess! :) –

4

Run, nie chodzić, nad Tess blogu Ferrandez'S, If broken it is, fix it you should, która posiada dobrze skryptów laboratoria poświęcone nauce jak diagnozować i debugowania awaria, zawieszenie i problemy z pamięcią z kodem .NET. Ona ma jedne z najlepszych materiałów, które mam znalezionych do tej pory, aby pomóc Ci zacząć.

komercyjne profilowania pamięci takimi jak ANTS i SciTech są doskonałe środki, które pokażą, jakie obiekty znajdują się w sterty i jak są one zakorzenione. Większość komercyjnych profilerów pamięci ma możliwość załadowania "migawki" pamięci procesu (powiedzmy ze środowiska produkcyjnego).

Można przechwycić "przyciąganie" pamięci (patrz Snap v. Dump) za pomocą adplus.vbs lub DebugDiag. Adplus jest dostępny jako część Debugging Tools for Windows. DebugDiag będzie również miał elementarną analizę (ale wydaje się być bardziej niezawodny na niezarządzanym kodzie) automagicznie.

monitorować stosowanie
pomysłu na to, co do monitorowania, patrz Improving .NET Performance and Scalability, a konkretnie rozdział 15.

, jak monitorowanie, istnieją narzędzia komercyjne dostępne za to jak dobrze, jednak każdy system Windows maszyna jest również wyposażona w Perfmon.exe, której można używać do rejestrowania odpowiednich liczników wydajności.

przetestować aplikację
pomysłu, w jaki sposób wykonać obciążenia lub stres, testy, sprawdź wzorców i praktyk Performance Testing Guidance for Web Applications.

debugowania aplikacji
Po zidentyfikowaniu masz problem (monitoring), a w stanie odtworzyć problemu (testowania) można zejść do debugowania problemu. Zobacz linki do Tess - ta informacja niesie ze sobą długą drogę.

Następnie spłucz i powtórz! :)

Powodzenia!
Z

Powiązane problemy