2012-12-11 8 views
8

Mam aplikację WCF hostowaną w IIS (napisaną w C#/.Net 4). Z biegiem czasu liczba uchwytów procesu rośnie w sposób mniej lub bardziej liniowy (wzrasta nawet 30 000, zanim proces zostanie ponownie przetworzony). Według SysInternals Process Explorer, większość uchwytów, które proces ma, jest typu Thread. Jednak według Monitora wydajności liczba wątków pozostaje mniej więcej stała (około 40)."Wycieki" Uchwyty gwintów

Najwyraźniej robię coś nie tak i jestem ciekawy Thread Handles. Jednak nie wiem dokładnie, co to jest Thread Handle w tym kontekście. Założę się, że jest to uchwyt do wątku, ale ponieważ liczba wątków pozostaje spójna, nie widzę, aby liczba uchwytów stale rosła. I, nie mogę wymyślić żadnego sposobu, aby utrzymać uchwyt do wątku, podczas gdy sam wątek znika. Co więcej, nie tworzę jednoznacznie nowych wątków (w niektórych miejscach używam ThreadPool).

Najwyraźniej brakuje mi czegoś. Ale co?

+0

Czy masz usługę WCF jako SingleInstance, PerCall lub Session? Czy używasz tam kontenera IoC? – Jordi

+0

Czy zarządzasz wątkami samodzielnie lub czy używasz puli wątków? Jakiego rodzaju wątków używa twoja aplikacja (czy mówimy o wątkach, które robi IIS -> ograniczone przez sam IIS, czy własne wątki)? – Rafa

+0

Usługa WCF jest pojedynczą instancją i wieloma współbieżnościami. Brak kontenera IOC. –

Odpowiedz

0

According documentation:

Gdy nowy gwint jest tworzony przez funkcję CreateThread lub CreateRemoteThread, uchwyt do gwintu jest zwracany.

Więc jeśli masz tyle uchwytów, twoja aplikacja stale tworzy nowe wątki. Z drugiej strony prawie stała liczba wątków w Monitorze wydajności mówi, że wątki są tworzone zamiast tych z recyklingu.

ThreadPool klasa dokumentacja:

Począwszy Framework 4, puli wątków tworzy i niszczy wątków roboczych w celu optymalizacji przepustowości, który jest zdefiniowany jako liczba zadań, które kompletne jednostki czasu. Zbyt mało wątków może nie optymalnie wykorzystać dostępnych zasobów, podczas gdy zbyt wiele wątków może zwiększyć rywalizację o zasoby.

Więc myślę, że twoje zachowanie aplikacji jest spowodowane ThreadPool.

+0

@Brian Rasmussen Dziękuję – VMAtm

1

Można mieć uchwyty do zakończonych wątków. W ten sposób wątki są tworzone, kończą się, ale uchwyt pozostaje.

Uruchom monitor procesu (procmon.exe) i ustaw go, aby odsłuchał "Proces i wątek" (wyłączenie plików, rejestru i sieci). Określ, kto tworzy wątki, klikając dwukrotnie wątek, twórz zdarzenia i przeglądaj stos.

To powinno odpowiedzieć na pytanie, kto tworzy wątki. Jest odpowiedzialny za zamknięcie uchwytów.