Linux (пока) не следует стандарту POSIX.1, который гласит, что renice
включение процесса влияет на «все потоки области системы в процессе», поскольку в соответствии с документом pthreads (7) «потоки не имеют общего полезного значения».
Однако иногда может оказаться удобным renice
«все», относящееся к данному процессу (например, дочерние процессы Apache и все их потоки). Так,
- Как я могу
renice
все потоки, принадлежащие к данному процессу? - как я могу
renice
все дочерние процессы, принадлежащие данному процессу?
Я ищу довольно простое решение.
Я знаю, что группы процессов иногда могут быть полезны, однако они не всегда соответствуют тому, что я хочу сделать: они могут включать в себя более широкий или другой набор процессов.
Также может быть полезно использовать cgroup
управляемый systemd
, но даже если мне интересно об этом узнать, я в основном ищу «стандартное» решение.
EDIT: также man (7) pthreads
говорит , что «все потоки в процессе помещены в одну группу потоков; все члены группы потоков имеют один и тот же PID». Итак, возможно ли вообще renice
что-то, у кого нет собственного PID?
man (7) pthreads
говорит о текущей реализации (NPTL): «все потоки в процессе помещены в одну группу потоков; все члены группы потоков имеют один и тот же PID» и «потоки не имеют общего полезного значения». Затем, как вы можете арендовать поток, который не имеет своего собственного PID, когда для этогоrenice
используется PID?24995 (process ID) old priority 0, new priority -10
. 24995 не появляется вps
, так что это не процесс. Может быть, смена потоков действительно работает?Хорошая стоимость или доля процессора?
Обратите внимание, что в настоящее время приятные значения могут быть не столь уместны для всей системы из-за автоматической группировки задач, особенно при использовании systemd . Пожалуйста, смотрите этот ответ для более подробной информации.
Разница между потоками и процессами
Важный вопрос по Linux, поскольку документация увековечивает сомнения (например, о потоках, не имеющих собственного PID).
Примечание: этот ответ объясняет потоки Linux точно.
Короче говоря: ядро обрабатывает только «выполняемые объекты», то есть то, что может быть запущено и запланировано . По сути, эти объекты называются процессами. Поток - это всего лишь процесс, который разделяет (по крайней мере) пространство памяти и обработчики сигналов с другим.
Каждый такой процесс имеет общесистемный уникальный идентификатор: PID (идентификатор процесса). Для так называемых потоков это иногда называется TID (Thread ID), но с точки зрения системного администратора (и ядра!) TID и PID - это одно и то же (они используют одно и то же пространство имен).
В результате вы можете
renice
каждый «поток» индивидуально, потому что они имеют свои собственные PID 1 .Поиск всех PID для
renice
рекурсивногоНам нужно получить PID всех процессов («нормальных» или «потоковых»), которые являются потомками (дочерние или в группе потоков) ожидаемого процесса. Это должно быть рекурсивным (учитывая детей детей).
Ответ Леонтьева дает подсказку: все имена папок в
/proc/$PID/task/
PID потоков содержатchildren
файл со списком потенциальных дочерних процессов.Однако ему не хватает рекурсивности, поэтому вот быстрый и грязный скрипт для их поиска:
Если процесс PID 1234 - это тот, который вы хотите сделать рекурсивно приятным, теперь вы можете сделать:
1 Обратите внимание, что для соответствия POSIX вызов
getpid(2)
внутри потока не даст вам общесистемного уникального идентификатора (PID) этого запускаемого объекта, а скорее PID основного процесса в «группе потоков». Вам нужно будет позвонитьgettid(2)
вместо этого. Смотрите этот ответ для получения дополнительной информации.источник
Не следует путать PID процесса и идентификатор потока, когда-нибудь записанный TID или в команду ps LPW. У
s
команды есть опции для отображения потоков, а подtop
илиhtop
вы переключаетесь между потоками и обрабатываете поH
буквам. Как ранее сообщал @Totor, с NPTL, который является текущей реализацией с ядром> 2.6, все потоки имеют одинаковый pid, но имеют различный tid. Вы показываете все темы процесса:Эти tid являются именами каталогов, находящихся под
/proc/<pid>/task
, и даже если renice (1) говорит, что его аргумент по умолчанию является pid, когда применяется к pid, он выводит только основной поток (это ошибка в реализации linux, как написано в setpriority (2) ) ), это также может быть применено к tid, и это возобновляет поток. Вот почему ответ @Anton является действительным.Но чаще всего существует более простой способ достижения желаемого результата, все эти потоки используют один и тот же pgid, который является pid лидера группы; Вы можете арендовать через pgid, выполнив:
Если вы не хотите арендовать какой-то другой процесс, который зависит от того же лидера группы, вы должны использовать рецепт @ Anton:
или:
Возможно, вы также захотите узнать, что представляют собой другие процессы той же группы, чем процесс, который вы хотите арендовать, то есть процессы, которые совместно используют, имеют одинаковый pgid. Вы можете использовать ps (1) ,
ps
не позволяет выбирать процессы по групповому лидеру, но вы можете использовать команду grepps
для этого. Процессы с pgid1908
будут заданы командой:или если вы предпочитаете awk для sed:
источник
$ 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;}'
как метод Totor работает / работает:$ /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 ...
я подтвердил с помощью / proc, htop, pstree и т. Д., Что у меня есть правильный top- уровень PID. Может быть, что-то изменилось в прошлом году./proc/8524/task
ноrenice -g
не сможете . Когда вы смотрите на дерево процессов, одна ветвь находится в одной группе процессов, а не только один поточный процесс. Попробуйте еще раз проверить результатps -Ljf
.Я бы рекомендовал использовать аргумент -g (группы процессов) вместо -p (идентификаторы процессов) при использовании renice. Это делает то же самое без баш-фу.
т.е.
источник
Вот мой сценарий:
источник