有没有办法强制一个具有特定PID的进程,只能在服务器的一个cpu上执行和运行?我知道有这样的命令
taskset -cp <Cpu_Number> <Pid>
但上述命令在我的系统上不起作用。如果还有其他命令,请告诉我。
答案 0 :(得分:15)
有两种方法可以将cpu核心/核心分配给正在运行的进程。
第一种方法:
taskset -cp 0,4 9030
非常清楚!将cpu核心0和4分配给pid 9030。
第二种方法:
taskset -p 0x11 9030
这有点复杂。 -p
后面的十六进制数字是位掩码。可以找到here的解释,摘录如下:
CPU亲和性表示为位掩码,具有最低顺序 对应于第一逻辑CPU和最高位的位 对应于最后一个逻辑CPU。并非所有CPU都可能存在 给定系统但是掩码可以指定比存在的CPU更多的CPU。一个 检索到的掩码将仅反映与CPU对应的位 物理上在系统上。如果给出了无效的掩码(即,那个掩码 对应于当前系统上没有有效的CPU)错误是 回。掩码通常以十六进制形式给出。
仍然困惑?请看下面的图片:
我添加了与十六进制数对应的二进制文件,处理器从左开始从零开始计数。在第一个示例中,位掩码中的one
对应于zero
处理器,因此将为进程启用处理器。将禁用在位掩码中具有zero
到其对应位置的所有处理器。事实上,这就是它被称为面具的原因。
说完所有这些后,使用taskset更改处理器关联性需要:
用户必须拥有CAP_SYS_NICE才能更改a的CPU亲和性 处理。任何用户都可以检索关联掩码。
您可能有兴趣查看处理CAP_SYS_NICE的SO Question。
我的资源