【运维排查】服务器CPU飙升100%?别慌,教你3步精准定位“罪魁祸首”

简介: 当服务器CPU飙高时,别急着重启!本文教你四步精准排查:用`top`定位高占用进程,`top -Hp`找出耗CPU线程,`printf`转十六进制,再通过`jstack`结合线程ID定位到具体代码行。快速锁定死循环、频繁GC或复杂计算等问题根源,成为团队中的故障排查高手。

前言

“滴滴滴...” 手机突然收到阿里云云监控的报警短信:“您的ECS实例 CPU使用率已超过 90%”

此时,你的服务可能响应缓慢,甚至直接502。面对这种情况,很多新手的反应是直接重启服务器。虽然重启能暂时解决问题,但找不到根因,问题迟早会卷土重来。

今天,我将分享一套**“教科书级”**的CPU飙高排查思路,只需几行命令,就能精准定位到是哪一行代码搞崩了服务器。

第一步:全局定位——找到耗资源的进程 (PID)

首先,我们需要知道是哪个程序(进程)占用了CPU。

  1. 在终端输入 top 命令。
  2. 进入界面后,按下大写 P 键,系统会按照 CPU使用率 对进程进行降序排列。

Bash

top - 14:28:32 up 10 days,  3:14,  2 users,  load average: 2.10, 1.05, 0.56
Tasks: 102 total,   1 running, 101 sleeping,   0 stopped,   0 zombie
%Cpu(s): 98.5 us,  1.2 sy,  0.0 ni,  0.3 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
PID    USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
12345  root      20   0   2.5g   500m   10m S  99.0 20.5   10:15.20 java

分析:如上图所示,PID为 12345java 进程CPU占用率高达 99.0%,它就是我们要找的目标。

第二步:深度挖掘——找到耗资源的线程 (TID)

一个进程往往包含多个线程,我们需要知道具体是哪个线程在“作恶”。

使用命令 top -Hp <PID>,其中 <PID> 替换为上一步找到的进程ID。

Bash

# 查看进程 12345 下的所有线程
top -Hp 12345

进入界面后,同样按下 P 键排序:

Bash

PID    USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND
12368  root      20   0   2.5g   500m   10m R 95.5  0.0   05:10.20 java
12369  root      20   0   2.5g   500m   10m S  1.2  0.0   00:05.10 java

分析:我们发现 PID(在线程视图中其实是 Thread ID)为 12368 的线程占用了绝大部分CPU。

第三步:进制转换——准备定位代码

Linux中的线程ID是十进制的(如 12368),而在Java堆栈日志中,线程ID通常是以十六进制(Hex)显示的。我们需要进行一次转换。

可以使用 printf 命令:

Bash

# 将 12368 转换为十六进制
printf "%x\n" 12368

输出:3050

记下这个十六进制数字:0x3050

第四步:真相大白——定位具体代码行数

现在我们有了进程ID(12345)和十六进制的线程ID(0x3050),就可以使用 Java 自带的 jstack 工具来导出堆栈信息,并抓取“案发现场”。

Bash

# 打印堆栈信息,并使用 grep 查找 0x3050,显示匹配行的后 20 行
jstack 12345 | grep "0x3050" -A 20

输出示例:

"Thread-5" #25 prio=5 os_prio=0 tid=0x00007f8... nid=0x3050 runnable [0x00007f8...]
   java.lang.Thread.State: RUNNABLE
    at com.example.demo.controller.TestController.loop(TestController.java:28)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    ...

终极分析:仔细看输出日志的 at com.example.demo.controller.TestController.loop(TestController.java:28)。 真相只有一个:TestController.java 文件的第 28 行

通常这里可能存在:

  1. 死循环: 代码逻辑错误导致 while(true) 且没有退出条件。
  2. 频繁GC: 如果看到是 GC task thread 占用高,说明内存泄露导致了频繁的 Full GC。
  3. 复杂计算: 大量的数学运算或加密解密操作。

总结

