arthas
arthas copied to clipboard
Arthas 4.0计划
提供一个新的字节码框架,名为bytekit
- 支持两种方式:应用启动时配置为agent和动态attach
- 提供方便的annotation实现字节码的操作
- 避免重复增强
- 支持行号的字节码操作
- 支持查看局部变量
- 提供api可以实现apm功能
支持加载外部的插件
- 可以配置外部插件目录
- 使用方可以通过API编写自己的插件
view分层
- 类似spring mvc的model/view结构telnet view对应目前的命令行模式
- http view返回json格式,方便做web交互和展示
欢迎大家讨论提出意见😄
由于采用的是GPL协议,自己编写的插件,需要开源吗?
由于采用的是GPL协议,自己编写的插件,需要开源吗?
java的jar属于动态链接库的范畴,不需要开源。
arthas未来在性能调优上有什么计划吗? 我个人理解,目前arthas的主要功能还是体现在看到问题后的排查上,但发现问题的能力比较弱。
arthas未来在性能调优上有什么计划吗? 我个人理解,目前arthas的主要功能还是体现在看到问题后的排查上,但发现问题的能力比较弱。
- 性能调优是多方向的,热点方法,CPU,内存,GC等
- 纯字节码修改的方案,只能在热点方法上有作为。但是修改得越多字节码,对性能就越多影响。Arthas只能对特定的一些类做trace
- 长期来看,性能调优是一个方向,但短期没有太好的办法
非常期待基于 MVC 的 restful-api 功能,毕竟不是随时都能通过 shell 登录到服务器,如果有 restful-api,就可以开发 dashboard 来管理和查看了;
@hengyunabc bytekit
什么时候能推
我遇到了几次这样的场景:
- 某个method会偶尔触发bug, 导致cpu 100%, 由于日志的缺失, 不能确定到底是什么入参触发了method的bug;
- 因为Filter的bug, 某个(或某些)特定HTTP请求在被Dispatch到具体的业务Controller之前, 在Tomcat内部就发生了错误, 导致死循环, 同样的的因缺少日志打印, 而不能迅速定位是哪个url请求触发了bug;
如果采用Arthas的watch机制, 也就意味着不能直接从已经出错的线程栈堆栈中提取变量信息, 而必须等待下次bug触发才能获取到一些信息; 但是在已经出错的线程栈帧中, 应该是有method调用链路中一些变量信息的, 如果能够展示出来, 或许对迅速定位bug原因有极大帮助.
我没有在Arthas 3.1.1版本文档中找到类似的功能, 也可能是我对文档漏读或误读忽略了该功能.
支持查看局部变量,这个是会在4.0版本支持吗?这个功能就是能够类似于本地debug时一样,能够看到所有的局部变量是吧?
感觉上面说的很多功能,jvm-sandbox已经都实现了,比如启动的2种方式,比如可通过annotation实现字节码操作、支持行号的字节码操作等,为什么要重复再做一遍呢~
期待4.0版本
有没有可能将arthas的挂载和jvm-sandbox结合? 就像jvm-sandbox-repeater的启动方式一样。
以后会考虑对core dump文件的支持吗?最近线上机器频繁crash,但是面对core dump 文件一脸茫然
我遇到了几次这样的场景:
- 某个method会偶尔触发bug, 导致cpu 100%, 由于日志的缺失, 不能确定到底是什么入参触发了method的bug;
- 因为Filter的bug, 某个(或某些)特定HTTP请求在被Dispatch到具体的业务Controller之前, 在Tomcat内部就发生了错误, 导致死循环, 同样的的因缺少日志打印, 而不能迅速定位是哪个url请求触发了bug;
如果采用Arthas的watch机制, 也就意味着不能直接从已经出错的线程栈堆栈中提取变量信息, 而必须等待下次bug触发才能获取到一些信息; 但是在已经出错的线程栈帧中, 应该是有method调用链路中一些变量信息的, 如果能够展示出来, 或许对迅速定位bug原因有极大帮助.
我没有在Arthas 3.1.1版本文档中找到类似的功能, 也可能是我对文档漏读或误读忽略了该功能.
@pan3793 是不是要类似debug时查看线程不同栈帧的方法参数、局部变量功能?
我遇到了几次这样的场景:
- 某个method会偶尔触发bug, 导致cpu 100%, 由于日志的缺失, 不能确定到底是什么入参触发了method的bug;
- 因为Filter的bug, 某个(或某些)特定HTTP请求在被Dispatch到具体的业务Controller之前, 在Tomcat内部就发生了错误, 导致死循环, 同样的的因缺少日志打印, 而不能迅速定位是哪个url请求触发了bug;
如果采用Arthas的watch机制, 也就意味着不能直接从已经出错的线程栈堆栈中提取变量信息, 而必须等待下次bug触发才能获取到一些信息; 但是在已经出错的线程栈帧中, 应该是有method调用链路中一些变量信息的, 如果能够展示出来, 或许对迅速定位bug原因有极大帮助. 我没有在Arthas 3.1.1版本文档中找到类似的功能, 也可能是我对文档漏读或误读忽略了该功能.
@pan3793 是不是要类似debug时查看线程不同栈帧的方法参数、局部变量功能?
@kylixs 是这样的
有gc分析就好,例如 列出 大对象。有时候遇上莫名其妙的gc,不知从何分析。求解
生产环境多台机器,希望可以支持同时监控。多个应用实例的数据汇聚到一个arthas实例中输出
提一个想法看是否值得做。 目前在提升服务的QPS的优化上,或者线上服务遇到流量高峰时,容易出现YGC比较频繁的现象(注意并不是内存泄露,只是流量高的时候GC压力比较大)。 为了优化这个问题,就需要了解一段时间内服务到底加载了哪些对象,这些对象的大小情况,最好是能知道对象是被哪个线程创建的,甚至调用栈是什么。在获取这个信息后,便能针对性的优化服务的性能了。
关于实现方案,初步了解了下如下几个做法:
- JVMTI中有个SampledObjectAlloc方法,能收到对象创建后的通知,不足是只能支持JDK11以上的版本:https://docs.oracle.com/en/java/javase/11/docs/specs/jvmti.html#SampledObjectAlloc JDK8也有个接口但似乎不能达到目的:https://docs.oracle.com/javase/8/docs/platform/jvmti/jvmti.html#VMObjectAlloc
- google有一个开源库基于premain和字节码修改来达到目的,但性能较差:https://github.com/google/allocation-instrumenter/wiki
- stackoverflow中有人提到可以使用HeapTracker来实现,对c++不熟,不确定是否可以做到: stackoverflow http://hg.openjdk.java.net/jdk7/jdk7/jdk/file/9b8c96f96a0f/src/share/demo/jvmti/heapTracker/HeapTracker.java
就需要了解一段时间内服务到底加载了哪些对象,这些对象的大小情况,最好是能知道对象是被哪个线程创建的,甚至调用栈是什么
Java Yourkit Profiler 有一个Object Allocations 分析,可以收集一段时间内JVM创建的对象,支持按照调用栈汇总: https://www.yourkit.com/docs/java/help/objects_view_alloc.jsp
就需要了解一段时间内服务到底加载了哪些对象,这些对象的大小情况,最好是能知道对象是被哪个线程创建的,甚至调用栈是什么
Java Yourkit Profiler 有一个Object Allocations 分析,可以收集一段时间内JVM创建的对象,支持按照调用栈汇总: https://www.yourkit.com/docs/java/help/objects_view_alloc.jsp
感谢分享,这个工具体验了一下,功能确实比较强大,除了本地可以UI模式外,也提供了命令行和http调用的模式可以供线上服务调试使用。可能唯一的不足就是商业软件需要授权。
4.0支持了局部变量, 希望watch条件表达式那能支持 局部变量的过滤
提一个想法看是否值得做。 目前在提升服务的QPS的优化上,或者线上服务遇到流量高峰时,容易出现YGC比较频繁的现象(注意并不是内存泄露,只是流量高的时候GC压力比较大)。 为了优化这个问题,就需要了解一段时间内服务到底加载了哪些对象,这些对象的大小情况,最好是能知道对象是被哪个线程创建的,甚至调用栈是什么。在获取这个信息后,便能针对性的优化服务的性能了。
关于实现方案,初步了解了下如下几个做法:
- JVMTI中有个SampledObjectAlloc方法,能收到对象创建后的通知,不足是只能支持JDK11以上的版本:https://docs.oracle.com/en/java/javase/11/docs/specs/jvmti.html#SampledObjectAlloc JDK8也有个接口但似乎不能达到目的:https://docs.oracle.com/javase/8/docs/platform/jvmti/jvmti.html#VMObjectAlloc
- google有一个开源库基于premain和字节码修改来达到目的,但性能较差:https://github.com/google/allocation-instrumenter/wiki
- stackoverflow中有人提到可以使用HeapTracker来实现,对c++不熟,不确定是否可以做到: stackoverflow http://hg.openjdk.java.net/jdk7/jdk7/jdk/file/9b8c96f96a0f/src/share/demo/jvmti/heapTracker/HeapTracker.java
请问这个问题现在有答案了吗?