Linux如何排查CPU占用过高_Linux CPU占用过高排查教程

酷强君_6849

酷强君_6849

2026-04-05

1032人浏览

原创

top是必须立即执行的首个命令,用于判断cpu占用类型(us/sy/wa/id)、定位高负载进程及线程、结合strace/perf/py-spy等工具深入分析,并需结合业务场景判断是否真异常。

linux如何排查cpu占用过高_linux cpu占用过高排查教程

top 是你第一个该敲的命令,不是“可能有用”,而是必须立刻执行。它能直接告诉你当前谁在吃 CPU、吃的是用户态还是内核态、有没有大量 I/O 等待——这些信息决定了后续排查方向,跳过这步等于蒙眼修车。

怎么看 top 输出里的关键指标

启动后别急着扫进程列表,先盯住顶部那行 %Cpu(s):us、sy、wa、id 这几个值才是诊断起点。

  • us 高(比如 >70%)且 wa 很低 → 问题大概率在你自己跑的程序里,比如 Python 脚本死循环、Java 应用某方法卡住
  • wa 高(比如 >20%)而 us 和 sy 都很低 → CPU 其实在干等磁盘,不是真忙,得切到 iostat -x 1 看 %util 和 await
  • sy 高(比如 >30%)→ 内核调用太频繁,可能是大量小文件读写、频繁 fork、或驱动异常,用 perf top -g -p <pid></pid> 看内核栈
  • id 接近 100% 但负载(load average)却很高 → 注意看有没有大量 D 状态进程(不可中断睡眠),这是磁盘卡死的典型信号,ps aux | awk '$8 ~ /D/ {print}' 可快速过滤

定位具体进程和线程的实操顺序

别一上来就 kill -9,先确认是不是真要杀。重点是快速锁定“最烫的那个点”:

  • 在 top 里按 P(大写)按 CPU 使用率降序,记下第一行的 PID
  • 再执行 top -Hp <pid></pid>,同样按 P,找线程级的“罪魁”——注意列名还是 PID,但这是线程 ID
  • 把线程 ID 转成十六进制:printf "%x\n" ,结果用于下一步堆栈匹配
  • Java 进程:直接 jstack <pid> | grep -A 10 ""</pid>,看是不是卡在 HashMap.get 或某个正则匹配上
  • C/C++/Go 等原生进程:用 perf record -p <pid> -g -- sleep 10</pid> 录 10 秒,再 perf report -g 看热点函数

perf 不可用时的替代方案

很多生产环境没装 perf,或者权限受限。这时候别硬等,有更轻量的路径:

  • 先试 strace -p <pid> -c</pid>(加 -c 是统计模式),几秒就能看到最耗时的系统调用,比如全是 epoll_wait 就可能是网络事件堆积,全是 read 就可能是日志刷太猛
  • 对 Python 进程,py-spy record -p <pid> -o profile.svg</pid>(需提前装 py-spy)比 strace 更友好,能直接看到 Python 函数级火焰图
  • 如果连 strace 都被禁用,就用 cat /proc/<pid>/stack</pid>(仅限内核支持),看当前线程在内核哪条路径上卡住,常见输出如 [<ffffffff81204b5d>] __do_page_fault+0x2ad/0x4f0</ffffffff81204b5d> 表示缺页异常频繁

真正难的不是找到高 CPU 进程,而是判断“它该不该这么高”。比如一个定时归档脚本在凌晨 2 点把 CPU 拉到 95%,只要持续时间短、不影响业务,可能根本不用动;但同一个脚本白天持续 30 分钟不退,就得查它是不是误读了错误的文件路径导致遍历全盘。这类边界情况,工具给不出答案,得结合业务节奏和历史基线来判断。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python中print函数的用法
python中print函数的用法

python中print函数的语法是“print(value1, value2, ..., sep=' ', end='\n', file=sys.stdout, flush=False)”。本专题为大家提供print相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.27

2640

5

python print用法与作用
python print用法与作用

本专题整合了python print的用法、作用、函数功能相关内容,阅读专题下面的文章了解更多详细教程。

2026.02.03

249

24

printf用法大全
printf用法大全

php中文网为大家提供printf用法大全,以及其他printf函数的相关文章、相关下载资源以及各种相关课程,供大家免费下载体验。

2023.06.20

708

5

fprintf和printf的区别
fprintf和printf的区别

fprintf和printf的区别在于输出的目标不同,printf输出到标准输出流,而fprintf输出到指定的文件流。根据需要选择合适的函数来进行输出操作。更多关于fprintf和printf的相关文章详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.28

1009

10

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.18

5287

5

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2023.08.10

2328

6

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.18

5287

5

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2023.08.10

2328

6

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

2023.08.10

3898

6

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.6万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.4万人学习