问题标签 [async-profiler]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 使用 async-profiler 和 perf 测量 DirectByteBuffer
我正在使用 async-profiler 和 perf 并决定测量DirectByteBuffer
磁盘 IO 的内核活动。这是代码(用 Scala 编写,但它的 Java 版本应该很明显):
我多次运行此代码并同时执行perf
并async-profiler
注意到以下结果:
异步探查器
/li>性能
sudo perf record -F 31499 -g -p <pid> -- sleep 30
在我所做的所有跑步中,我注意到copy_user_enhanced_fast_string
百分比在perf
和async-profiler
61.02%
vs 中是不同的77.65%
问题:为什么和copy_user_enhanced_fast_string
采样?我试图提供相同的条件(频率和采样周期,并且我没有同时运行这两个分析器。31499 Hz ≈ 28169 纳秒)。perf
async-profiler
还是我对结果的解释是错误的?
maven - 将 artifactId 传递给 surefire argLine
我正在尝试将async-profiler与 maven 一起使用,遗憾的是它不跟踪分叉进程,而且我的测试需要分叉提供的隔离才能正确运行。
为了运行 async-profiler,我需要使用以下参数运行 java:
我正在考虑使用surefire的argLine
,但profile.svg
每次都会删除。我正在考虑使用该项目的artifactId
do 参数化它,但我没有找到任何参考。
如何获取argLine
现场测试项目的artifactId?
提前谢谢。
intellij-idea - 如何为 Intellij Async Profiler 启用挂钟分析?
我想测量我的应用程序在数据库中花费了多少时间。
我已经将 CPU Profiler 添加到 Intellij 的 Settings / Build / Java Profiler 中,但默认情况下它会显示 CPU 周期最多的代码,这对我来说毫无用处,因为 JDBC 驱动程序在收到响应时基本上处于休眠状态。
听起来像挂钟分析是要走的路,但我不知道如何在 Intellij 的 CPU Profiler 配置窗口中启用它。自述文件说-e wall
,而 Intellij 的代理选项看起来完全不同:threads,interval=1ms,framebuf=15000000
. 请问如何配置 Intellij 的 Async Profiler 以使用挂钟?
java - 通过 socketRead0 分配字符串 TLAB
环境:
- Linux 4.x
- 异步分析器 1.6 ( https://github.com/jvm-profiling-tools/async-profiler )
- OpenJDK8
应用代码:
通过 SocketInputStream 进行域套接字通信
行动:
使用异步分析器运行应用程序:-d 60 -e alloc -f /tmp/alloc.svg
问题:
来自 SocketInputStream#socketRead0 的意外字符串分配
(青色:TLAB 分配)
socketRead 和 socketRead0 的 JDK 代码
本机 Socket-Impl:
- jdk/src/solaris/native/java/net/SocketInputStream.c
假设:
字符串可能是通过 JNI 在下面的代码中某处在 java 堆中分配的,因为在字符串分配旁边的 StackTrace 中有一个 SocketTimeoutException
我搜索了 C 代码并没有找到任何 jString 分配,因此我有点想法。
有人知道字符串分配可能发生在哪里吗?
java - 随着时间的推移探索基于 Java 的 Web 应用程序性能下降的策略
我正在开发企业 Java 应用程序,其中已经有很多工具/框架,例如 Struts、JAX-RS 和 Spring MVC。它包含捆绑在 .war 文件中的 UI 和 REST 端点。该项目正在发展,我们正在摆脱旧工具,努力坚持只使用 Spring MVC/Webflux。
应用程序正在对数百万条 XML/JSON 记录执行搜索,最近搜索引擎已从 Marklogic 切换到 Elasticsearch。
我们注意到的是,在使用量不高的生产环境中(在 2-4 个应用程序节点上高达 1.7k rpm),某些端点上的响应时间会随着时间的推移而增加。Elasticsearch 有增长的空间,并且没有显示出任何巨大负载的迹象。因此,当平均响应时间超过3 秒而不是常规的200-300毫秒时,目前我们必须在一两周内重新启动/更换一次产品实例。
我尝试使用async-profiler获取 CPU 和堆火焰图,但负载配置文件在每次测量时都会发生变化,因为我们有很多可用的功能,所以我无法真正比较图表如何随时间变化。
你能告诉我一些在代码中找到合适位置的策略/方法吗?
jvm - 是否可以同时对 alloc 和 itimer 使用 async-profiler
在使用 async-profiler 时,我分别运行 cpu 和 alloc 的配置文件,但希望可以将它们用作相同持续时间的一部分?鉴于支持的输出格式类型,这似乎只有在使用 JFR 时才有意义。
java - 异步探查器显示错误的堆栈跟踪
我正在尝试使用异步分析器v.1.8.1 来分析我的应用程序。
JVM 是 openjdk 版本“15-ea”2020-09-15,但同样发生在 openjdk 14.0.1 上。
异步分析器使用以下标志运行:-d 60 -t -i 10000 -o svg
它显示了极其奇怪的结果。我们可以看到硬件线程大部分时间不是在 java.lang.Thread::run 中,而是在一些奇怪的地方。怎么解释?我看到了一个可能的解释,即异步探查器无法正确遍历堆栈跟踪并将这些堆栈跟踪的一部分放在错误的位置。还有其他解释吗?如何修复?
java - Zing 上的异步分析器开销
我们的团队正在使用 HdrHistograms 监控我们的应用程序的延迟。当我将异步分析器附加到它时,所有百分位数都会急剧增加。
操作系统:Red Hat Enterprise Linux 8.1 版(Ootpa)
JVM:11.0.8-zing_20.08.2.0-b2-product-linux-X86_64
如果我使用标志 -i 1000 -t 附加探查器会发生这种情况:
如果我使用标志 -i 100000 -t 附加探查器会发生这种情况:
降低采样频率显然会降低开销,但仍然很大。我有两个问题:
- 除了降低采样频率之外,还有其他方法可以减少分析开销吗?也许有一些神奇的内核/JVM标志?
- 这种开销是否会严重扭曲配置文件本身?
谢谢
jvm - 如何减少线程达到安全点所花费的时间 - 同步状态
关于问题:
在 VM 中的大量 IO 期间,由于停止线程需要更多时间,我们面临 JVM 暂停/缓慢。查看安全点日志时,它显示同步状态花费的时间最多。
我们还尝试在超时延迟 (-XX:+SafepointTimeout -XX:SafepointTimeoutDelay=200) 上打印安全点跟踪,以了解哪些线程导致了此问题,但似乎没有任何可疑之处。此外,在为安全点设置超时时,当花费的时间处于“同步”状态时,我们不会检测到超时打印。
关于此安全点跟踪的问题:
- 安全点超时如何工作?
- 记录线程详细信息后,安全点是否存在并且所有线程都恢复了?
- 是否会执行该 VM 操作。如果 vmop 是 GC 会发生什么。
使用 Async-profiler:
尝试使用 async-profiler 进行时间到安全点分析,并注意到 VM 线程在 SafepointSynchronize::begin() 方法上花费了更多时间,而 C2 编译器线程与 VM 线程花费的时间几乎相同。
我们怀疑 C2 编译器可能需要时间才能达到安全点。有人可以帮助我们解决这个问题并解释这个安全点时间火焰图吗?提前致谢。