以后遇到 CPU 100% 的情况,不要慌,按照这个套路走:

  1. top → 找 进程ID (PID)
  2. top -Hp PID → 找 线程ID (TID)
  3. printf "%x\n" TID → 转 十六进制 (Hex)
  4. jstack PID | grep Hex -A 20 → 找 问题代码

掌握这个排查链路,你就是团队里那个能“秒级定位问题”的专家!

相关文章
|
SQL 关系型数据库 数据库
学习分布式事务Seata看这一篇就够了,建议收藏
学习分布式事务Seata看这一篇就够了,建议收藏
25505 2
|
6月前
|
微服务 监控
认识Seata
Seata是阿里巴巴开源的分布式事务解决方案,通过事务协调者(TC)、事务管理器(TM)和资源管理器(RM)协同工作,实现全局事务一致性。支持XA、AT、TCC、SAGA四种模式,其中AT为默认模式,具备最终一致性与低侵入性,广泛应用于微服务架构中。
认识Seata
|
监控 负载均衡 算法
CPU占用率爆表:高效诊断与解决CPU 100%问题
在系统运维和软件开发中,CPU占用率达到100%是一个常见的性能瓶颈问题。这种情况可能会导致系统响应缓慢,甚至崩溃。本文将分享如何高效诊断和解决CPU占用率过高的问题,帮助你快速定位并解决问题。
3057 5
|
9月前
|
Arthas 运维 监控
一次线上CPU飙高排查实录:从Arthas到JVM调优的深入之旅
本文记录了一次线上Java应用CPU使用率异常升高的故障排查过程。通过使用阿里巴巴开源工具Arthas,快速定位到问题根源:日志切面中存在性能缺陷的正则表达式在处理超长字符串时引发“回溯爆炸”,导致CPU资源耗尽。文中详细介绍了排查步骤、问题分析及解决方案,包括利用Arthas进行实时监控、线程分析、方法监控和在线热更新修复。最后总结了排查经验与技术启示,强调工具掌握、性能意识与防御式编程的重要性。
1362 0
|
11月前
|
运维 安全 算法
服务器 CPU 占用忽高忽低?排查这 6 个隐藏进程,90% 的异常都能解决
服务器运维中,CPU占用忽高忽低常由隐藏进程引发,影响服务稳定性。本文介绍六大需排查的隐藏进程:异常编译、挖矿程序、内存泄漏、网络请求异常、日志轮转问题及恶意软件。通过排查工具如top、ps、netstat等定位问题进程,并提供针对性解决方法,帮助开发者快速稳定服务器性能。
2932 0
|
11月前
|
应用服务中间件 Linux Docker
开源项目管理软件 Codes 安装手册及安装问题 FAQ
之前官网根本没安装手册,因为都是一键0配置安装,根本不用看手册;这帖子主要是,后半部常见问题 FAQ. 没上智能问答的原因,如你打客服电话,非常讨厌前面一堆选项,你直接想转人工。且有问题的是极少数,7000多家企业,不到100家,有问题而已
|
Java 对象存储 开发者
如何找出Java进程占用CPU高的元凶
本文记录了一次Java进程CPU占用率过高的问题和排查思路。
|
监控 安全 算法
在Linux中,cpu使用率过高可能是什么原因引起的?排查思路是什么?
在Linux中,cpu使用率过高可能是什么原因引起的?排查思路是什么?
|
缓存 监控 负载均衡
CPU占用率爆表:高效诊断与解决策略
面对CPU占用率飙升至100%的情况,系统管理员和开发人员需要迅速采取行动以避免性能瓶颈和系统崩溃。本文将提供一系列诊断和解决CPU占用过高问题的实用方法。
1664 4
|
Java
Java面试题之cpu占用率100%,进行定位和解决
这篇文章介绍了如何定位和解决Java服务中CPU占用率过高的问题,包括使用top命令找到高CPU占用的进程和线程,以及使用jstack工具获取堆栈信息来确定问题代码位置的步骤。
1894 0
Java面试题之cpu占用率100%,进行定位和解决

热门文章

最新文章