Ile wątków to za dużo? [zamknięte]

Piszę serwer i rozgałęziam każdą akcję do wątku, gdy żądanie jest przychodzące. Robię to, ponieważ prawie każde żądanie tworzy zapytanie do bazy danych. Używam biblioteki threadpool, aby ograniczyć budowę / niszczenie wątków.

Moje pytanie brzmi jednak-jaki jest dobry punkt odcięcia dla takich wątków We / Wy? Wiem, że to tylko przybliżone szacunki, ale czy mówimy o setkach? tysiące?


EDIT:

Dziękuję wszystkim za odpowiedzi, wydaje się tak jak będę musiał to przetestować, aby dowiedzieć się, czy mój pułap liczby wątków. Pytanie brzmi: skąd mam wiedzieć, że trafiłem w sufit? Co dokładnie powinienem zmierzyć?

Author: fncomp, 2009-01-27

12 answers

Niektórzy powiedzieliby, że Dwa wątki to za dużo - nie do końca jestem w tym obozie : -)

Oto moja rada: mierz, nie zgaduj. jedną z sugestii jest skonfigurowanie go i ustawienie go na 100, a następnie zwolnienie oprogramowania do dziczy i monitorowanie tego, co się dzieje.

Jeśli Twoje użycie wątku osiąga wartość 3, to 100 to za dużo. Jeśli pozostanie na 100 przez większość dnia, podskocz go do 200 i zobacz, co się stanie.

You could actually have your sam kod monitoruje użycie i dostosowuje konfigurację przy następnym uruchomieniu, ale to chyba przesada.


dla wyjaśnienia i opracowania:

Nie jestem zwolennikiem zwijania własnego podsystemu łączenia wątków, za wszelką cenę używaj tego, który masz. Ale ponieważ pytałeś o dobry punkt odcięcia dla wątków, zakładam, że Twoja implementacja puli wątków ma możliwość ograniczenia maksymalnej liczby utworzonych wątków (co jest dobrą rzeczą).

I ' ve napisany wątek i Kod połączenia bazy danych i mają następujące funkcje (które moim zdaniem są niezbędne dla wydajności):

  • minimalna liczba aktywnych wątków.
  • Maksymalna liczba wątków.
  • wyłączanie wątków, które nie były używane przez jakiś czas.

Pierwszy ustawia linię bazową dla minimalnej wydajności w odniesieniu do klienta puli wątków (ta liczba wątków jest zawsze dostępna do użycia). Drugi określa ograniczenie dotyczące wykorzystanie zasobów przez aktywne wątki. Trzeci zwraca Cię do punktu odniesienia w cichym czasie, aby zminimalizować zużycie zasobów.

Musisz zrównoważyć wykorzystanie zasobów z posiadania nieużywanych wątków (A) z wykorzystaniem zasobów z braku wystarczającej liczby wątków do wykonania pracy (B).

(a) to ogólnie użycie pamięci (stosy i tak dalej), ponieważ wątek nie wykonujący żadnej pracy nie będzie używał dużej części procesora. (B) będzie z reguły opóźnieniem w przetwarzaniu wniosków po ich przybyciu, ponieważ trzeba czekać na wątek, aby stać się dostępnym.

Dlatego mierzysz. Jak twierdzisz, zdecydowana większość twoich wątków będzie czekać na odpowiedź z bazy danych, więc nie będą działać. Istnieją dwa czynniki, które wpływają na liczbę wątków, na które powinieneś zezwolić.

Pierwsza to liczba dostępnych połączeń DB. Może to być twardy limit, chyba że możesz go zwiększyć w DBMS - zakładam, że Twój DBMS może przyjmować nieograniczoną liczbę połączeń w tym przypadku (chociaż powinieneś najlepiej mierzyć to również).

Następnie liczba wątków, które powinieneś mieć, zależy od Twojego historycznego użycia. Minimum, które powinieneś mieć uruchomiony, to minimalna liczba, którą kiedykolwiek miałeś uruchomiony + a%, z absolutnym minimum (na przykład i ustaw go jako konfigurowalny tak jak A) 5.

Maksymalna liczba wątków powinna być twoim historycznym maksimum + B%.

Należy również monitorować zmiany zachowania. Jeśli z jakiegoś powodu twoje użycie osiągnie 100% dostępne przez dłuższy czas (tak, że wpłynie to na wydajność klientów), należy podskoczyć maksymalne dozwolone, aż po raz kolejny B% wyższe.


w odpowiedzi na "co dokładnie powinienem zmierzyć?"pytanie:

To, co powinieneś zmierzyć, to maksymalna ilość wątków w równoczesnym użyciu (np. oczekiwanie na powrót z wywołania DB) pod obciążeniem. Następnie dodaj współczynnik bezpieczeństwa 10% dla Przykład (podkreślono, ponieważ inne plakaty wydają się brać moje przykłady jako stałe zalecenia).

