2011-03-09 16 views
7

Bawiłem się z gwintowaniem, próbując przesuwać granice do ekstremum - dla własnej rozrywki. Wiem, że wątek domyślnie ma 25 wątków i można go przesłać do 1000 (zgodnie z MSDN). Co jednak jest praktycznym ograniczeniem wątków na rdzeń procesora? W pewnym momencie przełączanie kontekstów spowoduje więcej wąskiego gardła niż oszczędzanie przez wątki. Czy ktoś ma jakieś dobre praktyki obejmujące to? Czy mówimy 100, 200, 500? Czy to zależy od tego, co robią wątki? Co decyduje o architekturze, która poza trybami dyktowanymi przez wiele wątków działa optymalnie na rdzeń procesora?Jakie są praktyczne ograniczenia wątków na procesor?

+7

http://stackoverflow.com/questions/1718465/optimal-number-of-threads-per-core - to może odpowiedzieć na kilka pytań podczas oczekiwania na odpowiedzi tutaj :) – dotalchemy

+0

@dotalchemy - dzięki, anegdotyczne informacje są zwykle całkiem pomocne; Było tam kilka dobrych wglądów. Ciekawe, czy ktoś poruszy informacje dotyczące najlepszych praktyk. – BobTheBuilder

+0

42. Oczywiście ... –

Odpowiedz

8

Wszystko zależy od tego, co robią wątki, oczywiście. Jeśli są one związane z CPU (powiedzmy, że siedzą ciasno w nieskończonej pętli), to jeden wątek na rdzeń wystarczy do nasycenia procesora; więcej niż to (i będziesz mieć więcej, z procesów w tle itd.) i zaczniesz się spierać.

Z drugiej strony, jeśli wątki nie są odpowiednie do uruchomienia (np. Zablokowane na jakimś obiekcie synchronizacji), to limit, ile byś miał, byłby dyktowany przez czynniki inne niż CPU (pamięć dla stosów, Limity wewnętrzne systemu operacyjnego itp.).

7

Jeśli twoja aplikacja nie jest związana z procesorem (jak większość), przełączniki kontekstu nie są wielkim problemem, ponieważ za każdym razem, gdy aplikacja musi czekać, konieczna jest zmiana kontekstu. Problem posiadania zbyt wielu wątków dotyczy struktur danych systemu operacyjnego i niektórych anomalii synchronizacji, takich jak głód, gdzie wątek nigdy (lub bardzo rzadko) ma szansę na wykonanie z powodu losowości algorytmów synchronizacji.

Jeśli twoja aplikacja jest związana z procesorem (pozostaje 99% czasu pracy z pamięcią, bardzo rzadko zdarza się I/O lub czekać na coś innego, np. Dane wejściowe użytkownika lub inny wątek), wówczas optymalny byłby 1 wątek na rdzeń logiczny , ponieważ w tym przypadku nie nastąpi przełączanie kontekstu.

Pamiętaj, że system operacyjny przerwie wątki za każdym razem, nawet jeśli istnieje tylko jeden wątek dla wielu procesorów. System operacyjny przerywa wątki nie tylko w celu przełączania zadań, ale także w celu zarządzania wątkami (np. Aktualizowanie liczników do wyświetlania w Menedżerze zadań lub umożliwienie superużytkownikowi jego zabicia).

+0

Powiedzmy, że robisz zwykłe rzeczy biznesowe, takie jak odbieranie danych gniazd i przesyłanie z dużą prędkością do bazy danych o pewnym opisie - dla argumentu SQL Server. Teoretycznie .NET nie będzie obsługiwać operacji we/wy w prawdziwym tego słowa znaczeniu - może to być wyrzucenie SqlBulkCopy do SQL Server. – BobTheBuilder

+0

Po uruchomieniu systemu operacyjnego jest już mnóstwo wątków. Tak więc jeden wątek na rdzeń jest optymalny, tak, ale tak naprawdę nigdy nie dzieje się w rzeczywistości. Nie widzę, co to jest wiedzieć, jaka byłaby optymalna liczba wątków na rdzeń .... Twoja aplikacja nie jest jedyna uruchomiona. –

+2

@Joel Gauvreau Nazwij to ciekawością. Czy nie dlatego właśnie znaleźliśmy się w tej pracy. Pragnienie wiedzy i zrozumienia ... więc moja odpowiedź na pytanie "co jest najważniejsze?" jest "po prostu wiedzieć". – BobTheBuilder

Powiązane problemy