Cpu飚高show-busy-java-threads一件脚本排查与Arthas线上诊断工具排查实战

spring boot 模拟飚高代码

@Service
public class TestWhile
{
    /* 操作内存对象 */
    ConcurrentHashMap map = new ConcurrentHashMap();
    private void whileTrue(String threadName) {
        // 不设置退出条件,死循环
        while (true) {
            // 在死循环中不断的对map执行put操作,导致内存gc
            for (int i = 0; i <= 100000; i++) {
                map.put(Thread.currentThread().getName() + i, i);
            } // end for
        }// end while
    }
    @PostConstruct
    public void testWhile() {
        // 循环size,创建多线程,并发执行死循环
        for (int i = 0; i < 20; i++) {
            int finalI = i;
            // 新建并启动线程,调用whileTrue方法
            new Thread(() -> {
                whileTrue("李文-" + finalI);
            }).start();
        }
    }
}

top

使用  淘宝开源  show-busy-java-threads  快速排查

  1. 介绍:

    1. 作者 :淘宝 李鼎(哲良) oldratlee
    2. 用于快速排查Java的CPU性能问题(top us值过高),自动查出运行的Java进程中消耗CPU多的线程,并打印出其线程栈,从而确定导致性能问题的方法调用。
    3. Git地址:https://github.com/oldratlee/useful-scripts

执行:  curl -sLk ‘https://raw.github.com/oldratlee/useful-scripts/release-2.x/bin/show-busy-java-threads‘ | bash -s -- -a 2.log

输出到 2.log 文件。

结果:GC引起的CPU 飚高, 【5】 引起GC的线程与执行代码方法。 可以定位到 whileTrue 方法有问题。

使用 淘宝开源 Arthas 排查问题

  1. 介绍: Arthas 是Alibaba开源的Java诊断工具 ,业界最强。
  2. GIT地址 : https://github.com/alibaba/arthas/blob/master/README_CN.md
  3. 不光是CPU线程问题排查,几乎可以包括所有问题的排查,在线反编译,动态热更新运行中的代码,在线请求链路跟踪等等功能。
curl -O https://alibaba.github.io/arthas/arthas-boot.jar
java -jar arthas-boot.jar

选择需要排查的那个进程

1  + Enter

执行 dashboard  命令

初步可以判断为GC引发的CPU飚高

执行  thread -n 3 -i 5000  查看CPU使用率Top N线程的栈

结果: GC引起的CPU 飚高, 可以定位到线程运行链接方法 whileTrue  有问题。

推荐在服务出现问题, 执行以下  c  curl -sLk ‘https://raw.github.com/oldratlee/useful-scripts/release-2.x/bin/show-busy-java-threads‘ | bash -s -- -a 2.log    然后在重启,这样重启后也会有写问题记录

原文地址:https://www.cnblogs.com/atliwen/p/12106503.html

时间: 2024-08-09 13:25:56

Cpu飚高show-busy-java-threads一件脚本排查与Arthas线上诊断工具排查实战的相关文章

CPU飚高问题排查基本步骤

CPU 飚高 一般是死循环或者死锁问题导致. 1. 通过 top  命令找到 CPU 消耗最高的进程,并记住进程 ID {pid}.top -M -n 2 -d 3 >{pid}/top.txt 查看top 2. 再次通过 top -Hp  {pid} 找到 CPU 消耗最高的线程 ID,并记住线程 ID(十进制). 3.通过 JDK 提供的 jstack 工具 dump 线程堆栈信息到指定文件中.jstack {pid} >{pid}/jstack_1.txt 一次堆栈快照 备用 jstac

线上应用故障排查之二:高内存占用

