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占用过高排查的资料请关注脚本之家其它相关文章!

相关文章

  • Linux基于TCP实现服务端客户端通信的步骤详解

    Linux基于TCP实现服务端客户端通信的步骤详解

    文章详细介绍了Linux系统中的前台进程和后台进程的概念、创建、切换和操作方法,以及进程关系、守护进程、TCP服务器与客户端通信等方面的内容,需要的朋友可以参考下
    2026-03-03
  • 虚拟机中CentOS7设置固定IP地址的方法

    虚拟机中CentOS7设置固定IP地址的方法

    这篇文章主要介绍了虚拟机中CentOS7设置固定IP地址的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-12-12
  • Openssl实现双向认证教程(附服务端客户端代码)

    Openssl实现双向认证教程(附服务端客户端代码)

    这篇文章主要介绍了Openssl实现双向认证教程(附服务端客户端代码),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • Apache日志管理和统计分析知识

    Apache日志管理和统计分析知识

    Apache服务器具备强大的日志功能,管理员可以方便、准备、及时地了解服务器状况;可以更好地防范黑客的攻击
    2016-04-04
  • Linux中服务器磁盘空间管理与大文件清理的实践指南

    Linux中服务器磁盘空间管理与大文件清理的实践指南

    通过定期执行磁盘空间检查和大文件清理,可以有效预防磁盘空间不足导致的服务中断,本文将为大家详细介绍一下Linux服务器磁盘空间管理与大文件清理的相关方法,希望对大家有所帮助
    2025-10-10
  • centos7访问windows系统的共享文件夹详解

    centos7访问windows系统的共享文件夹详解

    文章讲述了在Windows和CentOS系统之间共享文件夹并挂载的过程,包括在Windows上设置共享文件夹,以及在CentOS上使用CIFS协议挂载共享文件夹的详细步骤,此外,还介绍了如何设置开机自动挂载和提高挂载点权限的安全性
    2025-12-12
  • Ubuntu服务器下搭建php运行环境的方法

    Ubuntu服务器下搭建php运行环境的方法

    这篇文章主要介绍了Ubuntu服务器下搭建php运行环境的方法,简单分析了Ubuntu操作系统环境下搭建Apache、php及mysql模块相关步骤、命令与操作技巧,需要的朋友可以参考下
    2018-04-04
  • Linux常用命令之grep命令用法详解

    Linux常用命令之grep命令用法详解

    这篇文章主要介绍了Linux常用命令grep命令用法详解,grep命令用于对文件和文本执行重复搜索任务的Unix工具,可以通过grep命令指定特定搜索条件来搜索文件及其内容以获取有用的信息。对此感兴趣可以了解一下
    2020-07-07
  • Ubuntu14.04搭建Caffe(仅CPU)详解教程

    Ubuntu14.04搭建Caffe(仅CPU)详解教程

    这篇文章主要介绍了Ubuntu14.04搭建Caffe(仅CPU)详解教程,操作系统是Ubuntu 14.04,本文分步骤给大家介绍的非常详细,具有参考借鉴价值,需要的朋友可以参考下
    2016-11-11
  • apache正常访问mht类型文件的配置方法

    apache正常访问mht类型文件的配置方法

    这篇文章主要介绍了apache正常访问mht类型文件的配置方法,需要的朋友可以参考下
    2014-04-04

最新评论