【运维排查】服务器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看这一篇就够了,建议收藏
24098 2
|
4月前
|
消息中间件 Java Nacos
SpringCloud概述
Spring Cloud是Spring团队推出的微服务一站式解决方案,弥补了各独立组件(如Nacos、RabbitMQ等)缺乏统一架构的不足。其特点为约定优于配置、组件丰富、开箱即用,支持云原生。版本以伦敦地铁站命名,避免与子项目冲突。Spring Cloud Alibaba由阿里贡献,集成Nacos、Sentinel、Seata等成熟组件,因Netflix套件停更,现成为主流选择,功能更完整且经大规模验证,是当前微服务架构的优选技术栈。
|
监控 负载均衡 算法
CPU占用率爆表:高效诊断与解决CPU 100%问题
在系统运维和软件开发中,CPU占用率达到100%是一个常见的性能瓶颈问题。这种情况可能会导致系统响应缓慢,甚至崩溃。本文将分享如何高效诊断和解决CPU占用率过高的问题,帮助你快速定位并解决问题。
2819 5
|
缓存 运维 监控
CPU被打满/CPU 100%:高效应对策略与技术干货分享
【10月更文挑战第3天】在信息技术高速发展的今天,无论是开发人员、运维人员还是数据分析师,都可能遇到CPU被打满(即CPU使用率达到100%)的情况。这不仅会影响系统的响应速度,严重时甚至会导致服务中断。本文将从诊断、分析与解决三个方面,详细介绍处理CPU 100%问题的技术干货。
1174 3
|
Java 对象存储 开发者
如何找出Java进程占用CPU高的元凶
本文记录了一次Java进程CPU占用率过高的问题和排查思路。
|
Java
Java面试题之cpu占用率100%,进行定位和解决
这篇文章介绍了如何定位和解决Java服务中CPU占用率过高的问题,包括使用top命令找到高CPU占用的进程和线程,以及使用jstack工具获取堆栈信息来确定问题代码位置的步骤。
1566 0
Java面试题之cpu占用率100%,进行定位和解决
|
缓存 监控 负载均衡
CPU占用率爆表:高效诊断与解决策略
面对CPU占用率飙升至100%的情况,系统管理员和开发人员需要迅速采取行动以避免性能瓶颈和系统崩溃。本文将提供一系列诊断和解决CPU占用过高问题的实用方法。
1550 4
|
安全 Java API
时间日期API(Date,SimpleDateFormat,Calendar)+java8新增日期API (LocalTime,LocalDate,LocalDateTime)
这篇文章介绍了Java中处理日期和时间的API,包括旧的日期API(Date、SimpleDateFormat、Calendar)和Java 8引入的新日期API(LocalTime、LocalDate、LocalDateTime)。文章详细解释了这些类/接口的方法和用途,并通过代码示例展示了如何使用它们。此外,还讨论了新旧API的区别,新API的不可变性和线程安全性,以及它们提供的操作日期时间的灵活性和简洁性。
|
Linux Shell
linux 查看某个文件夹属于哪个盘
在 Linux 系统中,要查看某个文件夹属于哪个磁盘分区,你可以使用多种方法。以下是几种常见的方法: 方法一:使用 df 命令 df 命令用于显示文件系统的磁盘空间使用情况。 打开终端。 使用以下命令查看文件夹所属的磁盘分区: bash df -h /path/to/your/folder 其中 /path/to/your/folder 是你要查询的文件夹路径。 示例: bash df -h /home/user/Documents 输出将类似于: Filesystem Size Used Avail Use% Mounted on /dev/sda1
2926 1
|
运维 监控 安全
在Linux中,如何进行故障排查?
在Linux中,如何进行故障排查?