arthas icon indicating copy to clipboard operation
arthas copied to clipboard

Arthas 4.0计划

Open hengyunabc opened this issue 5 years ago • 20 comments

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

  • 支持两种方式:应用启动时配置为agent和动态attach
  • 提供方便的annotation实现字节码的操作
  • 避免重复增强
  • 支持行号的字节码操作
  • 支持查看局部变量
  • 提供api可以实现apm功能

支持加载外部的插件

  • 可以配置外部插件目录
  • 使用方可以通过API编写自己的插件

view分层

  • 类似spring mvc的model/view结构telnet view对应目前的命令行模式
  • http view返回json格式,方便做web交互和展示

欢迎大家讨论提出意见😄

hengyunabc avatar Feb 20 '19 06:02 hengyunabc

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

iceqing avatar Feb 21 '19 10:02 iceqing

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

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

hengyunabc avatar Feb 21 '19 11:02 hengyunabc

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

xindoo avatar Feb 25 '19 11:02 xindoo

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

  • 性能调优是多方向的,热点方法,CPU,内存,GC等
  • 纯字节码修改的方案,只能在热点方法上有作为。但是修改得越多字节码,对性能就越多影响。Arthas只能对特定的一些类做trace
  • 长期来看,性能调优是一个方向,但短期没有太好的办法

hengyunabc avatar Feb 27 '19 03:02 hengyunabc

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

gumutianqi avatar Mar 29 '19 07:03 gumutianqi

@hengyunabc bytekit 什么时候能推

chenshun00 avatar May 25 '19 05:05 chenshun00

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

  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 avatar Jun 29 '19 15:06 pan3793

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

yang2yang avatar Jul 30 '19 03:07 yang2yang

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

airfer avatar Jul 30 '19 08:07 airfer

期待4.0版本

zengzehao avatar Aug 01 '19 04:08 zengzehao

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

konglz avatar Aug 14 '19 02:08 konglz

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

soocold avatar Oct 22 '19 12:10 soocold

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

  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 avatar Apr 29 '20 03:04 kylixs

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

  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 是这样的

pan3793 avatar Apr 29 '20 05:04 pan3793

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

smallwenzi avatar Sep 10 '20 01:09 smallwenzi

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

liangjxgo avatar Apr 25 '21 09:04 liangjxgo

提一个想法看是否值得做。 目前在提升服务的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

GISwilson avatar Dec 14 '21 09:12 GISwilson

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

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

kylixs avatar Dec 20 '21 04:12 kylixs

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

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

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

GISwilson avatar Dec 21 '21 03:12 GISwilson

image

lpf19981004 avatar Feb 25 '22 06:02 lpf19981004

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

jdxia avatar Jan 12 '23 08:01 jdxia

提一个想法看是否值得做。 目前在提升服务的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

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

4fool avatar Mar 21 '23 13:03 4fool