线上问题定位-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