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
rekurencyjnie
Musimy 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ący children
plik z listą potencjalnych procesów potomnych.
Jednak brakuje mu rekurencyjności, więc oto szybki i brudny skrypt powłoki, aby je znaleźć:
#!/bin/sh
[ "$#" -eq 1 -a -d "/proc/$1/task" ] || exit 1
PID_LIST=
findpids() {
for pid in /proc/$1/task/* ; do
pid="$(basename "$pid")"
PID_LIST="$PID_LIST$pid "
for cpid in $(cat /proc/$1/task/$pid/children) ; do
findpids $cpid
done
done
}
findpids $1
echo $PID_LIST
Jeśli proces PID 1234 jest tym, który chcesz rekurencyjnie miły, teraz możesz:
renice -n 15 -p $(/path/to/findchildren.sh 1234)
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.
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?