Ponadto należy to zrobić w środowisku produkcyjnym do tuningu. To jest w porządku, aby uzyskać oszacowanie wcześniej, ale nigdy nie wiadomo, co produkcja rzuci drogę (dlatego wszystkie te rzeczy powinny być konfigurowalne w czasie wykonywania). Ma to na celu złapanie sytuacji, takiej jak nieoczekiwane podwojenie połączeń klientów przychodzących.

 172
Author: paxdiablo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-08 21:40:48

To pytanie zostało omówione dość dokładnie i nie miałem okazji przeczytać wszystkich odpowiedzi. Ale oto kilka rzeczy, które należy wziąć pod uwagę, patrząc na górną granicę liczby jednoczesnych wątków, które mogą spokojnie współistnieć w danym systemie.

  1. rozmiar stosu wątków : w Linuksie domyślny rozmiar stosu wątków to 8MB (możesz użyć ulimit-a, aby to sprawdzić).
  2. Maksymalna pamięć wirtualna, którą obsługuje dany wariant systemu operacyjnego. Jądro Linux 2.4 obsługuje pamięć przestrzeń adresowa 2 GB. z kernelem 2.6, i trochę większy (3GB)
  3. [1] pokazuje obliczenia dla maksymalnej liczby wątków na podaną maksymalną obsługiwaną maszynę wirtualną. Dla 2.4 okazuje się, że jest to około 255 wątków. dla 2.6 liczba jest nieco większa.
  4. Jaki masz planer jądra . Porównując scheduler jądra Linuksa 2.4 z 2.6, późniejsze daje planowanie O(1) bez zależności od liczby zadań istniejących w systemie, podczas gdy pierwsze jest bardziej O (n). Tak i SMP Możliwości harmonogramu jądra odgrywają również dobrą rolę w maksymalnej liczbie zrównoważonych wątków w systemie.

Teraz możesz dostosować rozmiar stosu, aby włączyć więcej wątków, ale musisz wziąć pod uwagę ogólne koszty zarządzania wątkami(tworzenie/niszczenie i planowanie). Możesz wymusić powinowactwo procesora do danego procesu, a także do danego wątku, aby powiązać je z konkretnymi procesorami, aby uniknąć kosztów ogólnych migracji wątków między procesorami i uniknąć problemów z zimną gotówką.

Zauważ, że można utworzyć tysiące wątków na swoje życzenie, ale kiedy Linux skończy się maszyną wirtualną, to po prostu losowo rozpoczyna zabijanie procesów (a więc wątków). Ma to na celu zachowanie profilu użyteczności przed maksymalizacją. (Funkcja utility mówi o użyteczności całego systemu dla danej ilości zasobów. Przy stałych zasobach w tym przypadku cykli procesora i pamięci, krzywa użyteczności spłaszcza się z coraz większą liczbą zadań).

Jestem pewien, że Windows kernel scheduler również robi coś w tym rodzaju, aby poradzić sobie z nadmiernym wykorzystaniem zasobów

[1] http://adywicaksono.wordpress.com/2007/07/10/i-can-not-create-more-than-255-threads-on-linux-what-is-the-solutions/

 27
Author: Jay D,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-18 20:06:04

Jeśli twoje wątki wykonują jakąkolwiek pracę wymagającą dużych zasobów (procesor/dysk), rzadko zobaczysz korzyści wykraczające poza jeden lub dwa, a zbyt wiele z nich bardzo szybko zabije wydajność.

Najlepszym przypadkiem jest to,że Twoje późniejsze wątki będą przeciągać się, gdy pierwsze zostaną ukończone, lub niektóre będą miały bloki o niskim napowietrzeniu na zasoby o niskiej zawartości. Najgorsze jest to, że zaczynasz uderzać w pamięć podręczną / dysk/sieć, a ogólna przepustowość spada na podłogę.

Dobrym rozwiązaniem jest aby umieścić żądania w Puli, które są następnie wysyłane do wątków roboczych z puli wątków (i tak, unikanie ciągłego tworzenia/niszczenia wątków jest świetnym pierwszym krokiem).

Liczba aktywnych wątków w tej puli może być następnie poprawiona i skalowana w oparciu o wyniki profilowania, sprzętu, na którym pracujesz i innych rzeczy, które mogą wystąpić na maszynie.

 15
Author: Andrew Grant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-27 01:03:53

Należy pamiętać, że python (przynajmniej wersja oparta na C) używa tzw. globalnej blokady interpretera , która może mieć ogromny wpływ na wydajność na maszynach wielordzeniowych.

Jeśli naprawdę potrzebujesz najwięcej z wielowątkowego Pythona, możesz rozważyć użycie Jythona lub czegoś takiego.

 9
Author: Chad Okere,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-18 06:01:59

Jak słusznie powiedział Pax, mierz, nie zgaduj . To, co zrobiłem dla DNSwitness i wyniki były zaskakujące: idealna liczba wątków była znacznie wyższa niż myślałem, coś w rodzaju 15,000 wątków, aby uzyskać najszybsze wyniki.

Oczywiście, to zależy od wielu rzeczy, dlatego musisz zmierzyć siebie.

Complete measures (in French only) in Combien de fils d ' exécution ?.

 7
