线上问题定位-Java版

每当项目在测试环境跑的时候正常,一旦上线生产,就各种问题出现。jvm问题导致tps降低 ,响应慢。cpu飙高,服务高峰期频繁挂起

其中需要考虑到的方向有很多

1、环境的差异,传统模式下的部署方式大都基于vm,出现环境的差异是不可避免的,如今的技术先进了很多,docker容器化足以支持环境的差异问题,不过这个也是一个比较优先的方案。

因此环境的差异化也是影响代码的要素之一

2、业务访问量差异,一般在测试环境访问量也就公司内部的测试人员在测试,生产上线则是测试环境的N倍数,使用了不恰当的代码,之前偶然协助一个同事定位线上问题的异常,一直定位不到是什么情况出现假死,后来仔细核查,是因为使用了不合理的线程代码,在大量并发的情况下才会出现假死。也是程序猿头疼的因素之一。

处理以上的方案可以从几个维度触发

1、利用分析工具找出性能瓶颈

2、代码内部实现层优化

3、架构层优化

这次的定位主要从分析工具定位,代码层跟架构层的优化需要因地制宜会比较好。

我们当时使用的是继承工具Jstack

A。jstack排查

1.查找进程 top

2.top -Hp 获取占用最高CPU的线程id

3. printf %x 线程id 转为十六进制

4. jstack -F <pid> | grep -a5 线程id(十六进制)

注: 存在账号权限限制

B。使用jmap排查

jmap排查 (需要下载 memory analysis 工具分析)

1、jmap -dump:format=b,file=文件名.bin [pid]

2、启动脚本:-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/equity/$1.bin

注:

1.存在账号权限限制

2.dump存在导致整个服务挂起导致服务不正常的风险

3、dump的文件比较大,存在占用一定的硬盘空间

后来,发现阿里出了一个神器阿尔萨斯arthas 极大的降低了运维排查的繁琐操作

C。arthas排查 

1、快速开始 使用arthas-boot(推荐) 下载arthas-boot.jar,然后用java -jar的方式启动: wget https://alibaba.github.io/arthas/arthas-boot.jar java -jar arthas-boot.jar

命令:

a.Dashboard

b.thread -n 3 查看cpu最高的线程

c.jad javax.servlet.Servlet 反编译

d.Trace com.demo.Test doGet 查看慢的跟踪

e. ....

参考文献:https://github.com/alibaba/arthas/blob/master/README_CN.md

原文地址:https://www.cnblogs.com/jimw/p/10455261.html