写点什么

深入理解 Metrics(四):Meters

作者:冰心的小屋
  • 2022-11-10
    上海
  • 本文字数:969 字

    阅读完需:约 3 分钟

上周四的文章中,介绍了如何使用 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 精心设计的,精心设计的工具就要应到到实践中,你对此有何看法呢?

发布于: 刚刚阅读数: 2
用户头像

分享技术上的点点滴滴! 2013-08-06 加入

一杯咖啡,一首老歌,一段代码,欢迎做客冰屋。

评论

发布
暂无评论
深入理解Metrics(四):Meters_Java_冰心的小屋_InfoQ写作社区