Jaka jest maksymalna liczba wątków, które można utworzyć w procesie pod Linuksem?
Jak (jeśli to możliwe) można zmodyfikować tę wartość?
Jaka jest maksymalna liczba wątków, które można utworzyć w procesie pod Linuksem?
Jak (jeśli to możliwe) można zmodyfikować tę wartość?
Odpowiedzi:
Linux nie ma osobnego limitu wątków na limit procesów, a jedynie limit całkowitej liczby procesów w systemie (wątki to w zasadzie tylko procesy ze wspólną przestrzenią adresową w systemie Linux), które można wyświetlić w następujący sposób:
cat /proc/sys/kernel/threads-max
Domyślnie jest to liczba stron pamięci / 4. Możesz to zwiększyć w następujący sposób:
echo 100000 > /proc/sys/kernel/threads-max
Istnieje również ograniczenie liczby procesów (a tym samym wątków), które może utworzyć pojedynczy użytkownik, zobacz ulimit/getrlimit
szczegóły dotyczące tych ograniczeń.
E667: Fsync failed
gdy próbuję oszczędzać na vi.
Błędem jest twierdzenie, że LINUX nie ma osobnych wątków na limit procesu.
Linux implementuje maksymalną liczbę wątków na proces pośrednio !!
number of threads = total virtual memory / (stack size*1024*1024)
Tak więc liczbę wątków na proces można zwiększyć, zwiększając całkowitą pamięć wirtualną lub zmniejszając rozmiar stosu. Jednak zbyt duże zmniejszenie rozmiaru stosu może prowadzić do niepowodzenia kodu z powodu przepełnienia stosu, podczas gdy maksymalna pamięć wirtualna jest równa pamięci wymiany.
Sprawdź swoją maszynę:
Całkowita pamięć wirtualna: ulimit -v
(domyślnie jest nieograniczona, dlatego musisz zwiększyć pamięć wymiany, aby to zwiększyć)
Całkowity rozmiar stosu: ulimit -s
(domyślnie jest to 8 Mb)
Polecenie, aby zwiększyć te wartości:
ulimit -s newvalue
ulimit -v newvalue
* Zastąp nową wartość wartością, którą chcesz ustawić jako limit.
Bibliografia:
http://dustycodes.wordpress.com/2012/02/09/increase-number-of-threads-per-process/
ulimit -s
. Jest bardzo możliwe (nie sensowne, ale możliwe), aby utworzyć tyle wątków, ile jest możliwych identyfikatorów wątków. W 64-bitowym systemie Linux nawet łatwiej jest „stworzyć” więcej wątków niż ich identyfikatory (oczywiście nie jest to możliwe, ale jeśli chodzi o stos, to jest). 3. Rezerwa stosu, zatwierdzanie i VM to różne rzeczy, szczególnie z OC.
W praktyce limit jest zwykle określany przez przestrzeń stosu. Jeśli każdy wątek otrzyma stos 1 MB (nie pamiętam, czy jest to domyślny w systemie Linux), w systemie 32-bitowym zabraknie przestrzeni adresowej po 3000 wątków (przy założeniu, że ostatni GB jest zarezerwowany dla jądra) .
Jednak najprawdopodobniej doświadczysz strasznej wydajności, jeśli użyjesz więcej niż kilkudziesięciu wątków. Wcześniej czy później pojawi się zbyt wiele narzutu przełączania kontekstu, zbyt dużego narzutu w harmonogramie i tak dalej. (Utworzenie dużej liczby wątków nie tylko zużywa dużo pamięci. Ale wiele wątków przy faktycznej pracy spowolni cię, gdy będą walczyć o dostępny czas procesora)
Co robisz, gdy ten limit jest nawet istotny?
prawidłowe 100k wątków na Linuksie:
ulimit -s 256
ulimit -i 120000
echo 120000 > /proc/sys/kernel/threads-max
echo 600000 > /proc/sys/vm/max_map_count
echo 200000 > /proc/sys/kernel/pid_max
./100k-pthread-create-app
Aktualizacja 2018 od @ Thomas, na systemach systemowych:
/etc/systemd/logind.conf: UserTasksMax=100000
@dragosrsupercool
Linux nie używa pamięci wirtualnej do obliczenia maksymalnej liczby wątków, ale fizyczny RAM zainstalowany w systemie
max_threads = totalram_pages / (8 * 8192 / 4096);
http://kavassalis.com/2011/03/linux-and-the-maximum-number-of-processes-threads/
jądro / fork.c
/* The default maximum number of threads is set to a safe
* value: the thread structures can take up at most half
* of memory.
*/
max_threads = mempages / (8 * THREAD_SIZE / PAGE_SIZE);
Tak więc maksymalna liczba wątków różni się w zależności od systemu, ponieważ zainstalowany RAM może mieć różne rozmiary, wiem, że Linux nie musi zwiększać pamięci wirtualnej, ponieważ w 32 bitach mamy 3 GB na miejsce użytkownika i 1 GB na jądro, w wersji 64-bitowej mamy 128 TB pamięci wirtualnej, co dzieje się w systemie Solaris, jeśli chcesz zwiększyć pamięć wirtualną, musisz dodać przestrzeń wymiany.
Aby go odzyskać:
cat /proc/sys/kernel/threads-max
Aby ustawić:
echo 123456789 > /proc/sys/kernel/threads-max
123456789 = Liczba wątków
>
częścią append ( ) traci sudo
: tryecho 12345678 | sudo tee -a /proc/sys/kernel/threads-max
Limit liczby wątków:
$ cat /proc/sys/kernel/threads-max
Jak to jest obliczane:
max_threads = mempages / (8 * THREAD_SIZE / PAGE_SIZE);
oraz: rozmiar strony x86_64 (PAGE_SIZE) to 4K; Podobnie jak wszystkie inne architektury, x86_64 ma stos jądra dla każdego aktywnego wątku. Te stosy wątków są duże THREAD_SIZE (2 * PAGE_SIZE);
dla wiadomości:
cat /proc/zoneinfo | grep spanned | awk '{totalpages=totalpages+$2} END {print totalpages}';
tak więc liczba ta nie jest związana z ograniczeniem rozmiaru stosu pamięci wątków ( ulimit -s
).
PS: ograniczenie stosu pamięci wątków w mojej maszynie wirtualnej rhel wynosi 10 MB, a dla pamięci 1,5G ta maszyna wirtualna może sobie pozwolić tylko na 150 wątków?
Dla każdego, kto na to teraz patrzy, w systemach systemowych (w moim przypadku, szczególnie Ubuntu 16.04) istnieje inny limit narzucony przez parametr cgroup pids.max.
Domyślnie jest ustawiona na 12 288 i można ją przesłonić w /etc/systemd/logind.conf
Nadal obowiązują inne porady, w tym pids_max, thread-max, max_maps_count, ulimits itp.
sprawdź rozmiar stosu na wątek za pomocą ulimit, w moim przypadku Redhat Linux 2.6:
ulimit -a
...
stack size (kbytes, -s) 10240
Każdy twój wątek otrzyma taką ilość pamięci (10 MB) przypisaną do stosu. Przy 32-bitowym programie i maksymalnej przestrzeni adresowej 4 GB, to maksymalnie 4096 MB / 10 MB = 409 wątków !!! Minusowy kod programu minus minus sterty prawdopodobnie doprowadzi do zaobserwowanego maks. z 300 wątków.
Powinieneś być w stanie to podnieść, kompilując i uruchamiając na 64bit lub ustawiając ulimit -s 8192 lub nawet ulimit -s 4096. Ale jeśli jest to wskazane, jest kolejna dyskusja ...
To chyba nie powinno mieć znaczenia. Będziesz uzyskiwać znacznie lepszą wydajność, projektując algorytm tak, aby używał stałej liczby wątków (np. 4 lub 8, jeśli masz 4 lub 8 procesorów). Możesz to zrobić za pomocą kolejek roboczych, asynchronicznego We / Wy lub czegoś takiego jak libevent.
Zależy od twojego systemu, po prostu napisz przykładowy program [tworząc procesy w pętli] i sprawdź używając ps axo pid, ppid, rss, vsz, nlwp, cmd. Gdy nie będzie już można tworzyć wątków, sprawdź liczbę nlwp [nlwp to liczba wątków] voila, masz głupią odpowiedź zamiast przechodzić przez książki
Aby ustawić na stałe,
vim /etc/sysctl.conf
i dodaj
kernel.threads-max = "value"
Widzimy maksymalną liczbę wątków zdefiniowanych w poniższym pliku w systemie Linux
cat / proc / sys / kernel / Thread-max
(LUB)
sysctl -a | grep wątki-max
Możesz zobaczyć bieżącą wartość za pomocą następującego polecenia cat / proc / sys / kernel / Thread-max
Możesz także ustawić wartość jak
echo 100500> / proc / sys / kernel / Thread-max
Ustawiona wartość zostanie sprawdzona na podstawie dostępnych stron pamięci RAM. Jeśli struktury wątków zajmują więcej niż 1/8) dostępnych stron pamięci RAM, maksymalna liczba wątków zostanie odpowiednio zmniejszona.
Tak, aby zwiększyć liczbę wątków, musisz zwiększyć pamięć wirtualną lub zmniejszyć rozmiar stosu. W Raspberry Pi nie znalazłem sposobu na zwiększenie pamięci wirtualnej, jeśli zmniejszysz rozmiar stosu z domyślnych 8 MB do 1 MB Prawdopodobnie uzyskasz więcej niż 1000 wątków na proces, ale zmniejszysz rozmiar stosu za pomocą polecenia „ulimit -s” zrób to dla wszystkich wątków. Tak więc moim rozwiązaniem było użycie instancji „pthread_t” „klasa wątku”, ponieważ pthread_t pozwala mi ustawić rozmiar stosu dla każdego wątku. Wreszcie jestem w stanie zarchiwizować ponad 1000 wątków na proces w Raspberry Pi, każdy z 1 MB stosu.