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

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

目录
相关文章
|
25天前
|
存储 缓存 监控
Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
本文介绍了Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
64 7
|
22天前
|
开发框架 .NET PHP
网站应用项目如何选择阿里云服务器实例规格+内存+CPU+带宽+操作系统等配置
对于使用阿里云服务器的搭建网站的用户来说,面对众多可选的实例规格和配置选项,我们应该如何做出最佳选择,以最大化业务效益并控制成本,成为大家比较关注的问题,如果实例、内存、CPU、带宽等配置选择不合适,可能会影响到自己业务在云服务器上的计算性能及后期运营状况,本文将详细解析企业在搭建网站应用项目时选购阿里云服务器应考虑的一些因素,以供参考。
|
1月前
|
弹性计算 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:
226 1
|
1月前
|
存储 关系型数据库 MySQL
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
824 2
|
3月前
|
存储 关系型数据库 MySQL
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
213 5
|
2月前
|
运维 JavaScript Linux
容器内的Nodejs应用如何获取宿主机的基础信息-系统、内存、cpu、启动时间,以及一个df -h的坑
本文介绍了如何在Docker容器内的Node.js应用中获取宿主机的基础信息,包括系统信息、内存使用情况、磁盘空间和启动时间等。核心思路是将宿主机的根目录挂载到容器,但需注意权限和安全问题。文章还提到了使用`df -P`替代`df -h`以获得一致性输出,避免解析错误。
|
3月前
|
监控 Java Linux
redisson内存泄漏问题排查
【9月更文挑战第22天】在排查 Redisson 内存泄漏问题时,首先需确认内存泄漏的存在,使用专业工具(如 JProfiler)分析内存使用情况,检查对象实例数量及引用关系。其次,检查 Redisson 使用方式,确保正确释放资源、避免长时间持有引用、检查订阅和监听器。此外,还需检查应用程序其他部分是否存在内存泄漏源或循环引用等问题,并考虑更新 Redisson 到最新版本以修复潜在问题。
132 5
|
2月前
|
C# 开发工具 Windows
C# 获取Windows系统信息以及CPU、内存和磁盘使用情况
C# 获取Windows系统信息以及CPU、内存和磁盘使用情况
72 0
|
3月前
|
Prometheus Kubernetes 监控
使用kubectl快速查看各个节点的CPU和内存占用量
在Kubernetes集群中,安装metrics-server,并使用kubectl快速查看集群中各个节点的资源使用情况。
269 0
|
4月前
|
存储 监控 Docker
如何限制docker使用的cpu,内存,存储
如何限制docker使用的cpu,内存,存储