0

0

Linux CPU 飙高的排查流程

冰川箭仙

冰川箭仙

发布时间:2026-01-24 13:20:02

|

255人浏览过

|

来源于php中文网

原创

用 top -hp pid 并按 p 排序定位高 cpu 线程,将 tid 转十六进制后在 jstack 日志中搜索 runnable 栈帧,即可精准定位 java 热点代码行。

linux cpu 飙高的排查流程

top 命令怎么快速揪出“真凶”进程?

top 是第一反应工具,但默认视图容易误判:它按进程(PID)排序,而真正吃 CPU 的往往是某个线程(TID),不是整个进程。直接看 %CPU 列最高值,再按大写 P 键强制按 CPU 使用率降序——这是关键动作,否则可能被平均值蒙蔽。

  • 如果 %Cpu(s) 行中 us(user)占比超 80%,大概率是应用层问题(如 Java 死循环、Python 无限 while True
  • 如果 sy(system)高,说明频繁陷入内核,可能是锁竞争、大量 epoll_waitclone 系统调用
  • 如果 wa(iowait)明显,别急着查 CPU,先用 iostat -x 1 看磁盘是否卡住

注意:top 默认刷新间隔是 3 秒,对瞬时尖峰不敏感;可输 1 改为 1 秒刷新,避免漏掉短时爆发。

如何从进程 PID 快速定位到 Java 线程和代码行?

找到高 CPU 进程(比如 PID=12345)后,下一步必须下钻到线程级,因为 JVM 里一个 java 进程常有上百线程,真正“作恶”的往往只有一个。

  • 先用 top -Hp 12345 查看该进程所有线程,同样按 P 排序,记下最高 %CPU 对应的 TID(例如 12399)
  • 立即转十六进制:printf "%x\n" 12399 → 得到 306f(注意:Java jstack 输出里的 nid 就是这个格式,形如 nid=0x306f
  • 导出堆jstack 12345 > stack.log,然后搜索 0x306f,重点看状态为 RUNNABLE 的栈帧,通常第 1–3 行就是热点方法

常见坑:

  • 直接在 jstack 输出里搜十进制 TID(比如搜 12399)一定找不到——JVM 日志只存 hex
  • top -H 显示的 PID 列其实是 TID,Linux 内核中线程和进程共享 PID 命名空间,TID = PID,这点别混淆

strace 和 perf 怎么选?什么场景该用哪个?

straceperf 都能深挖系统行为,但目标完全不同:

Linux+PHP+MySQL案例教程
Linux+PHP+MySQL案例教程

本书以培养高级网站建设与管理人才为目标,内容循序渐进,由浅入深,通过大量的实例系统全面地介绍了Linux+PHP+MySQL环境下的网络后台开发技术。本书详尽分析了近30个典型案例。包括计数器、网站流量统计、留言板、论坛系统、聊天室、投票与调查、用户管理、新闻发布系统、广告轮播、购物系统等等,力求让读者通过对案例的学习,轻松掌握PHP和MySQL的编程精要,迅速掌握网络后台开发技巧。   本书适

下载
  • strace -p <pid></pid> 是为了确认“它到底在反复调什么系统调用”。比如看到满屏 clock_gettime(CLOCK_MONOTONIC, ...) 或高频 write(1, ...),基本锁定是日志刷屏或时间戳滥用。
  • perf top -p <pid></pid> 是为了看“CPU 时间花在哪条指令/函数上”。输出里如果 java::String::equalsPyUnicode_Compare 占比异常高,说明字符串比较逻辑有问题;如果是 memsetmemcpy 高,则可能是大对象频繁复制。

注意:

  • strace 开销极大,线上慎用;perf 相对轻量,但需确保内核开启 perf_event_paranoidcat /proc/sys/kernel/perf_event_paranoid ≤ 2)
  • perf record -p <pid> -g -- sleep 10</pid> + perf script 可生成火焰图,比 perf top 更利于发现调用链路中的隐藏瓶颈

为什么 load average 高 ≠ CPU 忙?别被数字骗了

load average(如 load average: 4.15, 3.80, 3.20)反映的是“等待 CPU 或不可中断 I/O 的任务数”,不是 CPU 使用率。

  • 在 4 核机器上,load=4.15 并不意味着 CPU 100%,它可能只是 2 个进程在等磁盘读,另 2 个在等网络响应,此时 %Cpu(s)ussy 可能都不到 30%
  • 真正危险的组合是:load 高 + wa 高 → 磁盘瓶颈;load 高 + us 高 → 应用计算瓶颈;load 高 + sy 高 + cs(context switch)超高 → 锁或调度风暴

所以,看到 load 报警,第一反应不该是杀进程,而是跑一遍:vmstat 1 5(看 csbi/bo)、pidstat -t -p <pid> 1</pid>(看线程级上下文切换)、iotop(看谁在狂写磁盘)

最易忽略的一点:容器环境里,top 显示的 PID 是宿主机视角的,而 jstackstrace 必须进容器 namespace 才能拿到真实线程栈——别在宿主机上对容器内 Java 进程直接 jstack,那会失败或返回空。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1010

2023.08.02

switch语句用法
switch语句用法

switch语句用法:1、Switch语句只能用于整数类型,枚举类型和String类型,不能用于浮点数类型和布尔类型;2、每个case语句后面必须跟着一个break语句,以防止执行其他case的代码块,没有break语句,将会继续执行下一个case的代码块;3、可以在一个case语句中匹配多个值,使用逗号分隔;4、Switch语句中的default代码块是可选的等等。

569

2023.09.21

Java switch的用法
Java switch的用法

Java中的switch语句用于根据不同的条件执行不同的代码块。想了解更多switch的相关内容,可以阅读本专题下面的文章。

441

2024.03.13

while的用法
while的用法

while的用法是“while 条件: 代码块”,条件是一个表达式,当条件为真时,执行代码块,然后再次判断条件是否为真,如果为真则继续执行代码块,直到条件为假为止。本专题为大家提供while相关的文章、下载、课程内容,供大家免费下载体验。

106

2023.09.25

printf用法大全
printf用法大全

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

76

2023.06.20

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

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

304

2023.11.28

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

760

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

221

2023.09.04

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

3

2026.03.11

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 10.5万人学习

Git 教程
Git 教程

共21课时 | 4.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号