优先用taskset -cp PID查看可读的CPU列表(如0-3,6,8-10:2),而非手动换算十六进制掩码;psr列显示进程当前实际运行的逻辑CPU编号,反映瞬时调度位置,非亲和性范围。

taskset -p 显示十六进制掩码,但别直接换算
执行 taskset -p 1234 输出类似 pid 1234's current affinity mask: 0x3,这表示允许运行在 CPU 0 和 CPU 1(因为 0x3 = 二进制 0011,最低位是 CPU 0)。但手动换算容易出错,尤其当掩码超过 8 位时(比如 0xffffff 对应 24 个核),位数一多就容易数错位置。
真正要确认进程“被允许在哪几个核上跑”,优先用带 -c 参数的写法:taskset -cp 1234。它会直接输出可读格式,例如 pid 1234's current affinity list: 0-3,6,8-10:2 —— 其中 :2 表示步长为 2,即 8、10,不是笔误。
- 普通用户只能查自己启动的进程;查 systemd、kthreadd 等需 root 权限
- 输出中若含
:2这类步长语法,说明该进程亲和性设置了稀疏核列表,不是连续范围 - 掩码高位超出物理核数会被忽略(如 32 核机器上设
0xffffffffffffffff,等效于全开)
ps -o pid,psr,comm -p 看的是“此刻在哪”,不是“能在哪”
psr 列显示的是进程**最后一次执行所用的逻辑 CPU 编号**(从 0 开始),它反映的是调度器当前实际落点,而非亲和性限制范围。一个绑定了 0,2,4 的进程,psr 值可能是 2,只要没被抢占或迁移,就完全合法。
多线程程序必须对每个线程 TID 单独查 —— 因为线程才是调度单位,进程本身不运行。例如:
ps -T -o pid,tid,psr,comm -p 1234
其中 tid 是线程 ID,psr 对应每个线程的实时落点。
Linux AI 服务器 — 将 Linux 服务器转换为本地 AI 推理集群。使用 systemd、NVIDIA CUDA 实现无头 Linux AI,零 GUI 开销。
- 如果某个线程的
psr长期出现在非绑定范围内(比如绑了 0,1 却总显示 3),说明亲和性被覆盖(常见于子线程调用了pthread_setaffinity_np()) - 虚拟机中
psr显示的是 vCPU 编号,不是宿主机物理核编号 - 单次
ps结果只反映瞬时状态;持续观察建议用pidstat -p 1234 -t 1或top -H -p 1234+ 按f→ 选中P列
pidstat -t 和 top -H 能暴露线程级亲和性异常
当进程有多个线程且行为不一致时,仅看主 PID 容易误判。比如主线程绑在 CPU 0,但某个 worker 线程悄悄跑到了 CPU 7 上 —— 这种情况用 ps -T 只能抓快照,而 pidstat -t 可以按秒刷新并聚合统计。
运行 pidstat -p $(pidof nginx) -t 1 3,输出里每行是一个线程,%usr 和 CPU 列会显示各线程的 CPU 使用率和所在核编号。若发现某线程 CPU 编号频繁跳变或固定在未绑定核上,基本可断定其亲和性未生效或被覆盖。
-
top -H -p 1234启动后按f键,空格选中P(Last CPU used),再按Esc返回,就能看到每个线程的实时 CPU 分布 - 注意区分
TID(线程 ID)和PID:修改线程亲和性必须用taskset -cp 0,1 <tid></tid>,不是主进程 PID - 某些应用(如 Java 应用)可能通过 JVM 参数或 JNI 层主动设置线程亲和性,此时
taskset查主 PID 会显示宽松掩码,但实际线程已受控
别混淆“允许运行在哪”和“正在运行在哪”
这是最常踩的坑:以为 taskset -p 显示的掩码就是进程当前所处的核,结果发现 psr 和它不一致,就怀疑绑定失败。其实两者职责完全不同 —— taskset 管“边界”,psr 记“快照”。只要 psr 值始终落在掩码范围内,亲和性就有效。
验证是否真被限制住,得看长期分布:如果绑定了 0,1,但 pidstat -t 持续 30 秒都只看到 CPU 列出现 0 和 1,没有 2、3、4……才算生效。偶尔一次 psr 出现在其他核上,只是调度器短暂迁移,不违反亲和性规则。
- 硬亲和性(hard affinity)由内核强制执行,调度器不会把进程/线程调度到掩码外的核;soft affinity 只是建议,现代 Linux 默认启用 hard affinity
- 检查是否被其他机制覆盖:systemd 的
CPUAffinity=设置、容器 runtime(如 runc)的 cpuset cgroup、或应用自身调用sched_setaffinity()都可能覆盖命令行设置 - 如果
taskset -cp显示空列表(如pid 1234's current affinity list:后无内容),说明该进程亲和性被设为 0,即禁止在任何 CPU 上运行 —— 通常意味着已崩溃或被冻结

















