【线上问题排查】CPU100%和内存100%排查

简介: 【线上问题排查】CPU100%和内存100%排查

CPU和内存的排查思路是一样的。

问题模拟代码

先写一段模拟代码,模拟CPU和内存100%的过程

public class PressureTest implements Runnable{
        @Override
        public void run() {
            while (true) {
            }
        }
}
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import java.util.LinkedList;
import java.util.List;
/**
 * <p color="orange">
 * 线上问题排查
 * </p>
 *
 * @author BookSea
 * @version 1.0
 * @since 2022/3/27 12:56
 */
@RestController
public class ProblemController {
    /**
     * <p color='orange'>
     * 模拟CPU飙高异常
     * 其中num是计算机的逻辑处理器个数
     * </p>
     *
     * @since 2022/3/27 12:58
     */
    @GetMapping("/cpu/{id}")
    public void cpu(@PathVariable("id") Integer num) {
        System.out.println("----CPU100%---");
        System.out.println("启动" + num + "个线程");
        Thread[] threads = new Thread[num];
        for (int i = 0; i < num; i++) {
            threads[i] = new Thread(new PressureTest());
            threads[i].start();
        }
    }
}

打包部署到服务器。并使用nohup java -jar &运行。

问题复现

这是没请求之前整个系统的状态

系统正常,shift+p可以按照CPU排序,shift+m可以按照内存排序

先请求下接口

curl http://localhost:8080/cpu/8

此时再看下系统的状态

top -c

可以看到CPU使用率100%直接被打满了。

找到CPU使用率最高的进程 16253,使用

top -Hp 16253

查看进程里面的线程使用情况。

可以看到使用率最高的是8个线程,因为我们请求的时候一共请求了8个线程

线程id分别是:16405~16412

先使用

jstack -l 16253 > ./16253.tdump

导出线程的快照情况。

Dump文件解读

首先,先对我们dump的文件进行一个解读

首先第一行显示的是dump的时间,第二行是虚拟机的一些信息,接着就是线程的list,包括每个线程的tid。

这里参考了一张其他博主的图:转载地址

做几点补充:

  1. 如果出现daemon说明是守护线程。
  2. prio 和 os_prio分别是线程jvm优先级,线程操作系统优先级。
  3. tid是jvm线程id,jvm内部线程的唯一标识(可以通过java.lang.Thread.getId()获取)
  1. nid是对应系统线程id(NativeThread ID),和top命令查看的线程pid对应,不过一个是10进制,一个是16进制。
  2. 线程状态是我们要重点关注的,有如下状态:

    推荐一篇文章:学会查看jstack Dump 日志

问题排查

用计算器把线程id转为16进制。

进行查找

发现线程id 16405~16412 都在PressureTest.java:17这个位置

定位到代码

我们知道发生了死循环的问题。

工具推荐

自己查看快照信息的话比较不方便,网上有专门分析的平台。

这里推荐3个分析网站,这3个是同一家公司的。

线程Dump分析:http://fastthread.io/

GC日志分析:https://gceasy.io/

Heap Dump分析:https://heaphero.io/

直接上传快照文件就可以,效果是这样的。

目录
相关文章
|
1月前
|
缓存 人工智能 算法
不同业务怎么选服务器?CPU / 内存 / 带宽配置表
本文详解了服务器三大核心配置——CPU、内存、带宽,帮助读者快速理解服务器性能原理。结合不同业务场景,如个人博客、电商、数据库、直播等,提供配置选择建议,并强调合理搭配的重要性,避免资源浪费或瓶颈限制。内容实用,适合初学者和业务选型参考。
369 0
|
1月前
|
存储 消息中间件 缓存
从纳秒到毫秒的“时空之旅”:CPU是如何看待内存与硬盘的?
在数据爆炸的时代,如何高效存储与管理海量数据成为系统设计的核心挑战。本文从计算机存储体系结构出发,解析B+树、LSM树与Kafka日志结构在不同数据库中的应用与优化策略,帮助你深入理解高性能存储背后的原理。
75 0
|
3月前
|
存储
阿里云轻量应用服务器收费标准价格表:200Mbps带宽、CPU内存及存储配置详解
阿里云香港轻量应用服务器,200Mbps带宽,免备案,支持多IP及国际线路,月租25元起,年付享8.5折优惠,适用于网站、应用等多种场景。
987 0
|
2月前
|
弹性计算 前端开发 NoSQL
2025最新阿里云服务器配置选择攻略:CPU、内存、带宽与系统盘全解析
本文详解2025年阿里云服务器ECS配置选择策略,涵盖CPU、内存、带宽与系统盘推荐,助你根据业务需求精准选型,提升性能与性价比。
|
3月前
|
存储 弹性计算 固态存储
阿里云服务器配置费用整理,支持一万人CPU内存、公网带宽和存储IO性能全解析
要支撑1万人在线流量,需选择阿里云企业级ECS服务器,如通用型g系列、高主频型hf系列或通用算力型u1实例,配置如16核64G及以上,搭配高带宽与SSD/ESSD云盘,费用约数千元每月。
283 0
|
4月前
|
缓存 监控 Java
说一说 SpringCloud Gateway 堆外内存溢出排查
我是小假 期待与你的下一次相遇 ~
598 5
|
5月前
|
数据可视化 Linux iOS开发
Python测量CPU和内存使用率
这些示例帮助您了解如何在Python中测量CPU和内存使用率。根据需要,可以进一步完善这些示例,例如可视化结果或限制程序在特定范围内的资源占用。
218 22
|
7月前
|
存储 设计模式 监控
如何快速定位并优化CPU 与 JVM 内存性能瓶颈?
如何快速定位并优化CPU 与 JVM 内存性能瓶颈?
184 0
如何快速定位并优化CPU 与 JVM 内存性能瓶颈?

热门文章

最新文章