Author: bortzmeyer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-27 12:27:42

Napisałem kilka mocno wielowątkowych aplikacji. Ogólnie pozwalam na określenie liczby potencjalnych wątków w pliku konfiguracyjnym. Kiedy dostroiłem się do konkretnych klientów, ustawiłem liczbę na tyle wysoką, że moje wykorzystanie wszystkich rdzeni procesora było dość wysokie, ale nie tak wysokie, że napotkałem problemy z pamięcią (były to wtedy 32-bitowe systemy operacyjne).

Ująć inaczej, gdy osiągniesz jakieś wąskie gardło, czy to CPU, przepustowość bazy danych, przepustowość dysku, itp., dodanie większej liczby wątków nie zwiększy ogólnej wydajności. Ale dopóki nie trafisz w ten punkt, dodaj więcej wątków!

Zauważ, że zakłada to, że dany system(y) jest dedykowany dla Twojej aplikacji i nie musisz ładnie grać (unikać głodowania) innych aplikacji.

 4
Author: Matthew Lund,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-08 18:12:39

Odpowiedź "big iron" to zazwyczaj jeden wątek na ograniczony zasób-procesor (CPU bound), arm (i/o bound) itp., ale działa tylko wtedy, gdy możesz skierować pracę do właściwego wątku, aby uzyskać dostęp do zasobu.

Jeśli nie jest to możliwe, weź pod uwagę, że masz zasoby wymienne (CPU) i zasoby nie wymienne (arms). W przypadku procesorów przypisanie każdego wątku do konkretnego procesora nie jest kluczowe (chociaż pomaga to w zarządzaniu pamięcią podręczną), ale dla arms, jeśli nie możesz przypisać wątku do ramienia, dostajesz się do teorii kolejkowania i jaka jest optymalna liczba, aby ramiona były zajęte. Generalnie myślę, że jeśli nie możesz kierować żądań na podstawie używanego ramienia, to posiadanie 2-3 wątków na ramię będzie miało rację.

Komplikacja pojawia się, gdy jednostka pracy przekazywana do wątku nie wykonuje racjonalnie atomowej jednostki pracy. Np. wątek może mieć w jednym punkcie dostęp do dysku, w innym punkcie czekać w sieci. Zwiększa to liczbę "pęknięć", gdzie dodatkowe wątki mogą dostać się i wykonać użyteczną pracę, ale Zwiększa to również możliwość dodatkowego wątku zanieczyszczania pamięci podręcznych innych itp.

Oczywiście musisz zważyć to wszystko na "wagę" nici. Niestety, większość systemów ma bardzo ciężkie wątki (a to, co nazywają "lekkimi wątkami", często nie są wątkami w ogóle), więc lepiej błądzić po niskiej stronie.

W praktyce widziałem, że bardzo subtelne różnice mogą zrób ogromną różnicę w tym, ile wątków jest optymalnych. W szczególności problemy z pamięcią podręczną i konflikty blokad mogą znacznie ograniczyć ilość praktycznej współbieżności.

 3
Author: Hot Licks,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-15 15:13:15

Należy wziąć pod uwagę, ile rdzeni istnieje na maszynie, która będzie wykonywała kod. Oznacza to twardy limit liczby wątków, które mogą być kontynuowane w danym momencie. Jeśli jednak, tak jak w Twoim przypadku, wątki będą często czekać na bazę danych do wykonania zapytania, prawdopodobnie będziesz chciał dostroić swoje wątki na podstawie liczby jednoczesnych zapytań, które baza danych może przetworzyć.

 2
Author: newdayrising,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-27 00:51:42

Myślę, że to trochę unik dla Twojego pytania, ale dlaczego nie rozwidlić ich na procesy? Moje zrozumienie sieci (z mglistych dni yore, naprawdę nie kod sieci w ogóle) było to, że każde przychodzące połączenie może być traktowane jako oddzielny proces, bo wtedy, jeśli ktoś robi coś paskudnego w procesie, to nie nuke cały program.

 2
Author: mmr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-27 00:55:16

Ryeguy, obecnie rozwijam podobną aplikację i mój numer wątków jest ustawiony na 15. Niestety, jeśli zwiększę go do 20, to się zawiesza. Tak więc, tak, myślę, że najlepszym sposobem radzenia sobie z tym jest zmierzenie, czy obecna konfiguracja pozwala na więcej lub mniej niż liczba X wątków.

 1
Author: hyperboreean,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-27 12:36:16

W większości przypadków należy zezwolić puli wątków, aby to obsłużyć. Jeśli opublikujesz kod lub podasz więcej szczegółów, łatwiej będzie sprawdzić, czy istnieje jakiś powód, dla którego domyślne zachowanie puli wątków nie byłoby najlepsze.

Więcej informacji o tym, jak to powinno działać, znajdziesz tutaj: http://en.wikipedia.org/wiki/Thread_pool_pattern

 -6
Author: GEOCHET,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-27 01:46:44

Tyle wątków ile rdzeni procesora, to jest to, co słyszałem bardzo często.

 -10
Author: masfenix,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-27 00:48:45