Java jHiccup:直方图数据似乎不一致

Java jHiccup:直方图数据似乎不一致,java,performance,Java,Performance,我正在用Azul的jHiccup运行一个应用程序。应用程序通过jsvc启动,并带有-javaagent选项。jHiccup设置是默认设置(输出文件名除外) 应用程序运行约107分钟。但是,如果我将生成的hgrm文件中的所有值相加,则打嗝的总长度似乎太大了 我计算hiccup值的总和,如下所示: Sum( (TotalCountIncludingThisValue[n] - TotalCountIncludingThisValue[n-1]) * Value[n] ) 结果为1275百万牛顿,或

我正在用Azul的jHiccup运行一个应用程序。应用程序通过jsvc启动,并带有-javaagent选项。jHiccup设置是默认设置(输出文件名除外)

应用程序运行约107分钟。但是,如果我将生成的
hgrm
文件中的所有值相加,则打嗝的总长度似乎太大了

我计算hiccup值的总和,如下所示:

Sum( (TotalCountIncludingThisValue[n] - TotalCountIncludingThisValue[n-1]) * Value[n] )
结果为1275百万牛顿,或约213分钟(假定数值以毫秒为单位)。这大约是应用程序运行时间的两倍

Total count*Mean
(从直方图值的底部)也给出了12 mln.,因此公式可能是正确的

为了比较,我从GC日志中加上了“应用程序时间”和“停止时间”。结果接近我的预期:~105分钟的应用时间和~2分钟的停止时间


我意外地覆盖了原始文件,因此这些是来自不同运行的示例文件:


跑步耗时约79分钟(17:50-19:09),但平均*总计数约为2300万。(也就是说,380分钟)。

更新:[保留我原来的错误帖子]

嗯。所以我们两人的数学都错了(在你的问题和我最初的答案中)。表示(Total Count*Mean)的合理性检查应该大致等于运行时,这只是一个伪数学

这可以通过以下思维练习简单地演示:

下面是一个非常简单的场景:你测量一个运行完美的应用程序(空闲,所有间隔显示0 hiccup)100秒。然后你^Z系统100秒。然后让它再次在前台运行,并立即^C它。总运行时间为200秒

以下是关于这样一个系统的一些恰当的“人类如何用数字来描述这个”陈述:

  • 99.99%的ile将非常接近100000毫秒
  • 10%,,20%,,50%,,都将非常接近0毫秒
  • 在前100秒(以及前100000个采样周期)内,平均值为0毫秒
  • 在第二个100秒(以及第二个100000个采样周期)内,平均值为50000毫秒
  • 总平均值为25000毫秒(总运行时间为200秒)
但直方图的TotalCount中将(正确地)报告200000个结果(每1毫秒经过一次)

因此(平均*总数)=200000*25000==5000000000

这是挂钟时间的250000倍。这没什么错。乘法中有一个~N^2的东西(实际上是N*(N-1)/2),这正是它正确的行为方式

这里的关键是,对于每个百分位,直方图[正确地]报告了总体随机样本的百分比(随着时间的推移,在没有协调的情况下执行),这些样本将遇到低于某个量级的打嗝水平。当发生单次长时间冻结时(例如,如样本输出中的最大2654毫秒所示),这不是受影响的1个时间点。受影响的时间点与冻结中的毫秒数一样多。正确测量和表示,单个冻结大约每毫秒生成1个计数,其值在最大值和0之间呈线性变化(2654毫秒,2653毫秒,2652毫秒,…3毫秒,2毫秒,1毫秒)。这是计算随机、不协调样本可能遇到的延迟扩展的正确方法

我有点尴尬,因为我最初的回答重复了我在题为“如何不测量延迟”的演讲中警告过的错误假设(幻灯片中的图表正好讨论了上述场景)(,这是在大约32分钟的“协调遗漏问题”下).我用正确的数学构建了jHiccup和HdrHistogram来避免这个问题,这就是为什么你在数据中看到了正确的结果

事实上,如果您的健康检查显示“良好”的数字,最大次数为1000毫秒,这将很好地表明测量系统显示出协调遗漏

--吉尔

--------原来的答案是“错”-----------

您可以发布一个显示这一点的示例.hgrm数据集吗?我刚才查看的文件似乎显示了总检测运行时间与.hgrm文件中的计数之间的密切关系。最简单的健全性测试是总计数*平均值(两者都报告在文件底部)应该非常接近运行时。这些数据来自产生百分位线的相同直方图

请注意,百分位线处的计数不是相加的,原因很简单。可以为相同的精确值报告两个百分位水平。这在噪音非常小的长距离跑步中非常常见。但是,上面的数学(仅计算增量计数)“应该”正确

[请注意,您的数学偏离了1行:每一个百分位线都显示了数值等于或低于该行数值的百分位和数值计数。因此,该值应乘以下一行(n+1)的计数与“该”行(n)的计数之间的差值,但这不会对您的测量造成太大差异]

