zoptymalizuj mój serwer Linux do obsługi 10 000 wątków na proces
Jak wyjaśnili inni, jest to ogólnie źle. Wątek jest kosztowne zasobów , zwłaszcza dlatego, że ma swój własny stos wywołań (zazwyczaj megabajta), a ponieważ jest to zadanie szeregowaniu zadań przez jądro. Wątki są nawet bardziej kosztowne niż otwarte deskryptory plików .
Czytaj Systemy operacyjne: trzy łatwe utwory (podręcznik do pobrania za darmo).
Zasadniczo nie chcesz mieć wielu wątków, a na pewno nie wielu wątków możliwych do uruchomienia. Liczba możliwych do uruchomienia wątków powinna zasadniczo wynosić co najwyżej liczbę rdzeni (lub ich niewielką wielokrotność), a więc najwyżej kilkanaście. Liczba wątków w procesie może być nieco większa. Więc jeśli nie masz bardzo ekspansywnego serwera (z wieloma gniazdami i rdzeniami procesorów), nie chcesz mieć więcej niż tuzin uruchomionych wątków i stu wątków (większość z nich jest bezczynna) w twoim procesie (na pulpicie) .
W Linuksie wątki i procesy są bardzo podobne (ponieważ oba mogą być tworzone przez klon (2) ) i oba są zadaniami zaplanowanymi przez jądro. W rzeczywistości program planujący jądro planuje zadania, które mogą być wątkami wewnątrz jakiegoś procesu wielowątkowego lub pojedynczym głównym wątkiem procesu jednowątkowego (w takim przypadku nazwiesz „przetwarzać” ten pojedynczy wątek) lub wątkami jądra. Prawdopodobnie nie chcesz mieć więcej niż tysiąc zadań do zaplanowania w systemie stacjonarnym.
W systemie Linux proces to po prostu grupa wątków współużytkujących tę samą wirtualną przestrzeń adresową (i współużytkujących inne rzeczy, takie jak tabela deskryptorów plików itp.). Niektóre procesy mają tylko jeden wątek.
Wirtualnej przestrzeni adresowej jest określona przez Wikipedię jako
„zbiór zakresów adresów wirtualnych, które system operacyjny udostępnia procesowi”
(ale zobacz także tę odpowiedź wyjaśniającą, że terminologia nie jest uniwersalna, a niektóre dokumenty Microsoft używają innej i niezgodnej definicji).
W systemie Linux proc (5) jest przydatny do zrozumienia wirtualnej przestrzeni adresowej niektórych procesów. Spróbuj obu
cat /proc/self/maps
i cat /proc/$$/maps
w terminalu. Zobacz także to oraz pmap (1) i ps (1) i top (1) .
Wszystkie programy przestrzeni użytkownika działają w pewnym procesie i wykorzystują pamięć wirtualną, więc każdy proces ma swoją własną wirtualną przestrzeń adresową. Fizyczny RAM jest zasobem zarządzane przez Linuksa, a aplikacje nie mają bezpośredniego dostępu do pamięci RAM (z wyjątkiem mmap (2) -ing /dev/mem
, zobacz mem (4) ).
Dlatego proces nie używa bezpośrednio pamięci RAM. Wykorzystuje pamięć wirtualną i ma własną wirtualną przestrzeń adresową. Jądro używa stronicowania zarządzać fizycznej pamięci RAM stron i zapewniają wirtualną przestrzeń adresową i proces abstrakcji . W dowolnym momencie (nawet gdy proces jest bezczynny lub działa), jądro może wysunąć strony (np. Zamienić je na dysku). Jądro konfiguruje MMU (i obsługuje wyjątki sprzętowe do pominięcia strony w niektórych procedurach obsługi przerwań , albo poprzez pobranie strony z dysku lub przez propagację błędu segmentacji do procesu, patrz signal (7) )
Możesz mieć zielone wątki powyżej wątków systemowych (ale biblioteki zielonych wątków są trudne do wdrożenia i debugowania). Spójrz na goroutiny stosowane w Go, aby znaleźć fantazyjny przykład. Zobacz także setcontext (3) .
Czasami twój system może eksperymentować z thrashowaniem . Dzieje się tak, gdy całkowita pamięć wirtualna (wymagana przez wszystkie procesy) przekracza - o duży czynnik - dostępną fizyczną pamięć RAM. Następnie komputer przestaje odpowiadać. Przeczytaj o rozmiarze zestawu rezydenta , stronicowaniu na żądanie , zestawie roboczym , nadmiernym zaangażowaniu pamięci , ASLR .
Zobacz także -dla Linux- fork (2) , klon (2) , mmap (2) , madvise (2) , posix_fadvise (2) , mlock (2) , execve (2) , referencje (7) , pthreads (7) , futex (7) , możliwości (7) .