推荐一个生产环境问题排查利器( 五 )


[c:] ClassLoader的hashcode[p:] 外部的.class文件的完整路径,支持多个例如:redefine -p /tmp/Test.class(17)monitor方法执行监控
对匹配 class-pattern/method-pattern的类、方法的调用进行监控 。
monitor 命令是一个非实时返回命令.
实时返回命令是输入之后立即返回,而非实时返回的命令,则是不断的等待目标 Java 进程返回信息,直到用户输入 Ctrl+C 为止 。
服务端是以任务的形式在后台跑任务,植入的代码随着任务的中止而不会被执行,所以任务关闭后,不会对原有性能产生太大影响,而且原则上,任何Arthas命令不会引起原有业务逻辑的改变 。
监控维度:
timestamp 时间戳class Java类method 方法(构造方法、普通方法)total 调用次数success 成功次数fail 失败次数rt 平均RTfail-rate 失败率参数:
class-pattern 类名表达式匹配method-pattern 方法名表达式匹配[E] 开启正则表达式匹配,默认为通配符匹配[c:] 统计周期,默认值为120秒例如:
$ monitor -c 5 com.alibaba.sample.petstore.web.store.module.screen.ItemList execute(18)tt方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测
watch 虽然很方便和灵活,但需要提前想清楚观察表达式的拼写,这对排查问题而言要求太高,因为很多时候我们并不清楚问题出自于何方,只能靠蛛丝马迹进行猜测 。
这个时候如果能记录下当时方法调用的所有入参和返回值、抛出的异常会对整个问题的思考与判断非常有帮助 。
于是乎,TimeTunnel 命令就诞生了 。

  • 命令参数解析
    • -t
tt 命令有很多个主参数,-t 就是其中之一 。这个参数的表明希望记录下类 *Test 的 print 方法的每次执行情况 。
  • -n 3
当你执行一个调用量不高的方法时可能你还能有足够的时间用 CTRL+C 中断 tt 命令记录的过程,但如果遇到调用量非常大的方法,瞬间就能将你的 JVM 内存撑爆 。
此时你可以通过 -n 参数指定你需要记录的次数,当达到记录次数时 Arthas 会主动中断tt命令的记录过程,避免人工操作无法停止的情况 。
INDEX 时间片段记录编号,每一个编号代表着一次调用,后续tt还有很多命令都是基于此编号指定记录操作,非常重要 。TIMESTAMP 方法执行的本机时间,记录了这个时间片段所发生的本机时间COST(ms) 方法执行的耗时IS-RET 方法是否以正常返回的形式结束IS-EXP 方法是否以抛异常的形式结束OBJECT 执行对象的hashCode(),注意,曾经有人误认为是对象在JVM中的内存地址,但很遗憾他不是 。但他能帮助你简单的标记当前执行方法的类实体CLASS 执行的类名METHOD 执行的方法名(19)options全局开关
名称默认值描述unsafefalse是否支持对系统级别的类进行增强,打开该开关可能导致把JVM搞挂,请慎重选择!dumpfalse是否支持被增强了的类dump到外部文件中,如果打开开关,class文件会被dump到/${Application dir}/arthas-class-dump/目录下,具体位置详见控制台输出batch-re-transformtrue是否支持批量对匹配到的类执行retransform操作json-formatfalse是否支持json化的输出disable-sub-classfalse是否禁用子类匹配,默认在匹配目标类的时候会默认匹配到其子类,如果想精确匹配,可以关闭此开关debug-for-asmfalse打印ASM相关的调试信息save-resultfalse是否打开执行结果存日志功能,打开之后所有命令的运行结果都将保存到/home/admin/logs/arthas/arthas.log中job-timeout1d异步后台任务的默认超时时间,超过这个时间,任务自动停止;比如设置 1d, 2h, 3m, 25s,分别代表天、小时、分、秒
例如,想打开执行结果存日志功能,输入如下命令即可:
$ options save-result true      



推荐阅读