不错的价值还是CPU份额?
请注意,由于自动任务分组,尤其是在使用systemd时,如今,好的值可能在“整个系统”中不太重要。请参阅此答案以获取更多详细信息。
线程和进程之间的区别
在Linux上的一个重要问题,因为文档永久性地使人怀疑(例如,关于没有自己的PID的线程)。
注意:此答案准确解释了Linux线程。
简而言之:内核仅处理“可运行实体”,即可以运行和调度的东西。在内核方面,这些实体称为流程。线程只是与另一线程共享(至少)内存空间和信号处理程序的一种进程。
每个此类进程都有一个系统范围的唯一标识符:PID(进程ID)。对于所谓的线程,有时也称为TID(线程ID),但从sysadmin(和内核!)的角度来看,TID和PID是同一件事(它们共享相同的名称空间)。
结果,您可以 renice
单独使用每个“线程”,因为它们具有自己的 PID 1。
递归查找所有PIDrenice
我们需要获取所有待处理进程(子进程或线程组中的子进程)的PID(“正常”或“线程”)。这应该是递归的(考虑孩子的孩子)。
Anton Leontiev的答案给出了这样做的提示:文件夹中的所有名称/proc/$PID/task/
都是线程的PID,其中包含children
列出潜在子进程的文件。
但是,它缺乏递归性,因此这里有一个快速而肮脏的shell脚本来查找它们:
#!/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
如果您要递归地处理PID 1234,那么现在可以执行以下操作:
renice -n 15 -p $(/path/to/findchildren.sh 1234)
1请注意,为了符合POSIX,getpid(2)
在线程内调用不会为您提供此可运行实体的系统范围内的唯一ID(PID),而是给您“线程组”内主进程的PID。您需要致电gettid(2)
。有关更多信息,请参见此答案。
man (7) pthreads
关于当前(NPTL)的实现说:“一个进程中的所有线程都放在同一个线程组中;线程组的所有成员共享相同的PID”和“线程不共享相同的nice值”。那么,当renice
使用PID来执行此操作时,如何放弃没有自己的PID的线程呢?