Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Arthas 4.0计划 #536

Open
hengyunabc opened this issue Feb 20, 2019 · 22 comments
Open

Arthas 4.0计划 #536

hengyunabc opened this issue Feb 20, 2019 · 22 comments
Milestone

Comments

@hengyunabc
Copy link
Collaborator

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

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

支持加载外部的插件

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

view分层

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

欢迎大家讨论提出意见😄

@iceqing
Copy link

iceqing commented Feb 21, 2019

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

@hengyunabc
Copy link
Collaborator Author

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

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

@xindoo
Copy link

xindoo commented Feb 25, 2019

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

@hengyunabc hengyunabc added this to the 4.0.x milestone Feb 27, 2019
@hengyunabc
Copy link
Collaborator Author

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

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

@gumutianqi
Copy link

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

@chenshun00
Copy link

@hengyunabc bytekit 什么时候能推

@pan3793
Copy link

pan3793 commented Jun 29, 2019

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

  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
Copy link

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

@airfer
Copy link

airfer commented Jul 30, 2019

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

@zengzehao
Copy link

期待4.0版本

@konglz
Copy link

konglz commented Aug 14, 2019

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

@soocold
Copy link

soocold commented Oct 22, 2019

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

@kylixs
Copy link
Contributor

kylixs commented Apr 29, 2020

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

  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
Copy link

pan3793 commented Apr 29, 2020

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

  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
Copy link

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

@liangjxgo
Copy link

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

@GISwilson
Copy link

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

kylixs commented Dec 20, 2021

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

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

@GISwilson
Copy link

GISwilson commented Dec 21, 2021

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

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

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

@lpf19981004
Copy link

image

@jdxia
Copy link

jdxia commented Jan 12, 2023

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

@4fool
Copy link

4fool commented Mar 21, 2023

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

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests