温馨提示×

centos cpustat为何卡顿

小樊
47
2026-07-20 21:31:24
栏目: 智能运维

cpustat 在 CentOS 上出现卡顿(执行慢、输出延迟、甚至卡住),通常不是 CPU 本身的问题,而是采集数据来源、权限、系统状态或工具本身导致的。下面按最常见 → 较少见给你系统排查。


一、最常见原因

1️⃣ 读取 /proc/sys 被阻塞(最常见)

cpustat 本质是从以下路径采集数据:

  • /proc/stat
  • /proc/<pid>/stat
  • /proc/schedstat
  • /sys/devices/system/cpu/

如果以下情况存在,就会卡顿:

  • 系统有大量进程(几万)
  • 某些进程处于 D 状态(不可中断睡眠)
  • NFS / FUSE / 容器挂载异常
  • /proc 被高并发访问

✅ 排查方法:

ps -eo pid,state,comm | awk '$2=="D"' 

如果有大量 D 状态进程,很可能导致 cpustat 卡住。


2️⃣ 使用了 -p 按进程统计(非常慢)

例如:

cpustat -p

这会遍历 所有进程,在以下环境会明显卡顿:

  • 容器数量多(K8s / Docker)
  • Java / Go 进程(线程多)
  • 僵尸进程多

✅ 建议:

cpustat -p 1   # 只看前 1 个

或干脆不用 -p


3️⃣ 内核版本 / proc 延迟问题

在以下内核或环境中常见:

  • CentOS 7(老内核)
  • 高负载 + cgroup 压力大
  • 云厂商定制内核

表现为:

  • cat /proc/stat 也慢
  • top 也轻微卡

✅ 验证:

time cat /proc/stat

如果超过 0.1s,说明系统层面已经慢了。


二、权限 & 审计问题

4️⃣ strace / auditd / SELinux 影响

如果系统开启了:

  • auditd
  • selinux=enforcing
  • cpustatstrace

可能导致系统调用变慢。

✅ 检查:

getenforce
systemctl status auditd

5️⃣ 终端输出阻塞(SSH / 终端慢)

如果你在:

  • 慢 SSH 会话
  • 高延迟跳板机
  • Windows Terminal + 大量输出

cpustat看起来卡顿,其实是输出慢。

✅ 验证:

cpustat > /tmp/cpu.log

如果写入文件很快,说明是终端问题。


三、cpustat 本身的问题

6️⃣ 你用的是哪个 cpustat?

CentOS 默认 没有 cpustat,常见来源:

来源 说明
sysstat 实际是 mpstat
cpustat (Go) 开源工具,遍历进程
自己写的脚本 可能死循环

✅ 确认:

which cpustat
rpm -qf $(which cpustat)

如果是 Go 版 cpustat,在进程多时确实会卡。


四、快速定位 checklist(推荐顺序)

# 1. 是否有 D 状态进程
ps -eo pid,state,comm | awk '$2=="D"'

# 2. proc 是否慢
time cat /proc/stat

# 3. 是否进程太多
ps -e | wc -l

# 4. 是否终端问题
cpustat > /tmp/t.log

# 5. 是否 -p 导致
cpustat -p 5

五、替代方案(不卡)

如果只是想看 CPU 使用率:

mpstat -P ALL 1
sar -u 1
top
htop

六、总结一句话

CentOS 上 cpustat 卡顿,90% 是因为进程太多或 /proc 被阻塞,而不是 CPU 本身问题。

如果你愿意,可以把下面信息贴出来,我可以精准判断:

  • CentOS 版本
  • cpustat 来源
  • 是否容器环境
  • 卡顿时 ps -eo state | sort | uniq -c 的输出

0