CentOS 上 cpustat 常见问题与解决方法
一 工具选择与安装
- 名称歧义:CentOS 上常见的“cpustat”有两种来源,功能与权限要求差异很大。
- 来自 sysstat 包:系统自带的 CPU 使用率汇总工具,安装与运行简单,适合日常巡检。
- 来自 Uber 的 cpustat(Go 版):基于 NETLINK taskstats 的高频/低开销采样工具,能捕捉瞬时尖峰,但通常需要更高权限。
- 快速安装与验证
- sysstat 版:
- 安装:CentOS 7 用
sudo yum install -y sysstat;CentOS 8+ 用 sudo dnf install -y sysstat
- 验证:
cpustat --help 或 man cpustat
- Uber 版(Go):
- 安装 Go 后:
go install github.com/uber-common/cpustat@latest
- 运行:通常需
sudo 或授予能力:sudo setcap cap_net_admin+ep $(which cpustat)
- 注意:该 Go 项目已标注为 deprecated/not maintained,生产建议优先使用 sysstat 或改用 perf/top/htop/mpstat 等替代工具。
二 权限与运行环境问题
- 必须以 root 运行或具备 NET_ADMIN 能力
- 现象:启动报 “requires root” 或 “socket: operation not permitted”
- 解决:
- 直接以 root 运行:
sudo cpustat
- 授予能力:
sudo setcap cap_net_admin+ep /usr/local/bin/cpustat
- 容器环境无输出或初始化失败
- 现象:Docker 中执行后无输出/立即退出
- 解决:
- 添加能力:
docker run --rm --cap-add=NET_ADMIN uber-common/cpustat
- 或临时使用
--privileged
- 安全模块限制
- 现象:Netlink 初始化失败
- 解决:检查 SELinux/AppArmor 策略,放行 netlink/taskstats 相关系统调用
- 内核/系统限制
- 现象:极旧内核不支持 NETLINK_GENERIC
- 解决:升级至较新内核(建议 ≥ 2.6.31)
三 安装与部署问题
- Go 依赖拉取失败
- 现象:
go get 超时或包不可达
- 解决:
- 设置代理:
GOPROXY=https://goproxy.cn go get github.com/uber-common/cpustat
- 或手动克隆并构建:
git clone https://gitcode.com/gh_mirrors/cp/cpustat.git
cd cpustat && go install
- 容器运行异常
- 现象:容器无输出/退出
- 解决:确保容器具备 NET_ADMIN 能力,或使用
--privileged;同时确认宿主机已安装并允许访问 taskstats 接口。
四 高频采样与结果解读问题
- 采样间隔与次数设置不当
- 现象:输出刷太快看不清,或只采样一次无法判断趋势
- 解决:使用间隔与次数控制,例如每 2 秒采样 10 次:
cpustat -i 2 -n 10
- 只看到整体 CPU,无法定位进程/线程
- 现象:需要精确到进程/线程/函数级热点
- 解决:
- 进程/线程:
top -H -p <PID> 定位高 CPU 线程(TID)
- Java:
printf "%x\n" <TID> 转十六进制后用 jstack <PID> | grep -A20 <hex_tid>
- 系统级热点:
perf top/perf record -a -g 抓取调用栈
- 指标含义与判断要点
- 关注
us(用户态)、sy(内核态)、wa(I/O 等待)、id(空闲)、以及 load average(1/5/15 分钟负载)
- 经验判断:
us 高:应用计算/算法问题
sy 高:系统调用频繁、中断/调度/驱动问题
wa 高:磁盘或网络 I/O 瓶颈
load 高于 CPU 核心数且持续:系统过载,需结合 I/O、内存、调度等进一步排查。
五 替代工具与迁移建议
- 优先选择维护良好的工具
- 系统自带:top/htop/mpstat/vmstat/iostat/pidstat(覆盖进程、每核、I/O、上下文切换等多维视角)
- 问题定位:perf(热点函数/调用栈)、bpftrace/eBPF(低开销动态观测)
- 何时仍考虑 Uber cpustat
- 需要比 top 更低开销、比 sar 更高频的汇总视图,且能接受项目已 不再维护 的风险
- 快速命令示例
- 每核使用率:
mpstat -P ALL 1
- 进程级 CPU:
pidstat -u -p ALL 1
- 综合资源:
vmstat 1、iostat -x 1
- 容器场景:优先在宿主机侧采集,或使用具备 NET_ADMIN 的特权容器,避免因权限受限导致数据缺失。