https://github.com/alibaba/arthas
https://arthas.aliyun.com/doc/
curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar
-帮助信息:
java -jar arthas-boot.jar -h
-使用 aliyun 的镜像:
java -jar arthas-boot.jar --repo-mirror aliyun --use-http
---Docker
-在Docker里使用 JDK 的方式
-公开的 JDK 镜像
FROM openjdk:8-jdk
FROM openjdk:8-jdk-alpine
# Install OpenJDK-8
RUN apt-get update && \
apt-get install -y openjdk-8-jdk && \
apt-get install -y ant && \
apt-get clean;
# Fix certificate issues
RUN apt-get update && \
apt-get install ca-certificates-java && \
apt-get clean && \
update-ca-certificates -f;
# Setup JAVA_HOME -- useful for docker commandline
ENV JAVA_HOME /usr/lib/jvm/java-8-openjdk-amd64/
RUN export JAVA_HOME
RUN yum install -y \
java-1.8.0-openjdk \
java-1.8.0-openjdk-devel
ENV JAVA_HOME /usr/lib/jvm/java-1.8.0-openjdk/
RUN export JAVA_HOME
-把 Arthas 安装到基础镜像里
-可以很简单把 Arthas 安装到你的 Docker 镜像里。
FROM openjdk:8-jdk-alpine
# copy arthas
COPY --from=hengyunabc/arthas:latest /opt/arthas /opt/arthas
-启动math-game
docker run --name math-game -it hengyunabc/arthas:latest /bin/sh -c "java -jar /opt/arthas/math-game.jar"
-启动arthas-boot来进行诊断
docker exec -it math-game /bin/sh -c "java -jar /opt/arthas/arthas-boot.jar"
* [1]: 9 jar
[INFO] arthas home: /opt/arthas
[INFO] Try to attach process 9
[INFO] Attach process 9 success.
[INFO] arthas-client connect 127.0.0.1 3658
,---. ,------. ,--------.,--. ,--. ,---. ,---.
/ O \ | .--. ''--. .--'| '--' | / O \ ' .-'
| .-. || '--'.' | | | .--. || .-. |`. `-.
| | | || |\ \ | | | | | || | | |.-' |
`--' `--'`--' '--' `--' `--' `--'`--' `--'`-----'
wiki: https://arthas.aliyun.com/doc
version: 3.0.5
pid: 9
time: 2018-12-18 11:30:36
-诊断 Docker 里的 Java 进程
docker exec -it ${containerId} /bin/bash -c "wget https://arthas.aliyun.com/arthas-boot.jar && java -jar arthas-boot.jar"-诊断 k8s 里容器里的 Java 进程
kubectl exec -it ${pod} --container ${containerId} -- /bin/bash -c "wget https://arthas.aliyun.com/arthas-boot.jar && java -jar arthas-boot.jar"---Arthas Properties
-arthas.properties文件在 arthas 的目录下。
-如果是自动下载的 arthas,则目录在~/.arthas/lib/3.x.x/arthas/下面
-如果是下载的完整包,在 arthas 解压目录下
-如果配置 arthas.telnetPort为 -1 ,则不 listen telnet 端口。arthas.httpPort类似。
-如果配置 arthas.telnetPort为 0 ,则随机 telnet 端口,在~/logs/arthas/arthas.log里可以找到具体端口日志。arthas.httpPort类似。
-如果是防止一个机器上启动多个 arthas 端口冲突。可以配置为随机端口,或者配置为 -1,并且通过 tunnel server 来使用 arthas。
#arthas.config.overrideAll=true
arthas.telnetPort=3658
arthas.httpPort=8563
arthas.ip=127.0.0.1
# seconds
arthas.sessionTimeout=1800
#arthas.appName=demoapp
#arthas.tunnelServer=ws://127.0.0.1:7777/ws
#arthas.agentId=mmmmmmyiddddd
---以 Java Agent 的方式启动
默认的配置项在解压目录里的arthas.properties文件里。
java -javaagent:/tmp/test/arthas-agent.jar -jar math-game.jar
---当前系统的实时数据面板,按 ctrl+c 退出
dashboard
---一目了然的了解系统的状态,哪些线程比较占cpu?他们到底在做什么?
thread -n 3
---观察方法执行的时候哪个子调用比较慢
Trace
---通过浏览器连接 arthas
-Arthas 目前支持 Web Console,用户在 attach 成功之后,可以直接访问:
http://127.0.0.1:8563/
---想从远程连接,则可以使用 --target-ip参数指定 listen 的 IP
http://127.0.0.1:8563/
---支持向上回滚的行数是 1000
http://127.0.0.1:8563/?scrollback=3000
---前言
作为一名资深后端开发,你在生产环境一定会碰到这样的场景:
产品:线上这个页面加载比较慢,前端同学说是接口响应比较慢,你能帮忙优化下吗?
后端:不应该啊,测试环境很丝滑啊。
产品:要不你自己操作试下?
经过实操,线上环境果然一直转圈圈,然后你转眼看上那座山,看着那些拉几屏栈帧还没结束的函数,各种方法调用,嵌套,然后你那充满智慧的小脑袋瓜立马想到从日志上看出端倪,但是那少的可怜的日志反手给了你泼了一盆冷水。
方法调用链路繁杂,调用耗时在日志中缺失,目前能想到的最好的办法就是拉分支→加上耗时→上线→找到耗时最久的代码→拉分支→优化代码→上线。相信这是很多同学的处理方式,这个过程虽然思路清晰,但是很繁琐。
那如果有这样一个工具,只需简单的命令,就能在线给你列出所有调用链路耗时,那爽不爽,丝滑不丝滑,那我们就一起来了解下这个颠覆问题排查方式的工具,它就是Arthas。
---Arthas能做什么
无需修改代码在线监测代码耗时。
无需修改代码在线抓取方法入参出参。
在线反编译字节码文件。
生成火焰图查找引起FULLGC的大对象。
以及其他你能想到或想不到的功能,快来一起发掘吧……