Valor agradável ou compartilhamentos de CPU?
Observe que hoje em dia, valores agradáveis podem não ser tão relevantes "em todo o sistema", devido ao agrupamento automático de tarefas, espacialmente ao usar systemd . Por favor, veja esta resposta para mais detalhes.
Diferença entre threads e processos
Pergunta importante no Linux, porque a documentação perpetua dúvidas (sobre threads que não possuem seu próprio PID, por exemplo).
Nota: esta resposta explica os threads do Linux com precisão.
Em resumo: o kernel lida apenas com "entidades executáveis", ou seja, algo que pode ser executado e agendado . Em termos de kernel, essas entidades são chamadas de processos. Um encadeamento é apenas um tipo de processo que compartilha (pelo menos) espaço de memória e manipuladores de sinal com outro.
Todo processo desse tipo possui um identificador exclusivo em todo o sistema: o PID (ID do processo). Para os chamados encadeamentos, às vezes é chamado TID (ID do encadeamento), mas do ponto de vista do sysadmin (e do kernel!), TID e PID são a mesma coisa (eles compartilham o mesmo espaço de nome).
Como resultado, você pode renice
"encadear" individualmente porque eles têm seu próprio PID 1 .
Localizando todos os PIDs para renice
recursiva
Precisamos obter os PIDs de todos os processos ("normais" ou "encadeamentos") que são descendentes (filhos ou no grupo de encadeamentos) do processo a ser percebido. Isso deve ser recursivo (considerando os filhos das crianças).
As respostas de Anton Leontiev dão a dica para fazer isso: todos os nomes de pastas /proc/$PID/task/
são PID de threads contendo um children
arquivo que lista os possíveis processos filhos.
No entanto, falta recursividade, então aqui está um script shell rápido e sujo para encontrá-los:
#!/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
Se o processo PID 1234 é o que você deseja, recursivamente agradável, agora você pode fazer:
renice -n 15 -p $(/path/to/findchildren.sh 1234)
1 Observe que, para conformidade com o POSIX, a chamada getpid(2)
em um encadeamento não fornecerá o PID (ID exclusivo para todo o sistema) dessa entidade executável, mas o PID do processo principal no "grupo de encadeamentos". Você precisaria ligar em gettid(2)
vez disso. Veja esta resposta para mais informações.
man (7) pthreads
diz sobre a implementação atual (NPTL): "todos os threads em um processo são colocados no mesmo grupo de threads; todos os membros de um grupo de threads compartilham o mesmo PID" e "Threads não compartilham um valor legal comum". Então, como você pode renomear um thread que não possui seu próprio PID, quandorenice
usa um PID para fazer isso?