当前位置: 首页 > news >正文

Linux CPU 占用过高怎么排查?top、ps、pidstat

Linux CPU 占用过高怎么排查?top、ps、pidstat

1. 前言

Linux 服务器 CPU 占用过高,是线上排障中非常常见的问题。
常见现象包括:

  • 接口响应变慢;
  • SSH 登录卡顿;
  • 服务线程堆积;
  • 负载 Load Average 升高;
  • 风扇转速变高;
  • 进程占用 CPU 长时间不下降。

排查 CPU 问题,不能只看一个top
更合理的方式是结合:

top ps pidstat uptime mpstat perf 应用日志

本文重点围绕toppspidstat展开,讲清楚 Linux CPU 占用过高时怎么定位到具体进程、线程和可能原因。


2. CPU 占用高可能是什么原因

CPU 高并不一定是坏事。
如果服务器正在正常处理大量请求,CPU 高可能是正常负载。

但如果 CPU 持续高位,就要重点排查。

常见原因:

类型说明
业务请求量突增流量变大,服务正常忙
死循环某段代码一直空转
线程池打满大量线程争抢 CPU
GC 频繁Java 程序频繁垃圾回收
正则或加密计算过重CPU 密集型任务
日志疯狂打印大量字符串拼接和 IO
异常进程挖矿、木马、未知脚本
系统中断高网卡、磁盘、驱动异常

所以排查时要先判断:

是哪个进程高? 是用户态 CPU 高,还是系统态 CPU 高? 是单线程高,还是多线程高? CPU 高是否和业务流量一致?

3. top:第一时间看整体情况

执行:

top

重点看顶部几行:

%Cpu(s): 85.0 us, 10.0 sy, 0.0 ni, 3.0 id, 1.0 wa, 0.0 hi, 1.0 si, 0.0 st

字段说明:

字段含义
us用户态 CPU,业务程序代码消耗
sy系统态 CPU,内核调用消耗
id空闲 CPU
wa等待 IO
hi硬中断
si软中断
st虚拟化环境中被宿主机偷走的 CPU

判断思路:

现象可能方向
us应用程序计算多、死循环、GC、业务压力大
sy系统调用多、网络/文件操作频繁
wa磁盘 IO 慢,不一定是 CPU 真忙
hi/si网络包、中断、驱动相关问题
st云主机宿主机资源争抢

4. top 中按 CPU 排序

进入top后按:

P

可以按 CPU 占用排序。

常见字段:

字段说明
PID进程 ID
USER进程用户
%CPUCPU 占用
%MEM内存占用
TIME+累计 CPU 时间
COMMAND命令名

如果某个进程长期排第一,基本就是重点对象。

查看某个进程详细信息:

ps -fp PID

例如:

ps -fp 12345

5. ps:快速找 CPU 最高的进程

查看 CPU 占用最高的前 10 个进程:

ps aux --sort=-%cpu | head

输出示例:

USER PID %CPU %MEM COMMAND app 1234 180 20.1 java -jar app.jar root 2345 60 1.2 nginx

说明:

  • %CPU可能超过 100;
  • 多核 CPU 下,一个进程多线程可以占用超过 100%。

查看指定进程:

ps -p 1234 -o pid,ppid,user,%cpu,%mem,etime,cmd

字段说明:

字段含义
pid进程 ID
ppid父进程 ID
%cpuCPU 占用
%mem内存占用
etime运行时长
cmd启动命令

6. pidstat:持续观察进程 CPU

pidstat来自sysstat工具包。

安装:

Ubuntu / Debian:

sudo apt install sysstat -y

CentOS / RHEL:

sudo yum install sysstat -y

查看所有进程 CPU,每 1 秒一次:

pidstat 1

查看指定进程:

pidstat -p 1234 1

输出示例:

UID PID %usr %system %guest %wait %CPU CPU Command app 1234 80.0 10.0 0.0 0.0 90.0 1 java

字段说明:

字段含义
%usr用户态 CPU
%system系统态 CPU
%wait等待 CPU 调度
%CPU总 CPU 占用
CPU当前运行在哪个 CPU 核心

pidstattop更适合连续观察趋势。


7. 定位到线程级别

有些进程内部有很多线程。
例如 Java、Nginx、MySQL 都可能是多线程或多进程模型。

查看某进程的线程 CPU:

top -H -p 1234

或者:

ps -mp 1234 -o THREAD,tid,time,%cpu

找到占用高的线程 TID 后,如果是 Java 程序,可以把 TID 转成十六进制:

printf "%x\n" 线程ID

例如:

printf "%x\n" 5678

然后用:

jstack 1234 | grep -A 30 十六进制线程ID

定位 Java 线程堆栈。


8. mpstat:看每个 CPU 核心

如果怀疑单核打满,可以用:

mpstat -P ALL 1

如果某一个 CPU 核心长期 100%,可能是:

  • 单线程程序跑满;
  • 中断集中在某个核心;
  • 线程绑定 CPU;
  • 某个热点线程异常。

9. CPU 高的实战排查流程

9.1 看整体 CPU
top

重点看:

