在过去的几周里,当我想要测量一些可能会定期发生的事件(比如在2D平滑滚动UI中重绘帧的时间)或变量频率时,情况已经出现了几次(就像到达Web服务端点的消息一样)。我已经想到了测量1)'正常'频率,2)当前频率,3)min,4)max。而且我想在多个时间段内测量这些。
例如,一个webservice可以在100毫秒内收到10条消息,然后在5分钟内没有收到任何消息。在UI示例中,它可以以60 FPS直接运行10秒,然后GC点击并且单个帧可以被“冻结”1秒,这完全破坏了UI效果。
我认为这些测量可以使用一组“桶”来收集测量值。但与time series不同,我最关心的FPS测量是没有达到正常间隔的那个(UI示例中的正常是每1/60秒绘制一个帧,但是我关心的那个)大约是60倍)。因此,在正常情况和特殊情况下都可以使用“样本桶”的层次结构。
1..10'微'水桶,每个测量1/10秒 需要许多“微型”桶来保持精确的滑动窗口处于“正常”水平
1..60'正常'水桶,每1秒
1..60'宏'桶,每1分钟
...水平可能会持续:小时,天,月,年
每个级别的每个存储桶都可以保留一组指标(平均值,最小值,最大值,计数)。当存储桶的时间段到期时,存储桶可以“提升”到下一级别并组合到该级别的“采样队列”中。这将为层次结构中每个“级别”的每个桶的每个聚合提供精确的滑动窗口测量,同时使用相对较少的CPU或内存。
在开发环境中,我认为“微观”级别的样本可用于在调试时识别实时问题。在生产中,可以向最终用户显示“正常”水平,同时可以存储“宏观”水平以进行长期趋势分析(以建立长期基线)。一旦识别出模式,似乎很容易以编程方式记录或响应度量标准中的重大变化(如刷新内存缓存的消息速率下降),而不会对可接受的anamolies(如UI中的GC暂停)反应过度。
我知道这有点长,但它似乎是一个简单的想法,我找不到任何在Web上执行此操作的类或框架(至少不在我选择的框架中,.NET)。这是一种用于测量和评估应用程序,系统或测量的健康状况的已知模式,而我却找不到它?任何监控库或统计配方都可以通过开源或非处方药获得?
P.S。由于可能的高采样率,我认为Windows上的PerformanceCounters不适合“微观”级别(在某些情况下每秒更新指标很多次,比如UI FPS的实时显示)。此外,如果解决方案适用于Mono和Silverlight(PerfCounters不可用),那将会很棒。 P.P.S.我花了几个小时在.NET中寻找统计库,发现了一对,但找不到像我上面描述的简单的“分层时间限制采样”。大量计数有界采样,这里不适用,因为重绘率和消息到达率等数据流不会定期发生。
答案 0 :(得分:1)
看起来这在金融服务中很常见,当原始数据集(甚至原始数据上的索引)不适合内存时,使用“时间压缩”来加速数据分析。
此链接提供了SQL中的示例。我想使用相同的内存/速度权衡来跟踪进程中的关键指标。
http://www.codeproject.com/KB/solution-center/Izenda-Speed-Dating.aspx
我想知道我是否遗漏了一些简单的东西,因为看起来这会非常有用,但我没有看到其他人这样做。
答案 1 :(得分:1)
在寻找其他东西的时候跑过去。这听起来就像rrdtool的设计目的。 http://oss.oetiker.ch/rrdtool/
答案 2 :(得分:0)
这是一个很好的方法,当然我已经听说过并实现过,但我并不熟悉以通用方式实现它的任何库。
执行此“实时”操作的一种替代方法是将事物记录在非常精细的级别,例如数据库,然后逐渐“折叠”数据,因为它变得过时/无关紧要。例如,想象一个包含{DATE, GRANULARITY, COUNT}
元组的SQL表;您最初以“秒”粒度插入您的计数;你会定期出现并合并一组像
DATE GRANULARITY COUNT
20100917 10:05:01 Second 4
20100917 10:05:08 Second 2
20100917 10:05:40 Second 1
成一行:
20100917 10:05:00 Minute 7
根据他们的年龄,然后把分钟折成小时等等。
我们在现任雇主那里做类似的事情;我们使用the open-source Performance Co-Pilot tool以高频率记录采样数据,然后随着数据变得越来越老而且价值越低,使用pmlogextract工具将其合并为更紧凑,粗粒度的日志。