Linux CPU占用过高的原因与排查指南

 更新时间:2026年05月27日 08:48:13   作者:小猫咪01  
这篇文章主要介绍了Linux CPU占用过高的排查方法,结合top、ps、pidat,定位具体进程、线线及可能原因,区分正常负载与异常情况,确保服务稳定运行,需要的朋友可以参考下

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 等待还是中断上。

以上就是Linux CPU占用过高的原因与排查指南的详细内容,更多关于Linux CPU占用过高排查的资料请关注脚本之家其它相关文章!

相关文章

  • Thrift的安装方法和简单实例

    Thrift的安装方法和简单实例

    下面小编就为大家带来一篇Thrift的安装方法和简单实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12
  • Linux下SSH免密码登录配置详解

    Linux下SSH免密码登录配置详解

    这篇文章主要介绍了Linux下SSH免密码登录配置详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • Linux服务器查看启动服务的5种方式总结

    Linux服务器查看启动服务的5种方式总结

    本文介绍Linux系统查看服务状态的多种方法,包括systemctl(推荐)、service、检查端口及进程,建议优先使用systemctl查看运行服务,结合ss -tuln验证网络监听,最后用systemctl list-unit-files确认开机自启项,以全面掌握服务情况
    2025-09-09
  • Linux实现多个JDK版本切换

    Linux实现多个JDK版本切换

    这篇文章主要介绍了Linux实现多个JDK版本切换方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2026-03-03
  • 详解Linux上svn命令行批量操作

    详解Linux上svn命令行批量操作

    这篇文章主要介绍了详解Linux上svn命令行批量操作的相关资料,linux上的svn命令行批量添加或删除文件,需要的朋友可以参考下
    2017-07-07
  • 详解git中配置的.gitignore不生效的解决办法

    详解git中配置的.gitignore不生效的解决办法

    这篇文章主要介绍了详解git中配置的.gitignore不生效的解决办法的相关资料,这里提供解决办法希望能帮助到大家,需要的朋友可以参考下
    2017-09-09
  • Linux之info指令用法

    Linux之info指令用法

    Linux的info命令是GNU项目提供的结构化文档工具,支持超链接和交互导航,比man更全面,适用于学习GNU工具、库及系统配置,提供详细技术参考,广泛集成于主流Linux发行版
    2025-08-08
  • CentOS9环境编译部署MySQL8.0.30全过程

    CentOS9环境编译部署MySQL8.0.30全过程

    文章介绍了如何在CentOS 9上下载和编译MySQL 8.0.30,包括环境配置、依赖安装、CMake编译参数解释、make编译以及MySQL的安装和配置
    2025-12-12
  • Linux服务器80端口无法访问的解决方案

    Linux服务器80端口无法访问的解决方案

    Linux服务器80端口无法访问问题多由权限不足、防火墙未开放或地址错误导致,解决步骤包括:切换root用户绑定端口、确认端口开放状态、检查访问地址正确性、测试HTTP请求处理及处理进程冲突
    2025-07-07
  • 虚拟机与物理机的文件共享方式

    虚拟机与物理机的文件共享方式

    文章介绍了如何在Kali Linux虚拟机中实现物理机文件夹的直接挂载,以便在虚拟机中方便地读取和使用物理机上的文件,通过设置和配置,可以实现临时挂载和永久挂载,并提供了详细的步骤和注意事项
    2025-01-01

最新评论