2012-01-10 11 views
5

Mam usługę .NET 4 Windows napisaną w języku C# działającą w systemie Windows Server 2008, która monitorowana w PerfMon wydaje się zużywać 2500 uchwytów na godzinę. Licznik "Handle Count" wspina się coraz wyżej.Jak rozwiązywać problemy z wyciekiem rączek w C# Windows Service

Kiedy patrzę na uchwyty, używając opcji ProcExp z zaznaczoną opcją "Pokaż nienazwane uchwyty i odwzorowania", wymienione są tysiące uchwytów zdarzeń i semaforów. Większość wydaje się nienazwana. Zajrzałem do kodu źródłowego i nie ma jednoznacznych zastosowań AutoResetEvent lub ManualResetEvent.

Licznik prywatnych bajtów wspina się i opada. Nie obserwowałem tego procesu dłużej niż przez kilka godzin, ale zostawiam go monitorowany z dnia na dzień.

Usługa działa na zdalnym serwerze, więc nie mogę bezpośrednio dołączyć do debuggera i prawdopodobnie będę musiał zrzucić proces i przeanalizować go za pomocą programu WinDBG lub podobnego.

Czy można zlokalizować jeden z uchwytów i dowiedzieć się, co wskazuje i/lub co może "posiadać" to? Jeśli tak to jak?

W odpowiedzi na komentarze, oto podsumowanie tego, co robi usługa.

  • gospodarze niektóre usługi WCF
  • gospodarze instancją Quartz.NET planującego
  • gospodarze kolejce element roboczy (Praca kwarcowe naciskać elementów roboczych na kolejce zamiast robić długiego biegu pracują sami)
  • gospodarze wykonawca element roboczy (elementy robocze są rozkolejkowywana na zegar i realizowane z dala od Quartz)
  • gospodarze menedżera zwyczaj cache (który robi dużo pracy ADO.NET)
+0

Brzmi jak twardy. Co robi twoja służba? Można by przypuszczać, że używa jakiegoś API, który wykonuje pewne niezarządzane rzeczy za kulisami. Może jeśli wspomniesz, które biblioteki używasz, to będzie bujało czyjąś pamięć. W przeciwnym razie obawiam się, że otrzymasz odpowiedź typu "upewnij się, że wywołasz .Dispose()". –

+0

Czy Twój serwer korzysta z niezarządzanego kodu, zbieżnych kolekcji, długiego sondowania? – adontz

+0

Dzięki za twoje uwagi do tej pory. Zobacz zaktualizowany opis. – IanT8

Odpowiedz

1

Podstawową koncepcją rozwiązywania problemów jest izolacja. Izolacja pod względem procesów i stanu.

Pierwszą rzeczą, którą należy zrobić, to odtworzyć problem w kontrolowanym środowisku. Spróbuj skonfigurować to na swoim komputerze, jeśli istnieją usługi, których instalacja w środowisku deweloperskim zajęłaby zbyt dużo czasu, zważywszy na ich kpiny.

Gdy już będziesz mieć kontrolę nad otoczeniem, możesz zacząć oddzielać kod, który jest wykonywany, kpiąc lub krojąc go.

Powiązane problemy