统计实时 QPS 有什么好方法?

2022-02-21 21:05:37 +08:00
 nl101531
如果是事后统计,按照自然时间来切分窗口,当每秒结束时,输出当前这一秒的 QPS 数值,这个还比较简单。

如果变成实时统计,没想到好的做法,看了一圈,最好的应该是滑动窗口算法,但本质上是将窗口切分统计,误差最大为一个小窗口的大小,看起来应该是最优解了吧,求教。
1824 次点击
所在节点    问与答
6 条回复
dzdh
2022-02-21 21:18:17 +08:00
redis lua

incr Ymdhis, expire 1s, return get Ymdhis
ClericPy
2022-02-21 22:18:14 +08:00
QPS 不是 q / secs 么... 谜底就在谜面上啊, 不分时间间隔那还叫 qps 么

PS: 语气越来越弱
ClericPy
2022-02-21 22:27:08 +08:00
@ClericPy 看了楼上才发现要问啥... 一开始以为问的公式啥的

所以如果想统计最小单位秒的某一秒真实 QPS, 每分钟生成个 60 个桶, 桶内 +1 倒是能拿到具体某秒的 q, 过期的下一个分钟丢弃. 不过性能不是最优遇到上万很容易不准, 还真没琢磨过这东西, 以前一直用分钟窗口除以 60 的...
knightdf
2022-02-21 22:27:27 +08:00
1L 正解,只是去掉“expire 1s”
nl101531
2022-02-22 08:35:57 +08:00
@ClericPy 看了 sentinel 的实现,秒级的统计是滑动窗口,不过只用在限流上,分钟级统计也包含了过去的每秒,用于 dashboard
WhoMercy
2022-02-22 11:06:03 +08:00
做纯计数,粗略统计可用单独线程计数分钟级统计,根据分钟级 query 数平均计算分钟内每秒 query 数;精细统计可用循环计数队列,队列根据时间片切分,每个位置做自增原子操作,根据自增数统计时间片 query 数。

做限流,可以用循环令牌桶队列,桶队列同样根据时间片切分,每个位置预设令牌数量,每时间片的个 query 会取得(消耗)对应桶里令牌,剩余令牌数可用于计数和限流。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/835497

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX