为什么延迟堆栈跟踪中没有平均值?
Why is there no average in latency stack traces?
当我使用 Java Mission Control 打开 .jfr 文件(Java 飞行记录)时,我可以找到 'Stack Trace'、'Longest' 和 'Count'在线程 -> 延迟 -> 延迟堆栈跟踪选项卡中。我关心的是平均值,而不是最长的。
Java 延迟选项卡中有平均值,但它包含与事件类型相关的所有延迟。其中一些对我来说毫无意义,例如:
sun.misc.Unsafe.park(boolean, long)
295,569,155,245 436,427
java.util.concurrent.locks.LockSupport.park(Object)
295,569,155,245 344,030
java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await()
295,569,155,245 263,418
java.util.concurrent.LinkedBlockingQueue.take()
63,773,776,315 257,531
java.util.concurrent.ThreadPoolExecutor.getTask()
63,773,776,315 257,511
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor$Worker)
63,773,776,315 257,511
java.util.concurrent.ThreadPoolExecutor$Worker.run()
63,773,776,315 257,511
java.lang.Thread.run()
63,773,776,315 257,511
以上是线程池的空闲时间,在等待下一个任务。这个和所有其他混合的堆栈跟踪的平均值是没有意义的。我只关心业务堆栈跟踪的延迟。
如何获得特定延迟堆栈跟踪的平均值。可以把原始数据导出成csv,然后自己计算吗
为了保持低开销,Flight Recorder 只记录离群值。例如。如果延迟持续时间低于 20 毫秒,则不会记录。
可以对延迟进行采样,以获得平均延迟的近似值,但截至今天 (JDK 11)。
当我使用 Java Mission Control 打开 .jfr 文件(Java 飞行记录)时,我可以找到 'Stack Trace'、'Longest' 和 'Count'在线程 -> 延迟 -> 延迟堆栈跟踪选项卡中。我关心的是平均值,而不是最长的。 Java 延迟选项卡中有平均值,但它包含与事件类型相关的所有延迟。其中一些对我来说毫无意义,例如:
sun.misc.Unsafe.park(boolean, long)
295,569,155,245 436,427
java.util.concurrent.locks.LockSupport.park(Object)
295,569,155,245 344,030
java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await()
295,569,155,245 263,418
java.util.concurrent.LinkedBlockingQueue.take()
63,773,776,315 257,531
java.util.concurrent.ThreadPoolExecutor.getTask()
63,773,776,315 257,511
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor$Worker)
63,773,776,315 257,511
java.util.concurrent.ThreadPoolExecutor$Worker.run()
63,773,776,315 257,511
java.lang.Thread.run()
63,773,776,315 257,511
以上是线程池的空闲时间,在等待下一个任务。这个和所有其他混合的堆栈跟踪的平均值是没有意义的。我只关心业务堆栈跟踪的延迟。 如何获得特定延迟堆栈跟踪的平均值。可以把原始数据导出成csv,然后自己计算吗
为了保持低开销,Flight Recorder 只记录离群值。例如。如果延迟持续时间低于 20 毫秒,则不会记录。
可以对延迟进行采样,以获得平均延迟的近似值,但截至今天 (JDK 11)。