2011-05-14 22 views
24

Mam problem z .Net's ThreadPool (.NET 4).Maksymalna liczba wątków ThreadPool

Przeczytałem, że domyślnie .NET ma limit 25 wątków na procesor, ale według wpisów na forum na SO i w innych miejscach, mogę zwiększyć limit za pomocą poniższego kodu.

void SetThreads(int threads) 
{ 
    ThreadPool.SetMaxThreads(threads, threads); 
    ThreadPool.SetMinThreads(threads, threads); 
} 

Jednakże kiedy ustawić wyżej pewnym dowolnie dużej liczby, na przykład, 2000 i kolejki ~ 1000 pozycji, nadal tylko ~ 33 wątków z systemem (.NET CLR wykonuje ~ 5 wątków) i ThreadPool.GetAvailableThreads() zwraca 1971 wątków pozostałych.

Dlaczego powyższy kod nie działa?

+0

W jaki sposób umieszczasz w kolejce zadania w puli wątków? Pokazanie twojego kodu testowego może naprawdę pomóc. –

+0

Twój problem polega na tym, że powinieneś używać _less_ niż 33 wątków, nie więcej. –

+0

@Henk Holterman, to nie jest duża aplikacja - jest to szybki generator worków HTTP, w którym próbuję załadować lokalny serwer sieciowy z mnóstwem żądań. Niestety nie wyszło tak dobrze. – foxy

Odpowiedz

8

From the MSDN:

Gdy popyt jest niski, rzeczywista liczba wątku puli wątków może spaść poniżej minimalnych wartości.

Przeczytaj to zbyt: Patterns for Parallel Programming: Understanding and Applying Parallel Patterns with the .NET Framework 4

+0

Ustawiłem w kolejce ~ 50k zadań i ustawiłem wątek min + Max wątku programu ThreadPool na 20k, ale użyto tylko ~ 25 wątków. Czy to jest oczekiwane? – foxy

+0

Czy zostały wykonane jakieś zadania lub stan oczekiwania? Do menedżera należy tworzenie wątków. Na niektórych komputerach lepiej nie mieć zbyt wielu wątków, ponieważ wątki będą cierpieć głód wątku. –

1

Po pierwsze sprawdź this link, szczególnie w tym uwaga:

Jeżeli wspólne Runtime język jest obsługiwany, na przykład przez Internet Information Services (IIS) lub SQL Server , host może ograniczyć lub zapobiec zmianom wielkości puli wątków.

Następnie należy sprawdzić wartość zwracaną metody ThreadPool.SetMaxThreads(threads, threads). Może wróci false?

+0

Dziękuję, ale używam .NET 4 na Windows 7. – foxy

65

Po pierwsze, twoja "wiedza" o wartościach domyślnych jest niepoprawna. Limit 25 wątków na procesor powrócił z platformy .NET 1.1. To była zwiększona w .NET 2, and now:

Począwszy od wersji .NET Framework 4, domyślny rozmiar puli wątków dla procesu zależy od kilku czynników, takich jak wielkość wirtualnej przestrzeni adresowej. Proces może wywołać metodę GetMaxThreads w celu określenia liczby wątków.

Jednak jest coś jeszcze w grze: basen wątek nie natychmiast tworzyć nowych tematów w każdej sytuacji. Aby poradzić sobie z seriami małych zadań, ogranicza to szybkość tworzenia nowych wątków. IIRC, utworzy jeden wątek co 0,5 sekundy, jeśli istnieją zaległe zadania, do maksymalnej liczby wątków. Nie mogę od razu zobaczyć, że ta liczba jest udokumentowana, więc może się zmienić. Podejrzewam, że właśnie to widzisz. Spróbuj umieścić w kolejce wiele przedmiotów, a następnie monitoruj liczbę wątków w czasie.

+1

To powinna być zaakceptowana odpowiedź, wyraźnie wyjaśnia, co to jest freedompeace. – Fayilt

+1

To była odpowiedź! Zauważyłem to dziwne pół sekundy, czasem jedną sekundę, kiedy nic nie robił. Czekam na zadania i inne zadania, które czekają na uruchomienie w wyniku, i wszystko jest wolne. Potrzebuję około 10 wątków do mojej pracy. Ustawienie ThreadPool.SetMinThreads na podobne 20 (domyślnie było 8) wątków roboczych naprawiło mój problem natychmiast! Ponieważ również potrzebuję tych wątków później, nie zmniejszę ponownie minimum. – ygoe

Powiązane problemy