首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Linux 服务器 CPU 飙高排查:从 load average 到线程级定位

Linux 服务器 CPU 飙高排查:从 load average 到线程级定位

原创
作者头像
一只特立独行的兔先生
发布于 2026-10-17 12:33:20
发布于 2026-10-17 12:33:20
340
举报

背景

云服务器 CPU 告警是最常见的运维事件之一。同样是 CPU 高,原因可能是业务线程死循环、GC 频繁、大量系统调用,也可能是 IO 等待把 load 拉高。本文给出一套从宏观到微观的排查流程,命令均可在 CVM、轻量应用服务器上直接执行。

1. 先区分 load 与 CPU 使用率

load average 统计的是处于运行队列和不可中断睡眠(D 状态)的任务数,并不等于 CPU 使用率。

代码语言:bash
复制
uptime
# 10:20:01 up 36 days, load average: 8.12, 6.90, 5.31
nproc
  • load 明显大于核数:存在排队,可能是 CPU 饱和,也可能是大量 D 状态进程(磁盘/NFS 卡住)。
  • 1、5、15 分钟三个值递增还是递减,可判断问题在恶化还是在恢复。

2. 看 CPU 时间构成

代码语言:bash
复制
top -b -n 1 | head -n 15
vmstat 1 5

重点看各列占比:

  • us 高:用户态计算,多半是业务代码。
  • sy 高:系统调用或上下文切换过多,常见于锁竞争、频繁小 IO。
  • wa 高:等待磁盘,应转向 iostat -x 1 排查 IO。
  • st 高:宿主机资源争抢,需要联系云厂商或更换实例规格,应用侧无法解决。

3. 定位到进程与线程

代码语言:bash
复制
ps -eo pid,ppid,%cpu,%mem,cmd --sort=-%cpu | head -n 10
top -H -p <PID>

top -H 会按线程展示 CPU。拿到最高的线程 ID(TID)后,转十六进制,便于在线程栈中对照:

代码语言:bash
复制
printf '%x\n' <TID>

4. 抓取线程栈

Java 进程:

代码语言:bash
复制
jstack <PID> | grep -A 20 "nid=0x<十六进制TID>"

如果发现大量 GC 线程占用 CPU,应转看 jstat -gcutil <PID> 1000,检查老年代是否持续接近满。

非 JVM 进程可以用 perf:

代码语言:bash
复制
perf top -p <PID>
perf record -g -p <PID> -- sleep 30
perf report

strace -c -p <PID> 可以统计系统调用耗时分布,sy 高时很有用,但对线上进程有性能影响,应限定时间使用。

5. 常见原因与处理

现象

常见原因

处理方向

单线程 100%

死循环、正则回溯

修复代码,加超时

多线程 us 高

流量突增、缓存失效

限流、扩容、预热缓存

sy 高

锁竞争、频繁上下文切换

减少线程数,合并小请求

wa 高

磁盘慢、日志刷盘过多

降低日志级别,换高性能云盘

挖矿类进程

被入侵

隔离、查定时任务和密钥、重装并加固

6. 注意事项

  • 排查前先保留现场(top、栈、perf 数据),再重启服务,否则无法复盘。
  • 云监控的 CPU 告警建议设置“持续多个周期”触发,避免瞬时毛刺造成误报。
  • 具体告警配置入口与指标名称以腾讯云控制台为准。

总结

排查顺序:load → CPU 构成 → 进程 → 线程 → 栈/perf → 归因。每一步都用数据缩小范围,比直接重启更可靠,也能为后续优化留下证据。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

目录
  • 背景
  • 1. 先区分 load 与 CPU 使用率
  • 2. 看 CPU 时间构成
  • 3. 定位到进程与线程
  • 4. 抓取线程栈
  • 5. 常见原因与处理
  • 6. 注意事项
  • 总结
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档