![在 Linux 上,如何检查进程及其线程的 CPU 亲和性?](https://linux22.com/image/798072/%E5%9C%A8%20Linux%20%E4%B8%8A%EF%BC%8C%E5%A6%82%E4%BD%95%E6%A3%80%E6%9F%A5%E8%BF%9B%E7%A8%8B%E5%8F%8A%E5%85%B6%E7%BA%BF%E7%A8%8B%E7%9A%84%20CPU%20%E4%BA%B2%E5%92%8C%E6%80%A7%EF%BC%9F.png)
在 Linux 上,如何检查进程及其线程的 CPU 亲和性?
答案1
这很简单。 收集所有进程 ID 和线程 ID,然后调用程序taskset
。 喜欢,
taskset -cp 2
taskset -cp 4
…
按进程名称打印所有内容
taskset
有--all-tasks
可选参数
taskset --all-tasks -p $(pgrep java)
对于某些进程,--all-tasks
似乎没有打印所有子进程(在我的测试中,它没有打印子进程kthreadd
,我不确定为什么会这样)。
按进程名称打印所有帮助脚本
这是一个简短的 Linux shell 脚本,用于按名称打印进程及其所有子线程的 CPU 亲和力。
#!/usr/bin/env bash
set -eu
pname=${1:-kthreadd} # default to 'kthreadd'
for pid in $(pgrep "${pname}"); do
echo "PID: ${pid} (${pname})"
for tid in $(pgrep -P "${pid}" | tr '\n' ' '); do
taskset -cp "${tid}"
done
done
输出
PID: 2 (kthreadd)
pid 4's current affinity list: 0
pid 6's current affinity list: 0
pid 7's current affinity list: 0
pid 8's current affinity list: 0
…
在 Ubuntu 12、bash 4 上测试。