alibaba / arthas

Alibaba Java Diagnostic Tool Arthas/Alibaba Java诊断利器Arthas
https://arthas.aliyun.com/
Apache License 2.0
35.58k stars 7.48k forks source link

Arthas 4.0计划 #536

Open hengyunabc opened 5 years ago

hengyunabc commented 5 years ago

提供一个新的字节码框架,名为bytekit

支持加载外部的插件

view分层

欢迎大家讨论提出意见😄

iceqing commented 5 years ago

由于采用的是GPL协议,自己编写的插件,需要开源吗?

hengyunabc commented 5 years ago

由于采用的是GPL协议,自己编写的插件,需要开源吗?

java的jar属于动态链接库的范畴,不需要开源。

xindoo commented 5 years ago

arthas未来在性能调优上有什么计划吗? 我个人理解,目前arthas的主要功能还是体现在看到问题后的排查上,但发现问题的能力比较弱。

hengyunabc commented 5 years ago

arthas未来在性能调优上有什么计划吗? 我个人理解,目前arthas的主要功能还是体现在看到问题后的排查上,但发现问题的能力比较弱。

gumutianqi commented 5 years ago

非常期待基于 MVC 的 restful-api 功能,毕竟不是随时都能通过 shell 登录到服务器,如果有 restful-api,就可以开发 dashboard 来管理和查看了;

chenshun00 commented 5 years ago

@hengyunabc bytekit 什么时候能推

pan3793 commented 5 years ago

我遇到了几次这样的场景:

  1. 某个method会偶尔触发bug, 导致cpu 100%, 由于日志的缺失, 不能确定到底是什么入参触发了method的bug;
  2. 因为Filter的bug, 某个(或某些)特定HTTP请求在被Dispatch到具体的业务Controller之前, 在Tomcat内部就发生了错误, 导致死循环, 同样的的因缺少日志打印, 而不能迅速定位是哪个url请求触发了bug;

如果采用Arthas的watch机制, 也就意味着不能直接从已经出错的线程栈堆栈中提取变量信息, 而必须等待下次bug触发才能获取到一些信息; 但是在已经出错的线程栈帧中, 应该是有method调用链路中一些变量信息的, 如果能够展示出来, 或许对迅速定位bug原因有极大帮助.

我没有在Arthas 3.1.1版本文档中找到类似的功能, 也可能是我对文档漏读或误读忽略了该功能.

yang2yang commented 5 years ago

支持查看局部变量,这个是会在4.0版本支持吗?这个功能就是能够类似于本地debug时一样,能够看到所有的局部变量是吧?

airfer commented 5 years ago

感觉上面说的很多功能,jvm-sandbox已经都实现了,比如启动的2种方式,比如可通过annotation实现字节码操作、支持行号的字节码操作等,为什么要重复再做一遍呢~

zengzehao commented 5 years ago

期待4.0版本

konglz commented 5 years ago

有没有可能将arthas的挂载和jvm-sandbox结合? 就像jvm-sandbox-repeater的启动方式一样。

soocold commented 5 years ago

以后会考虑对core dump文件的支持吗?最近线上机器频繁crash,但是面对core dump 文件一脸茫然

kylixs commented 4 years ago

我遇到了几次这样的场景:

  1. 某个method会偶尔触发bug, 导致cpu 100%, 由于日志的缺失, 不能确定到底是什么入参触发了method的bug;
  2. 因为Filter的bug, 某个(或某些)特定HTTP请求在被Dispatch到具体的业务Controller之前, 在Tomcat内部就发生了错误, 导致死循环, 同样的的因缺少日志打印, 而不能迅速定位是哪个url请求触发了bug;

如果采用Arthas的watch机制, 也就意味着不能直接从已经出错的线程栈堆栈中提取变量信息, 而必须等待下次bug触发才能获取到一些信息; 但是在已经出错的线程栈帧中, 应该是有method调用链路中一些变量信息的, 如果能够展示出来, 或许对迅速定位bug原因有极大帮助.

我没有在Arthas 3.1.1版本文档中找到类似的功能, 也可能是我对文档漏读或误读忽略了该功能.

@pan3793 是不是要类似debug时查看线程不同栈帧的方法参数、局部变量功能?

pan3793 commented 4 years ago

