2010-11-12 7 views
6

Dostajemy wiele wyjątków pamięci i nie możemy zdiagnozować, co się dzieje. Wydaje się, że jest to problem, który spowoduje wzrost zużycia pamięci z 300 megs do ponad Gig w mater kilka minut. Teraz jest to aplikacja IIS i ma 3 domeny aplikacji działające w osobnych pulach wątków.CLR z wyjątków pamięci

Chcemy nagrywać, gdy niedługo nastąpi wyjątek pamięci. Możemy więc spróbować znaleźć wzór. Moje pytanie brzmi: jaki jest najlepszy sposób na zrobienie tego? Czy istnieje sposób na kwerendę użycia pamięci raz na minutę, aby zobaczyć, jak wysoko jest i wysłać e-mail z ostrzeżeniem. A może napisać aplikację, która będzie monitorować wykorzystanie pamięci CLR? pomysły lub kierunek są bardziej niż mile widziane.

EDIT

Używam Perfmon ale chyba jestem obserwując proces to nie jest użyteczne. Mogę tylko zobaczyć, co było i kiedy. Użyłem także narzędzia do profilowania pamięci czerwonej bramy, które jest niesamowite, ale nie mogę trafić w stronę lub proces powodujący wyjątek.

+0

byłby zainteresowany, aby dowiedzieć się, co znalazłeś winnym – Kev

Odpowiedz

3

Zainstaluj program ADPlus na swoim serwerze (jest to część Windows Debugging Tools). Po uruchomieniu obserwując Wykorzystanie niezwykle wysoki pamięć przechwycić zrzut pamięci przy użyciu:

adplus -hang -p <PID> -quiet -o <dump file folder path> 

<PID> jest identyfikator procesu proces roboczy, który można uzyskać od tasklist.exe.

Jeśli nie zawsze wokół kiedy ten problem występuje wtedy można zautomatyzować przechwytywania zrzutu pamięci przy użyciu DebugDiag:

  1. Zastosowanie DebugDiag w trybie śledzenia przeciek do wyzwalania zrzut procesu, gdy albo swój prywatny lub wirtualna wykorzystanie pamięci osiąga określony próg. To powiedziawszy, nie zawsze uważałem to za wiarygodne.

  2. Użyj DebugDiag w trybie awaryjnym w celu przechwycenia zrzutu za każdym razem, gdy są zgłaszane wyjątki CLR. Możesz użyć Ustawienia zaawansowane, aby skonfigurować DebugDiag do tworzenia pełnego zrzutu pamięci po napotkaniu wyjątku CLR typu System.OutOfMemoryException. Jest to bardziej wiarygodne i na pewno wyzwoli. Używaj tylko ustawień zaawansowanych -> wyjątki, nie dotykaj nieskonfigurowanych wyjątków pierwszej szansy, pozostaw to ustawienie na Brak.

Po uruchomieniu zrzutu pamięci WinDBG załaduj plik zrzutu i załaduj system SOS i zacznij grzebać.

Tess Ferrandez na blog jest wielki zasób .NET debugowanie i ma mnóstwo artykułów i laboratoriach o tym, jak wyśledzić przecieki pamięci:

If it is broken, fix it you should - memory issue articles

.NET Debugging Demos Lab 6:_Memory Leak
.NET Debugging Demos Lab 6:_Memory Leak - Review
.NET Debugging Demos Lab 7: Memory Leak
.NET Debugging Demos Lab 7: Memory Leak - Review

Liczniki PerfMon są użyteczne i mogą być użyte do potwierdzenia wycieku pamięci, ale nie mówią całej historii. WinDBG i SOS to narzędzia, których potrzebujesz, aby dowiedzieć się, gdzie jest używana twoja pamięć.

1

Wypróbuj RedGate Memory Profiler. Przypuszczam, że działa z witryn ASP.NET (ich profiler wydajności zdecydowanie).

+0

Mam to wspaniałe narzędzie, ale bezużyteczne, jeśli nie możesz odtworzyć problemu, ponieważ nie wiem, co seria zdarzeń powoduje skok, to nie pomoże.Jest to świetne narzędzie, nie mniej jednak. –

2

Perfromance monitora aka Perfmon jest twoim przyjacielem - To darmo i nie nachalne i lekki i można bezpiecznie uruchamiać na serwerach produkcyjnych, jeśli używasz mniej częstego pobierania próbek (co kilka sekund). Minimalna możliwa do zrobienia jest próba użycia pamięci/procesora dla procesów (w3wp.exe) i zapisanie ich w pliku.

Ponieważ nie udostępniłeś tego, co robisz w aplikacji, nie mogę zaproponować liczników wydajności do przechowywania, ale jest ich mnóstwo w ASP.NET i .NET i CLR.

Ponieważ otrzymujesz wyjątek CLR poza pamięcią, moje przeczenie to GC nie działa z powodu przypiętego obiektu lub czegoś podobnego. Wątpię, by był to niezarządzany zasób, taki jak bitmapa, która nie została wydana, chociaż mogłaby.

Oto lista liczników Proponuję:

.NET CLR Memory

  • GC Uchwyty
  • przypięte obiekty

procesowe dla w3wp.exe Twoja aplikacja

  • Kilka ale przede wszystkim zestaw roboczy

ASP.NET

  • Zarządzane pamięci wykorzystywane
+0

Nie sądzę, że jest to obiekt przypięty, mamy tylko 2 obszary w kodzie, w które przypinamy obiekty i oba wydają się w porządku, ale to świetny punkt! –

+0

Łatwo będzie zobaczyć, czy licznik obiektów przypiętych rośnie. Zdecydowanie polecam używanie perfmon jako startup. – Aliostad

0

pomocą profilera pamięci. Jest tam kilka dobrych, np. JetBrains dotTrace lub ANTS Memory Profiler z Red Gate.Było kilka dyskusji tutaj o stackoverflow z wieloma innymi wskazówkami i zaleceniami.

+0

Profilowanie pamięci jest przydatne tylko wtedy, gdy wiesz, co zwykle robi się, aby znaleźć skok pamięci. –

0

użyłbym ADPlus w trybie „Crash”, aby przechwycić zrzut pamięci, gdy wystąpi wyjątek, a następnie WinDbg i SOS dowiedzieć się, co zajmuje całą pamięć.

+1

Tryb awaryjny nie zrzuci procesu, ponieważ wyjątki OOM często nie powodują awarii procesu roboczego. – Kev

+0

Powinien używać trybu "zawieszenie" do przechwytywania zrzutów procesu, gdy wystąpi wyjątek. Następnie analiza zrzutów może pokazać, co jest na stercie. –

+0

Właściwie, mój błąd, ale najpierw musisz skonfigurować ADPlus za pomocą skryptu config. Uważam, że DebugDiag jest bardziej przydatny w 95% przypadków, z jakimi się zetknąłem. – Kev

0

Użyj dotTrace lub YourToolkit .Net, gdzie możesz dołączyć profilera do procesu ASP, mają wersję próbną, więc nie musisz wydawać pieniędzy od razu. Za pomocą tych profilerów można wybrać linię czasu, w której pamięć zaczyna się zwiększać (można zobaczyć wykorzystanie pamięci wizualnie na wykresie), więc powinno być dość łatwo wybrać zasięg i zrozumieć, co powoduje, że wykorzystanie pamięci tak wysoko się strzela.

Powiązane problemy