以下是花费1685秒的样本文件forma控制运行,其中jHiccup在运行30秒后开始检测(检测时间约为1655秒)。在此数据集上使用excel,结果如下:

总和((TotalCountIncludingThisValue[n+1]-TotalCountIncludingThisValue[n])*值[n])

显示约16237秒,平均*总计数显示约16591秒

jHiccup直方图报告,2013年4月22日星期一15:28:07 CDT: 值,百分位,总计数包括此值

1.01 0.000000000000         47
1.06 0.100000000000     483774
1.06 0.200000000000     483774
1.06 0.300000000000     483774
1.10 0.400000000000     628589
1.11 0.500000000000     804685
1.12 0.550000000000    1024190
1.12 0.600000000000    1024190
1.12 0.650000000000    1024190
1.13 0.700000000000    1388741
1.13 0.750000000000    1388741
1.13 0.775000000000    1388741
1.13 0.800000000000    1388741
1.13 0.825000000000    1388741
1.13 0.850000000000    1388741
1.13 0.875000000000    1388741
1.13 0.887500000000    1388741
1.13 0.900000000000    1388741
1.13 0.912500000000    1388741
1.14 0.925000000000    1471124
1.14 0.937500000000    1471124
1.14 0.943750000000    1471124
1.14 0.950000000000    1471124
1.14 0.956250000000    1471124
1.14 0.962500000000    1471124
1.14 0.968750000000    1471124
1.14 0.971875000000    1471124
1.14 0.975000000000    1471124
1.14 0.978125000000    1492169
1.14 0.981250000000    1492169
1.14 0.984375000000    1492169
1.14 0.985937500000    1492169
1.14 0.987500000000    1492169
1.14 0.989062500000    1492169
1.15 0.990625000000    1500639
1.15 0.992187500000    1500639
1.15 0.992968750000    1500639
1.15 0.993750000000    1500639
1.15 0.994531250000    1500639
1.16 0.995312500000    1504895
1.16 0.996093750000    1504895
1.16 0.996484375000    1504895
1.16 0.996875000000    1504895
1.16 0.997265625000    1504895
1.16 0.997656250000    1504895
1.17 0.998046875000    1506535
1.17 0.998242187500    1506535
1.17 0.998437500000    1506535
1.17 0.998632812500    1506535
1.17 0.998828125000    1506535
1.18 0.999023437500    1507442
1.18 0.999121093750    1507442
1.18 0.999218750000    1507442
1.18 0.999316406250    1507442
1.18 0.999414062500    1507442
1.18 0.999511718750    1507836
1.18 0.999560546875    1507836
1.18 0.999609375000    1507836
1.18 0.999658203125    1507836
1.18 0.999707031250    1507836
1.19 0.999755859375    1508028
1.19 0.999780273438    1508028
1.19 0.999804687500    1508028
1.19 0.999829101563    1508028
1.20 0.999853515625    1508106
1.20 0.999877929688    1508106
1.21 0.999890136719    1508145
1.21 0.999902343750    1508145
1.22 0.999914550781    1508163
1.22 0.999926757813    1508174
1.25 0.999938964844    1508186
1.34 0.999945068359    1508195
1.82 0.999951171875    1508204
2.42 0.999957275391    1508213
3.54 0.999963378906    1508222
4.74 0.999969482422    1508231
5.09 0.999972534180    1508236
5.98 0.999975585938    1508241
6.24 0.999978637695    1508245
7.01 0.999981689453    1508251
7.97 0.999984741211    1508254
8.26 0.999986267090    1508257
8.96 0.999987792969    1508259
9.02 0.999989318848    1508261
9.98 0.999990844727    1508265
10.24 0.999992370605    1508266
11.01 0.999993133545    1508268
11.01 0.999993896484    1508268
11.97 0.999994659424    1508269
13.95 0.999995422363    1508271
14.98 0.999996185303    1508272
14.98 0.999996566772    1508272
16.00 0.999996948242    1508273
16.00 0.999997329712    1508273
17.02 0.999997711182    1508274
18.05 0.999998092651    1508275
18.05 0.999998283386    1508275
18.05 0.999998474121    1508275
18.05 0.999998664856    1508275
19.07 0.999998855591    1508276
19.07 0.999999046326    1508276
19.07 0.999999141693    1508276
19.07 0.999999237061    1508276
19.07 0.999999332428    1508276
19.97 0.999999427795    1508277
19.97 1.000000000000    1508277

#[Mean    =         1.10, StdDeviation   =         0.06]
#[Max     =        19.84, Total count    =      1508277]
#[Buckets =           25, SubBuckets     =          256] 

嗨,吉尔。我已经在帖子中添加了示例文件。在这种情况下,“Total Count*Mean”比runtime大得多。哦,现在它有意义了,非常感谢!我只是不理解h