搞Java开发的,经常会碰到下面两种异常: 1.java.lang.OutOfMemoryError: PermGen space 2.java.lang.OutOfMemoryError: Java heap space 要详细解释这两种异常,需要简单重提下Java内存模型. Java内存模型是描述Java程序中各变量(实例域.静态域和数组元素)之间的关系,以及在实际计算机系统中将变量存储到内存和从内存取出变量这样的低层细节. 在Java虚拟机中,内存分为三个代:新生代(New).老生代(Ol

线上应用故障排查之二:高内存占用(转)

搞Java开发的,经常会碰到下面两种异常: 1.java.lang.OutOfMemoryError: PermGen space 2.java.lang.OutOfMemoryError: Java heap space 要详细解释这两种异常,需要简单重提下Java内存模型. (友情提示:本博文章转载,出处:hankchen,http://www.blogjava.net/hankchen) Java内存模型是描述Java程序中各变量(实例域.静态域和数组元素)之间的关系,以及在实际计算机系统

Java线上应用故障排查之一:高CPU占用

一个应用占用CPU很高,除了确实是计算密集型应用之外,通常原因都是出现了死循环. (友情提示:本博文章欢迎转载,但请注明出处:hankchen,http://www.blogjava.net/hankchen) 以我们最近出现的一个实际故障为例,介绍怎么定位和解决这类问题. 根据top命令,发现PID为28555的Java进程占用CPU高达200%,出现故障. 通过ps aux | grep PID命令,可以进一步确定是tomcat进程出现了问题.但是,怎么定位到具体线程或者代码呢? 首先显示线

线上应用故障排查之一:高CPU占用

一个应用占用CPU很高,除了确实是计算密集型应用之外,通常原因都是出现了死循环. 以我们最近出现的一个实际故障为例,介绍怎么定位和解决这类问题. 根据top命令,发现PID为28555的Java进程占用CPU高达200%,出现故障. 通过ps aux | grep PID命令,可以进一步确定是tomcat进程出现了问题.但是,怎么定位到具体线程或者代码呢? 首先显示线程列表: ps -mp pid -o THREAD,tid,time 找到了耗时最高的线程28802,占用CPU时间快两个小时了!

java线上服务问题排查

1.业务日志相关 如果系统出现异常或者业务有异常,首先想到的都是查看业务日志 查看日志工具: less 或者more grep tail -f filename 查看实时的最新内容 ps:切忌vim直接打开大日志文件,因为会直接加载到内存的 2.数据库相关 java应用很多瓶颈在数据库,一条sql没写好导致慢查询,可能就会带来应用带来致命危害. 如果出现Could not get JDBC Connection .接口响应慢.线程打满等, 需要登录线上库, 查看数据库连接情况:show proc

MongoDB出现CPU飚高,如何强制停止正在执行的操作

如果发出了一个执行耗时很长的任务给MongoDB服务器,客户端强制终止会导致任务依然在服务器端执行. 这时MongoDB提供了查询和管理正在执行任务的方式. // db.currentOp() 获得当前的所有`in progressing`的操作,包括insert/query/update/remove/getmore/command等 > db.currentOp(true) 返回的数据结构如下: { "inprog" : [ { "opid" : 3434

JVM 线上故障排查基本操作--CPU飙高

JVM 线上故障排查基本操作 CPU 飚高 线上 CPU 飚高问题大家应该都遇到过,那么如何定位问题呢? 思路:首先找到 CPU 飚高的那个 Java 进程,因为你的服务器会有多个 JVM 进程.然后找到那个进程中的 “问题线程”,最后根据线程堆栈信息找到问题代码.最后对代码进行排查. 如何操作呢? 通过 top 命令找到 CPU 消耗最高的进程,并记住进程 ID. 再次通过 top -Hp [进程 ID] 找到 CPU 消耗最高的线程 ID,并记住线程 ID. 通过 JDK 提供的 jstac

Java 开发必须掌握的线上问题排查命令

作为一个合格的开发人员,不仅要能写得一手还代码,还有一项很重要的技能就是排查问题.这里提到的排查问题不仅仅是在coding的过程中debug等,还包括的就是线上问题的排查.由于在生产环境中,一般没办法debug(其实有些问题,debug也白扯...),所以我们需要借助一些常用命令来查看运行时的具体情况,这些运行时信息包括但不限于运行日志.异常堆栈.堆使用情况.GC情况.JVM参数情况.线程情况等. 给一个系统定位问题的时候,知识.经验是关键,数据是依据,工具是运用知识处理数据的手段.为了便于我们