【线上问题排查】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月前
|
JSON Java Serverless
nacos常见问题之cpu和内存占用高如何解决
Nacos是阿里云开源的服务发现和配置管理平台,用于构建动态微服务应用架构;本汇总针对Nacos在实际应用中用户常遇到的问题进行了归纳和解答,旨在帮助开发者和运维人员高效解决使用Nacos时的各类疑难杂症。
184 0
|
1月前
|
监控 Java 索引
cpu使用率过高和jvm old占用过高排查过程
cpu使用率过高和jvm old占用过高排查过程
37 2
|
2月前
|
弹性计算
2024阿里云幻兽帕鲁/Palworld服务器价格表(CPU/内存/带宽/磁盘收费标准)
2024年阿里云幻兽帕鲁专用服务器的价格根据不同的配置有所不同。 • 4核16G配置的价格为32元/月,如果选择购买3个月,则价格为96元。 • 8核32G配置的价格为90元/月,如果选择购买3个月,则价格为271元。 另外,还有配置为4核16G10M带宽的服务器,其价格为26元/月起。而8核32G10M带宽的价格也是90元/月。
96 1
|
6天前
|
机器学习/深度学习 缓存 监控
linux查看CPU、内存、网络、磁盘IO命令
`Linux`系统中,使用`top`命令查看CPU状态,要查看CPU详细信息,可利用`cat /proc/cpuinfo`相关命令。`free`命令用于查看内存使用情况。网络相关命令包括`ifconfig`(查看网卡状态)、`ifdown/ifup`(禁用/启用网卡)、`netstat`(列出网络连接,如`-tuln`组合)以及`nslookup`、`ping`、`telnet`、`traceroute`等。磁盘IO方面,`iostat`(如`-k -p ALL`)显示磁盘IO统计,`iotop`(如`-o -d 1`)则用于查看磁盘IO瓶颈。
|
28天前
|
缓存 Java C#
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍(一)
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍
79 0
|
1天前
|
Linux
Linux rsyslog占用内存CPU过高解决办法
该文档描述了`rsyslog`占用内存过高的问题及其解决方案。
16 4
|
26天前
|
存储 缓存 PHP
阿里云服务器实例、CPU内存、带宽、操作系统选择参考
对于使用阿里云服务器的用户来说,云服务器的选择和使用非常重要,如果实例、内存、CPU、带宽等配置选择错误,可能会影响到自己业务在云服务器上的计算性能及后期运营状况,本文为大家介绍一下阿里云服务器实例、CPU内存、带宽、操作系统的选择注意事项,以供参考。
阿里云服务器实例、CPU内存、带宽、操作系统选择参考
|
29天前
|
监控 网络协议 NoSQL
java线上排查OOM内存溢出
java线上排查OOM内存溢出
23 0
|
1月前
|
弹性计算 固态存储 Linux
2024年阿里云服务器租用详细价格表(CPU/内存/带宽/系统盘)
2024阿里云服务器租用优惠价格表,轻量服务器2核2G3M带宽轻量服务器一年61元,2核4G4M带宽轻量服务器一年165元12个月,ECS云服务器e系列2核2G配置、3M固定带宽、40G ESSD Entry云盘,99元一年、2核4G服务器30元3个月、2核4G配置365元一年、2核8G配置522元一年,云服务器u1、云服务器c7、g7和r7优惠价格表,CPU内存带宽系统盘配置详细报价:
818 3
|
1月前
|
弹性计算 固态存储 调度
阿里云服务器部署配置选择全攻略,ECS实例规格、CPU内存配置
阿里云服务器部署配置选择全攻略,ECS实例规格、CPU内存配置,CPU内存、公网带宽和系统盘怎么选择?个人用户选择轻量应用服务器或ECS通用算力型u1云服务器,企业用户选择ECS计算型c7、通用型g7云服务器,阿里云百科分享阿里云服务器配置选择方法

热门文章

最新文章