
云服务器 CPU 告警是最常见的运维事件之一。同样是 CPU 高,原因可能是业务线程死循环、GC 频繁、大量系统调用,也可能是 IO 等待把 load 拉高。本文给出一套从宏观到微观的排查流程,命令均可在 CVM、轻量应用服务器上直接执行。
load average 统计的是处于运行队列和不可中断睡眠(D 状态)的任务数,并不等于 CPU 使用率。
uptime
# 10:20:01 up 36 days, load average: 8.12, 6.90, 5.31
nproctop -b -n 1 | head -n 15
vmstat 1 5重点看各列占比:
us 高:用户态计算,多半是业务代码。sy 高:系统调用或上下文切换过多,常见于锁竞争、频繁小 IO。wa 高:等待磁盘,应转向 iostat -x 1 排查 IO。st 高:宿主机资源争抢,需要联系云厂商或更换实例规格,应用侧无法解决。ps -eo pid,ppid,%cpu,%mem,cmd --sort=-%cpu | head -n 10
top -H -p <PID>top -H 会按线程展示 CPU。拿到最高的线程 ID(TID)后,转十六进制,便于在线程栈中对照:
printf '%x\n' <TID>Java 进程:
jstack <PID> | grep -A 20 "nid=0x<十六进制TID>"如果发现大量 GC 线程占用 CPU,应转看 jstat -gcutil <PID> 1000,检查老年代是否持续接近满。
非 JVM 进程可以用 perf:
perf top -p <PID>
perf record -g -p <PID> -- sleep 30
perf reportstrace -c -p <PID> 可以统计系统调用耗时分布,sy 高时很有用,但对线上进程有性能影响,应限定时间使用。
现象 | 常见原因 | 处理方向 |
|---|---|---|
单线程 100% | 死循环、正则回溯 | 修复代码,加超时 |
多线程 us 高 | 流量突增、缓存失效 | 限流、扩容、预热缓存 |
sy 高 | 锁竞争、频繁上下文切换 | 减少线程数,合并小请求 |
wa 高 | 磁盘慢、日志刷盘过多 | 降低日志级别,换高性能云盘 |
挖矿类进程 | 被入侵 | 隔离、查定时任务和密钥、重装并加固 |
top、栈、perf 数据),再重启服务,否则无法复盘。排查顺序:load → CPU 构成 → 进程 → 线程 → 栈/perf → 归因。每一步都用数据缩小范围,比直接重启更可靠,也能为后续优化留下证据。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。