mpstat -p all 是最直接查看每个逻辑cpu核心执行分布的工具,它将%usr、%sys、%idle等指标拆分到各核心,可快速识别单核高负载、%steal异常或进程绑核问题。

用 mpstat -P ALL 查每个 CPU 核心的执行分布
要看到每个逻辑 CPU(包括超线程核心)上实际运行了什么,mpstat 是最直接的选择。它不只告诉你“CPU 总体忙不忙”,而是把 %usr、%sys、%idle 拆到每个核心上,能一眼识别出是不是某颗核心被单线程进程死死占住。
-
mpstat -P ALL 1:每秒刷新一次,显示所有核心(含 offline 的)实时占比 - 输出中每行对应一个 CPU ID(如
0、1…),%idle持续低于 5% 就说明该核负载极高 - 注意
%steal值:在虚拟机里如果 >1%,说明宿主机调度抢走了它的 CPU 时间,不是本机进程问题 - 如果某核心
%usr长期接近 100% 而其他核心空闲,大概率是单线程程序没做并发优化
用 top -1 + P 键看进程绑定在哪颗 CPU 上
top 默认聚合显示整体 CPU 使用率,但加 -1 参数后会拆开每颗核心的实时曲线——这一步必须做,否则看不到分布差异。再配合 P 排序,就能定位高占用进程是否集中在某几个核心上。
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
- 启动时直接运行
top -1,避免进界面后再按1(有些旧版本 top 不支持热键生效) - 按
P后观察%CPU列,再看右侧CPU列(部分版本需按f添加该字段)——它显示该进程最近一次调度在哪个 CPU 上运行 - 这个值是瞬时快照,不能代表长期绑定;真要确认进程绑核,得查
taskset -cp <pid></pid> - 如果多个高 CPU 进程都挤在同一个 CPU ID 上,而其他核心 idle 很高,说明调度器没均衡或人为绑核了
用 pidstat -t -p <pid> 1</pid> 看线程级 CPU 分布
单个进程可能有多个线程,而它们未必均匀分布在 CPU 上。pidstat -t 能把进程内每个线程(LWP)的 CPU 占用单独列出来,并标出它当前跑在哪个 CPU 上(%CPU 和 CPU 两列)。
-
pidstat -t -p 1234 1:每秒采样一次 PID 1234 进程的所有线程 - 输出中
TID是线程 ID,%CPU是该线程独占的 CPU 百分比,CPU是它最近一次执行的核心编号 - 若发现某个 TID 的
%CPU接近 100% 且CPU固定为某一值,基本可判定它是热点线程,且未被调度器迁移 - 注意:
pidstat来自sysstat包,CentOS/RHEL 需先yum install sysstat,Ubuntu/Debian 是apt install sysstat
别忽略 /proc/<pid>/status</pid> 里的 Threads 和 CPUs_allowed_list
操作系统层面的 CPU 分布限制,最终落在进程的 cgroup 或 task_struct 层面。直接读 /proc/<pid>/status</pid> 能确认该进程有没有被人为限制可用 CPU 范围——这是很多性能问题的隐藏原因。
grep -E '^(Threads|Cpus_allowed_list)' /proc/1234/status-
Threads显示当前活跃线程数,和pidstat -t的 TID 行数应一致 -
Cpus_allowed_list是它被允许运行的 CPU ID 列表,比如0-3或0,2;如果只写了0,那它永远只能在 CPU 0 上跑 - 这种限制可能来自
taskset、numactl、容器 runtime(如 Docker 的--cpuset-cpus)或 systemd service 的AllowedCPUs=
%idle、线程 CPU 字段、还有 Cpus_allowed_list 这三处,才能真正看清指令到底跑在哪儿。










