由于目前无法直接监控到相关java服务的CPU占用的明细情况,导致无法直接分析问题(间接分析问题也是可以分析出来,但是效率偏低),因此通过在容器内集成arthas 诊断组件实现快速定位问题。
1 Arthas诊断工具
Arthas 是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信息等,大大提升线上问题排查效率。
官方网站提供了详细的使用说明,本章就不在赘述。
● 当服务器已经内存100%卡死状态,无法调用arthas控制台;
● 当内存已经出现OOM,arthas无法跟中挂点的JVM进程;
● 某些问题无法在不同的环境中轻松复现,甚至在重新启动后就消失了;
cd /root && java -jar arthas-boot.jar
当登录到k8s节点服务器的时候,可以控制pod
kubectl exec -it $(kubectl get pod -n pz-dev | grep activity | awk '{print $1; exit}') -n pz-dev -- /bin/sh #activity为例 cd /app && java -jar arthas-boot.jar
cd /app && java -jar arthas-boot.jar # 启动后选择对应的java进程
arthas的使用将列举常用的排查问题命令,用于快速分析CPU占用线程代码行数。
/app $ java -jar arthas-boot.jar [INFO] JAVA_HOME: /usr/lib/jvm/java-1.8-openjdk/jre [INFO] arthas-boot version: 3.7.2 [INFO] Found existing java process, please choose one and input the serial number of the process, eg : 1. Then hitENTER. * [1]: 7 /app/app.jar [2]: 141 arthas-boot.jar 1 [INFO] arthas home: /home/user/.arthas/lib/3.7.2/arthas [INFO] The target process already listen port 3658, skip attach. [INFO] arthas-client connect 127.0.0.1 3658 ,---. ,------. ,--------.,--. ,--. ,---. ,---. / O \ | .--. ''--. .--'| '--' | / O \ ' .-' | .-. || '--'.' | | | .--. || .-. |`. `-. | | | || |\ \ | | | | | || | | |.-' | `--' `--'`--' '--' `--' `--' `--'`--' `--'`-----' wiki https://arthas.aliyun.com/doc tutorials https://arthas.aliyun.com/doc/arthas-tutorials.html version 3.7.2 main_class pid 7 time 2024-04-01 18:20:45
如果只是退出当前的连接,可以用quit或者exit命令。Attach 到目标进程上的 arthas 还会继续运行,端口会保持开放,下次连接时可以直接连接上。
如果想完全退出 arthas,可以执行stop命令。
[arthas@7]$ exit
[arthas@7]$ dashboard
默认5秒刷新一次,整个JVM内部的信息尽收眼底
thread -n 5
heapdump arthas-output/dump.hprof