0. 场景及需求
我们线上5台solr读服务器,配置一样,但是相同的请求,其中一台响应时间明显比其他4台慢,我们想通过arthas来定位具体哪里执行慢。
1. arthas介绍
阿里开源的java调试工具,能解决如下的问题:
- 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
- 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
- 是否有一个全局视角来查看系统的运行状况?
- 有什么办法可以监控到JVM的实时运行状态?
从我们实际使用经验来说,可以解决两个常见的问题:
- 性能慢时,可以定位是具体哪个方法慢。
- cpu高时,很方便的定位到那个线程高。
2. 先说坑
我们分别在2台测试环境和1台线上环境测试arthas,发现在2台测试环境中出现如下两个问题:
- 166测试环境,安装提示成功,但是一直无法启动,通过源码我们发现安装并没成功,但是提示成功。
- 151测试环境,使用trace监控方法请求流程耗时时,出现java(tomcat)进程没有响应和被杀死两种无法接受情况。
建议: 上述2问题,在线上生产环境没遇到,但是不建议在线上正常运行环境中使用arthas;但线上java程序遇到重大问题,可以考虑使用arthas快速定位问题,但是前提是能接受我们遇到的两个坑。
3. 重点用法介绍
# 安装
curl -L https://alibaba.github.io/arthas/install.sh | sh
# 如果没法正常安装,提示SSL connect error,执行:yum -y update nss,更新nss
# 打开
./as.sh
# 如果java进程使用非root账户启动,如solr用户启动,则使用如下启动脚本
sudo -u solr -EH ./as.sh
# 查看cpu占用高的3个线程 类似top -H,但是能看到堆栈信息
thread -n 3