我遇到了几次这样的场景:

  1. 某个method会偶尔触发bug, 导致cpu 100%, 由于日志的缺失, 不能确定到底是什么入参触发了method的bug;
  2. 因为Filter的bug, 某个(或某些)特定HTTP请求在被Dispatch到具体的业务Controller之前, 在Tomcat内部就发生了错误, 导致死循环, 同样的的因缺少日志打印, 而不能迅速定位是哪个url请求触发了bug;

如果采用Arthas的watch机制, 也就意味着不能直接从已经出错的线程栈堆栈中提取变量信息, 而必须等待下次bug触发才能获取到一些信息; 但是在已经出错的线程栈帧中, 应该是有method调用链路中一些变量信息的, 如果能够展示出来, 或许对迅速定位bug原因有极大帮助. 我没有在Arthas 3.1.1版本文档中找到类似的功能, 也可能是我对文档漏读或误读忽略了该功能.

@pan3793 是不是要类似debug时查看线程不同栈帧的方法参数、局部变量功能?

@kylixs 是这样的

smallwenzi commented 4 years ago

有gc分析就好,例如 列出 大对象。有时候遇上莫名其妙的gc,不知从何分析。求解

liangjxgo commented 3 years ago

生产环境多台机器,希望可以支持同时监控。多个应用实例的数据汇聚到一个arthas实例中输出

GISwilson commented 2 years ago

提一个想法看是否值得做。 目前在提升服务的QPS的优化上,或者线上服务遇到流量高峰时,容易出现YGC比较频繁的现象(注意并不是内存泄露,只是流量高的时候GC压力比较大)。 为了优化这个问题,就需要了解一段时间内服务到底加载了哪些对象,这些对象的大小情况,最好是能知道对象是被哪个线程创建的,甚至调用栈是什么。在获取这个信息后,便能针对性的优化服务的性能了。

关于实现方案,初步了解了下如下几个做法:

  1. 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
  2. google有一个开源库基于premain和字节码修改来达到目的,但性能较差:https://github.com/google/allocation-instrumenter/wiki
  3. stackoverflow中有人提到可以使用HeapTracker来实现,对c++不熟,不确定是否可以做到: stackoverflow http://hg.openjdk.java.net/jdk7/jdk7/jdk/file/9b8c96f96a0f/src/share/demo/jvmti/heapTracker/HeapTracker.java
kylixs commented 2 years ago

就需要了解一段时间内服务到底加载了哪些对象,这些对象的大小情况,最好是能知道对象是被哪个线程创建的,甚至调用栈是什么

Java Yourkit Profiler 有一个Object Allocations 分析,可以收集一段时间内JVM创建的对象,支持按照调用栈汇总: https://www.yourkit.com/docs/java/help/objects_view_alloc.jsp

GISwilson commented 2 years ago

就需要了解一段时间内服务到底加载了哪些对象,这些对象的大小情况,最好是能知道对象是被哪个线程创建的,甚至调用栈是什么

Java Yourkit Profiler 有一个Object Allocations 分析,可以收集一段时间内JVM创建的对象,支持按照调用栈汇总: https://www.yourkit.com/docs/java/help/objects_view_alloc.jsp

感谢分享,这个工具体验了一下,功能确实比较强大,除了本地可以UI模式外,也提供了命令行和http调用的模式可以供线上服务调试使用。可能唯一的不足就是商业软件需要授权。

lpf19981004 commented 2 years ago

image

jdxia commented 1 year ago

4.0支持了局部变量, 希望watch条件表达式那能支持 局部变量的过滤

4fool commented 1 year ago

提一个想法看是否值得做。 目前在提升服务的QPS的优化上,或者线上服务遇到流量高峰时,容易出现YGC比较频繁的现象(注意并不是内存泄露,只是流量高的时候GC压力比较大)。 为了优化这个问题,就需要了解一段时间内服务到底加载了哪些对象,这些对象的大小情况,最好是能知道对象是被哪个线程创建的,甚至调用栈是什么。在获取这个信息后,便能针对性的优化服务的性能了。

关于实现方案,初步了解了下如下几个做法:

  1. 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
  2. google有一个开源库基于premain和字节码修改来达到目的,但性能较差:https://github.com/google/allocation-instrumenter/wiki
  3. stackoverflow中有人提到可以使用HeapTracker来实现,对c++不熟,不确定是否可以做到: stackoverflow http://hg.openjdk.java.net/jdk7/jdk7/jdk/file/9b8c96f96a0f/src/share/demo/jvmti/heapTracker/HeapTracker.java

请问这个问题现在有答案了吗?