arthas 实战笔记

638 阅读3分钟

1、arthas 用法示例(1):

github.com/alibaba/art… 通过 Arthas Trace 命令将接口性能优化十倍

从中学习了 trace+tt 的用法

(1)其中 trace 可以参看某个方法的耗时

todo: 可以将耗时信息 多循环执行几层,这样可以一下分析出 某个方法中具体哪个方法是耗时最长的


(2)tt 可以参看某个方法 输入、输出,也可以直接重复执行某次请求

2、arthas 用法示例2:

github.com/alibaba/art…   arthas 定位 多线程WeakHashMap引起的死循环cpu跑满问题 

从中学到了 thread 跟 sc 的用法。

(1)其中 thread 可以查看线程状态。

thead -n 3    

可以查看前3名消耗 cpu 的线程
thread --state TIMED_WAITING 可以查看某个状态的线程,然后 执行 thread 17 (17 为具体的线程 id) 来查看这个线程的详细堆栈

(2)sc 可以查看某个特定的类信息,以及其字段信息。也可以用来排查当前类来自哪个 jar, 用于解决 jar 冲突问题。
sc -d xxxx  其中 xxx 为具体的类

比如: sc -d com.ushareit.gaia.offline_pkg.controller.ApiController

sc -d xxx -f 可以查看类的field

3、“举报”阿里巴巴 Arthas,大幅降低 OOM Trouble shooting 门槛

juejin.cn/post/684490…

4、在线修改日志级别:

arthas.aliyun.com/doc/logger.…

logger -c 2a139a55 --name ROOT --level debug
其中 2a139a55 为 classLoader 的 hash

可以通过 sc -d com.shareit.gaia.cicd.controller.TestController 来获取

—name 是 Logger 的 name.

比如 如下 logger 中的 root . 具体可以通过 logger 来查看 name 一栏。

<Loggers>


    <Root level="info" additivity="false">

        <AppenderRef ref="Console"/>

        <AppenderRef ref="CommonError"/>

        <AppenderRef ref="Async"/>

    </Root>
</Loggers>

注意:

除了 logger 的级别改了,必须 logger 的 appender 也支持对应级别才行。比如想打印 debug 日志,

需要 root 下的 Console, CommonError,Async 三个 appender 支持 debug 级别才行。如果 appender 都不支持,则也不能打印日志。

还有一种解决方案:


appender 只是一个输出管道,不要在 appender 中设置级别,而是通过 logger 整体控制。或者将 appender 的级别调低一些,logger 对象级别稍微高一些,这样 logger 可以通过 arthas 调高或者调低了。

这儿也有一个日志不生效 的案例: <https://github.com/alibaba/arthas/issues/1470>

5、 热更新代码

icode.best/i/800873359…

从中学习一下 jad / mc/redefine/retransform 命令

# 反编译$ jad --source-only com.example.demo.arthas.user.UserController > /tmp/UserController.java

# 修改文件$ vim /tmp/UserController.java

# 查找加载的 ClassLoader$ $ sc -d *UserController | grep classLoaderHash classLoaderHash   

6bc28484

# 编译$ mc -c 6bc28484 /tmp/UserController.java -d /tmp

# 热更新$ redefine /tmp/com/example/demo/arthas/user/UserController.class

redefine success, size: 1

# 热更新使用 retransform 也可以

retransform /tmp/com/example/demo/arthas/user/UserController.class

6、watch 查看某个请求参数的请求

github.com/alibaba/art…

7、stack 的使用案例

github.com/alibaba/art…

stack 可以看方法的 调用路径(查看过程中可以根据OGNL 条件表达式 ,或者 执行时间 查询)比如 :

stack demo.MathGame primeFactors 'params[0]<0' -n 2

或者

stack demo.MathGame primeFactors '#cost>5’

8 调用 复杂链路分析

github.com/alibaba/art…

arthas + jprofiler 

8、【需要细化】线上问题的排查案例:

blog.csdn.net/qq_43692950…

9、【需要细化】线上问题的排查案例2:

mp.weixin.qq.com/s?__biz=MzI…

10、arthas 的8个问题

jishuin.proginn.com/p/763bfbd6d…

11、arthas 查看某个类的静态属性

-c 是指定的类加载器的 hash. 可以通过 sc -d 来获取。

ognl -c 35f983a6 '@com.shareit.gaia.cicd.controller.build.BuildCallbackController@JENKINS_USER'

arthas 可以直接调用类静态属性、类静态方法、也可以读取类中不同类型的值

<https://blog.csdn.net/u010634066/article/details/101013479>  具体的使用案例

<https://github.com/alibaba/arthas/issues/569>  这儿还有一个使用案例。