gpt4 book ai didi

java - JMX:CPU + Blocked + Wait time = Wall time?

转载 作者:行者123 更新时间:2023-11-29 05:41:39 25 4
gpt4 key购买 nike

我正在尝试使用 JMX 来测量方法调用花费了多长时间以及其中有多少是 CPU 时间、线程被阻塞了多少以及等待了多少。理想情况下,我希望 CPU 时间 + 阻塞时间 + 等待时间 = Wall time,但我注意到情况并非如此 - 而且它不仅仅是稍微不准确的计时器。例如:

Wall time:  5657.305 ms
CPU time: 4060.000 ms (71.77%)
User time: 3840.000 ms (67.88%)
Block time: 0.000 ms (0.00%)
Wait time: 0.000 ms (0.00%)

所以,问题是……我的假设这些时间的总和(不是用户时间,包括在 CPU 时间中)应该给墙时间错误吗? 我错过了什么吗?

更多细节:

  • Wall time:System.currentTimeMillis()在方法入口和导出的差异

  • CPU时间:ManagementFactory.getThreadMXBean().getCurrentThreadCpuTime()在方法入口和导出的区别

  • block 和等待时间:类似于 CPU,使用 ManagementFactory.getThreadMXBean().getThreadInfo(Thread.currentThread().getId()).getBlockedTime()getWaitedTime ()

  • 是的,我知道这些方法以不同的单位 (ns/ms) 返回时间,我考虑到了这一点。

  • 该应用程序是高度超线程的(4000 多个线程),但我存储了每个线程的所有信息,因此来自不同线程的调用之间不应该有任何干扰。

最佳答案

CPU 时间告诉您线程使用 CPU 的时间,即实际执行代码的时间。如果线程已被挂起,则阻塞或等待时间会增加,例如等待 I/O 或进入监视器。

但是,将 CPU 时间分配给线程和进程取决于 JVM 和操作系统。如有必要,他们可以随时选择挂起一个线程或进程并恢复另一个线程或进程。所以线程可能处于既没有阻塞也没有等待而只是没有执行的状态。这将增加挂起时间,但不会增加阻塞/等待时间。

CPU 时间值来自操作系统。我检查了 OpenJDK 7 for Linux 系统,所以它在其他平台上可能会有所不同。 fast_thread_cpu_time()slow_thread_cpu_time()被调用以计算线程的 CPU 时间。这两个函数都位于 hotspot/src/os/linux/vm/os_linux.cpp 中OpenJDK 7 源代码。

OpenJDK uses pthreads on Linux ,每个 Java 线程都实现为轻量级 OS 线程。现代内核调用支持的快速方法 pthread_getcpuclockid检索 clock_id对于特定线程,然后调用 clock_gettime检索线程的 CPU 时间。 slow 方法将从 /proc/self/task/<tid>/stat 中查找 CPU 时间值.这两种方法都会告诉您线程在用户和系统/内核空间中消耗 CPU 的时间。

引用资料:

关于java - JMX:CPU + Blocked + Wait time = Wall time?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17320062/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com