【线上问题排查】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/

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

目录
相关文章
|
8天前
|
弹性计算 Kubernetes Perl
k8s 设置pod 的cpu 和内存
在 Kubernetes (k8s) 中,设置 Pod 的 CPU 和内存资源限制和请求是非常重要的,因为这有助于确保集群资源的合理分配和有效利用。你可以通过定义 Pod 的 `resources` 字段来设置这些限制。 以下是一个示例 YAML 文件,展示了如何为一个 Pod 设置 CPU 和内存资源请求(requests)和限制(limits): ```yaml apiVersion: v1 kind: Pod metadata: name: example-pod spec: containers: - name: example-container image:
|
17天前
|
存储 关系型数据库 MySQL
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
191 2
|
2月前
|
存储 关系型数据库 MySQL
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
128 5
|
28天前
|
运维 JavaScript Linux
容器内的Nodejs应用如何获取宿主机的基础信息-系统、内存、cpu、启动时间,以及一个df -h的坑
本文介绍了如何在Docker容器内的Node.js应用中获取宿主机的基础信息,包括系统信息、内存使用情况、磁盘空间和启动时间等。核心思路是将宿主机的根目录挂载到容器,但需注意权限和安全问题。文章还提到了使用`df -P`替代`df -h`以获得一致性输出,避免解析错误。
|
2月前
|
监控 Java Linux
redisson内存泄漏问题排查
【9月更文挑战第22天】在排查 Redisson 内存泄漏问题时,首先需确认内存泄漏的存在,使用专业工具(如 JProfiler)分析内存使用情况,检查对象实例数量及引用关系。其次,检查 Redisson 使用方式,确保正确释放资源、避免长时间持有引用、检查订阅和监听器。此外,还需检查应用程序其他部分是否存在内存泄漏源或循环引用等问题,并考虑更新 Redisson 到最新版本以修复潜在问题。
|
3月前
|
小程序 JavaScript Java
【Java】服务CPU占用率100%,教你用jstack排查定位
本文详细讲解如何使用jstack排查定位CPU高占用问题。首先介绍jstack的基本概念:它是诊断Java应用程序线程问题的工具,能生成线程堆栈快照,帮助找出程序中的瓶颈。接着,文章通过具体步骤演示如何使用`top`命令找到高CPU占用的Java进程及线程,再结合`jstack`命令获取堆栈信息并进行分析,最终定位问题代码。
291 1
【Java】服务CPU占用率100%,教你用jstack排查定位
|
1月前
|
C# 开发工具 Windows
C# 获取Windows系统信息以及CPU、内存和磁盘使用情况
C# 获取Windows系统信息以及CPU、内存和磁盘使用情况
41 0
|
2月前
|
Prometheus Kubernetes 监控
使用kubectl快速查看各个节点的CPU和内存占用量
在Kubernetes集群中,安装metrics-server,并使用kubectl快速查看集群中各个节点的资源使用情况。
127 0
|
3月前
|
存储 监控 Docker
如何限制docker使用的cpu,内存,存储
如何限制docker使用的cpu,内存,存储
|
3月前
|
消息中间件 Java 调度
一次线上服务CPU100%的排查过程
文章记录了一次线上服务CPU使用率达到100%的排查过程,通过使用top命令和jstack工具确定了导致高CPU使用的线程,并分析了Disruptor组件的不当配置是问题原因,通过修改组件的策略成功解决了问题。
73 0