us sy wa hi si st
9.2 找最高进程
ps aux --sort=-%cpu | head
9.3 持续观察
pidstat -p PID 1
9.4 看线程
top -H -p PID
9.5 查日志和应用状态
journalctl -u 服务名 -n 100 tail -f app.log
9.6 如果是 Java
jstack PID jstat -gcutil PID 1000

看是否频繁 GC 或线程死循环。


10. 常见场景判断

10.1 用户态 CPU 高

topus高。

常见原因:

  • 业务计算量大;
  • 死循环;
  • 大量 JSON 序列化;
  • 加密解密;
  • 正则匹配;
  • Java GC;
  • 大量请求。

处理思路:

找进程 找线程 看代码堆栈 看接口流量 看日志

10.2 系统态 CPU 高

sy高。

常见原因:

  • 大量系统调用;
  • 网络连接频繁创建关闭;
  • 文件 IO 很频繁;
  • 容器或内核网络开销;
  • 进程频繁 fork。

可以结合:

strace -p PID

观察系统调用。
线上使用strace要谨慎,避免影响进程。


10.3 iowait 高

wa高不代表 CPU 真忙。
它通常表示 CPU 在等磁盘 IO。

继续排查:

iostat -x 1 iotop

如果磁盘很忙,要去看 IO 问题,而不是只盯 CPU。


11. 不要一上来 kill -9

发现 CPU 高后,不建议直接:

kill -9 PID

除非已经确认是异常进程。

更稳妥:

  1. 先记录现场;
  2. 保存日志;
  3. 查看进程命令;
  4. 查看线程;
  5. 必要时 dump;
  6. 再考虑重启或 kill。

Java 程序可以先:

jstack PID > jstack.txt jmap -histo PID > histo.txt

然后再处理。


12. 小结

CPU 高排查核心命令:

top ps aux --sort=-%cpu | head pidstat -p PID 1 top -H -p PID mpstat -P ALL 1

排查思路:

先看整体 CPU 类型 ↓ 找出高 CPU 进程 ↓ 持续观察进程趋势 ↓ 定位到线程 ↓ 结合应用日志和代码堆栈 ↓ 判断是流量、死循环、GC、IO 还是异常进程

CPU 排查最重要的是不要只看表面占用率,而要判断 CPU 时间到底消耗在用户态、系统态、IO 等待还是中断上。

http://www.cnnetsun.cn/news/2597800.html

相关文章:

  • FSearch终极指南:如何在Linux系统实现秒级文件搜索
  • 【紧急预警】ChatGPT心理回复正在触发“安慰剂悖论”?神经语言学实验证实:第7轮对话后共情衰减率达63.8%
  • Docker 实战教程 - 从入门到大神
  • Hotkey Detective:5分钟找出Windows快捷键冲突的终极解决方案
  • 从Shiro注解失效到自定义注解:一种更优雅的接口免认证方案
  • 钉钉自动打卡助手完整解决方案:告别迟到困扰的智能办公神器
  • Stanford Doggo:开源四足机器人终极指南 - 如何构建你的跳跃机器人伙伴
  • 开关磁阻电机变磁链三闭环DTC:抑制转矩脉动与降低铜耗的工程实践
  • IQFM:基于自监督学习的无线信号基础模型,赋能6G智能通信
  • 天基数字底座架构:从通信导航遥感孤岛到一体化智能服务
  • KMS_VL_ALL_AIO智能激活:Windows系统激活困境的终极技术解决方案指南
  • 论文提速的终极秘籍!好用的AI论文工具,秒出初稿不费力
  • 云克隆蛋白:科研与工业的可靠“蛋白引擎”
  • 【收藏 2026 版】程序员转型 AI 开发:Java 老司机转型大模型实战全指南
  • 别再让PCB打板翻车!手把手教你用华秋DFM+AD18做开短路检查(保姆级避坑)
  • 终极指南:如何快速免费将QQ音乐QMC文件转换为MP3/FLAC格式
  • 基于系统攻击面的移动目标防御有效性评估模型构建与仿真
  • RoboMaster舵轮底盘代码调试避坑指南:从CAN通信到PID调参的实战经验
  • 从赛后复盘到实战提升:以2022 GDCPC为例,聊聊如何高效训练应对算法竞赛中的“套路题”
  • 告别配置迷茫!手把手教你用ETAS ISOLAR-A配置AUTOSAR COM模块(附超时与信号处理实战)
  • Outfit字体:9种字重免费开源几何无衬线字体,打造专业品牌视觉
  • Windows Defender禁用与恢复终极指南:5个简单步骤解决安全中心问题
  • Digital逻辑设计模拟器:从零开始构建你的数字世界
  • Ryujinx存档安全指南:3种方法保护你的Switch游戏进度
  • 从二阶微分到卷积核:拉普拉斯算子在图像边缘检测与增强中的数学本质与实现
  • Deep3D:如何用AI将2D视频秒变立体3D大片?完整指南
  • 从原理到实践:AprilTags二维码的精准检测与机器人视觉应用
  • 别再为APC发愁了!手把手教你用支付宝搞定Wiley、MDPI版面费(附截图避坑)
  • 华硕笔记本性能管理终极指南:GHelper轻量控制工具完全教程
  • 3分钟打造专属NGA论坛:这个免费插件让你的浏览效率翻倍