深入理解 Metrics(四):Meters
上周四的文章中,介绍了如何使用 Histograms 来统计鉴权接口响应时间的分布。本章会继续讲解 Metrics 的第四个工具:Meters,通过使用 Meters 可以测量接口发生的频率。
1. 1 分钟、5 分钟和 15 分钟的由来
Meters 用来测量事件发生的频率,例如每秒请求数,不仅如此,还会统计最近 1 分钟、5 分钟和 15 分钟的频率。 但为什么会是 1 分钟、5 分钟和 15 分钟,这里需要参考 UNIX 系统关于平均负荷 load average 的定义。
在 Meters 的代码注释中建议开发者参考以下的资源:
UNIX Load Average Part 1: How It Works
UNIX Load Average Part 2: Not Your AverageAverage
EMA
有时我们会查看服务器的负载,通常情况下你可能会在终端上输入 top、uptime 和 w 等命令,这时终端会有如下的输出:
load average 的三个数字表示 1 分钟、5 分钟、15 分钟内系统的平均负荷,通过数值大小来判断系统负载的高低,而负载的计算依赖于运行在 CPU 上进程数和进程状态,当进程的状态为 TASK_RUNNING 或者包含 TASK_UNINTERRUPTIBLE 时会被计算在内。
下面是 Linux kernel 计算负载的代码片段:
Metrics 就是参考 UNIX 系统平均负荷的实现设计了 Meters。
2. Meters 的使用
account 模块使用 Meters 测量鉴权接口被调用的频率。 在测试的代码中通过不断的加大并发请求数,来测量 account 模块能承受的极限。
代码说明:
1. 测试开始之前需要登录 SDMK 获取用于验证的 token。
2. 子方法 getOneMinuteRate(Stringtoken, int thread)模拟并发测试,测试总次数 = 线程数 * 1000。
3. 并发数从 1 到 256 指数增长。
输出如下:
从上面的输出结果可以看出,随着并发数加大,account 每秒钟处理的请求数也在加大,用折线图来显示:
3. Meters 的层次结构
Meters 使用类 EWMA 实现了 Metered 的接口,从而可以统计输出 1 分钟、5 分钟和 15 分钟内调用的频率。
下面是类 Meter 核心处理过程:
4. 指数移动平均算法
类 EWMA 实现了指数移动平均算法,关于指数移动平均算法可以参考维基百科的定义:
那么类 EWMA 是如何实现的:
类 EWMA 定义了三个常量:M1_ALPHA、M5_ALPHA 和 M15_ALPHA,这是指数移动平均算法的加权值,至于具体值也是借鉴 Kernal 的魔数:
类 EWMA 的核心方法:
为了观测增量频率和总频率随时间的变化情况,测试过程中每隔 5 秒钟采集一次增量频率和总频率,持续 2 钟,最后绘制成折线图。
5. 结束语
从本章的讲解可以看出 Meters 是经过 Metrics 精心设计的,精心设计的工具就要应到到实践中,你对此有何看法呢?
版权声明: 本文为 InfoQ 作者【冰心的小屋】的原创文章。
原文链接:【http://xie.infoq.cn/article/cc6fd79b733f05d5458dcfea9】。文章转载请联系作者。
评论