Linux nie (jeszcze) postępuje zgodnie ze standardem POSIX.1, który mówi, że a renice
na proces wpływa na „wszystkie wątki o zasięgu systemowym w tym procesie”, ponieważ zgodnie z dokumentacją pthreads (7) „wątki nie mają wspólnej dobrej wartości”.
Czasami jednak wygodne może być renice
„wszystko” związane z danym procesem (jednym z przykładów byłyby procesy potomne Apache i wszystkie ich wątki). Więc,
- jak mogę
renice
wszystkie wątki należące do danego procesu? - jak mogę
renice
wszystkie procesy potomne należące do danego procesu?
Szukam dość łatwego rozwiązania.
Wiem, że grupy procesów mogą czasem być pomocne, jednak nie zawsze pasują do tego, co chcę zrobić: mogą obejmować szerszy lub inny zestaw procesów.
Korzystanie z cgroup
zarządzanego przez systemd
może również być pomocne, ale nawet jeśli chcę o tym usłyszeć, najczęściej szukam „standardowego” rozwiązania.
EDYCJA: również man (7) pthreads
mówi „wszystkie wątki w procesie są umieszczone w tej samej grupie wątków; wszyscy członkowie grupy wątków mają ten sam PID”. Czy w ogóle możliwe jest renice
coś, co nie ma własnego PID?
man (7) pthreads
mówi o bieżącej implementacji (NPTL): „wszystkie wątki w procesie są umieszczone w tej samej grupie wątków; wszyscy członkowie grupy wątków mają ten sam PID” i „Wątki nie mają wspólnej dobrej wartości”. Jak w takim razie zrestartować wątek, który nie ma własnego PID, kiedyrenice
używa do tego PID?24995 (process ID) old priority 0, new priority -10
. 24995 nie pojawia sięps
, więc nie jest to proces. Może wątki odnawiające rzeczywiście działają?Dobra wartość czy udziały w CPU?
Należy pamiętać, że w dzisiejszych czasach ładne wartości mogą nie być tak istotne w całym systemie, ze względu na automatyczne grupowanie zadań, szczególnie podczas korzystania z systemd . Więcej informacji można znaleźć w tej odpowiedzi .
Różnica między wątkami i procesami
Ważne pytanie w systemie Linux, ponieważ dokumentacja utrwala wątpliwości (na przykład wątki nieposiadające własnego PID).
Uwaga: ta odpowiedź dokładnie wyjaśnia wątki systemu Linux.
W skrócie: jądro obsługuje tylko „elementy uruchamialne”, to znaczy coś, co można uruchomić i zaplanować . Jeśli chodzi o jądro, te byty nazywane są procesami. Wątek jest rodzajem procesu, który dzieli (przynajmniej) przestrzeń pamięci i procedury obsługi sygnałów z innym.
Każdy taki proces ma unikalny w całym systemie identyfikator: PID (identyfikator procesu). W przypadku tak zwanych wątków jest czasami nazywany TID (identyfikator wątku), ale z punktu widzenia sysadmin (i jądra!) TID i PID są tym samym (dzielą tę samą przestrzeń nazw).
W rezultacie możesz
renice
każdy „wątek” osobno, ponieważ ma swój własny PID 1 .Znajdowanie wszystkich PID-ów
renice
rekurencyjnieMusimy uzyskać PID wszystkich procesów („normalnych” lub „wątków”), które są potomkami (dzieci lub w grupie wątków) procesu, który ma być poprawiony. Powinno to być rekurencyjne (biorąc pod uwagę dzieci dzieci).
Odpowiedź Antona Leontiewa daje podpowiedź: wszystkie nazwy folderów
/proc/$PID/task/
to PID wątków zawierającychildren
plik z listą potencjalnych procesów potomnych.Jednak brakuje mu rekurencyjności, więc oto szybki i brudny skrypt powłoki, aby je znaleźć:
Jeśli proces PID 1234 jest tym, który chcesz rekurencyjnie miły, teraz możesz:
1 Zauważ, że dla zgodności z POSIX, wywołanie
getpid(2)
w wątku nie da ci ogólnosystemowego unikalnego ID (PID) tego uruchamialnego bytu, ale raczej PID głównego procesu w „grupie wątków”. Zamiast tego musisz zadzwonićgettid(2)
. Zobacz tę odpowiedź, aby uzyskać więcej informacji.źródło
Nie powinniśmy mylić PID procesu i identyfikatora wątku zapisanego TID lub komendy ps LPW.
s
Polecenie ma opcje do wyświetlania wątków i podtop
lubhtop
przełączać pomiędzy wątkami i procesu przezH
liście. Jak wcześniej powiedział @Totor, z NPTL, która jest bieżącą implementacją z jądrem> 2.6, wszystkie wątki mają ten sam pid, ale mają wyraźny tid. Wyświetlane są wszystkie wątki procesu według:Te tid są nazwami katalogów pod
/proc/<pid>/task
i nawet jeśli renice (1) mówi, że domyślnym argumentem jest pid po zastosowaniu do pid, to renice tylko główny wątek (jest to błąd w implementacji linuxa napisany w setpriority (2) ) ), można go również zastosować do przyprawy i ponownie nićmi nitkę. Właśnie dlatego odpowiedź @Anton jest ważna.Ale najczęściej istnieje łatwiejszy sposób na osiągnięcie pożądanego rezultatu, wszystkie te wątki mają ten sam pgid, który jest pid lidera grupy; możesz ponownie zareagować pgid, wydając:
Jeśli nie chcesz ponownie uruchamiać innego procesu zależnego od tego samego lidera grupy, musisz użyć przepisu @ Antona:
lub:
Możesz także chcieć dowiedzieć się, jakie są inne procesy w tej samej grupie niż proces, który chcesz ponownie uruchomić, to znaczy procesy, które współużytkują mają ten sam pgid. Możesz użyć ps (1) ,
ps
nie pozwala wybrać procesów według lidera grupy, ale możesz to zrobić grep aps
. Procesy z pgid1908
zostaną podane przez polecenie:lub jeśli wolisz awk niż sed:
źródło
$ renice -n 18 -g 8524 renice: failed to get priority for 8524 (process group ID): No such process $ ps --no-header axo pid,pgid|awk '{if ($2=="8524") print $1;}'
Podczas gdy metoda Totora działa / nadal działa:$ /bin/ls /proc/8524/task | /usr/bin/xargs renice 19 2739 (process ID) old priority 19, new priority 19 2740 (process ID) old priority 19, new priority 19 ...
Potwierdziłem za pomocą / proc, htop, pstree itp., Że mam poprawne top- poziom PID. Może coś się zmieniło w ciągu ostatniego roku./proc/8524/task
alerenice -g
zawiodły. Kiedy patrzysz na drzewo procesów, jedna gałąź znajduje się w tej samej grupie procesów, a nie tylko jeden proces wątkowy. Spróbuj ponownie sprawdzić wynikps -Ljf
.Chciałbym polecić użycie argumentu -g (grupy procesów) zamiast -p (identyfikatory procesów) podczas używania renice. Robi to samo bez bash-foo.
to znaczy
źródło
Oto mój skrypt:
źródło