如果是事后统计,按照自然时间来切分窗口,当每秒结束时,输出当前这一秒的 QPS 数值,这个还比较简单。
如果变成实时统计,没想到好的做法,看了一圈,最好的应该是滑动窗口算法,但本质上是将窗口切分统计,误差最大为一个小窗口的大小,看起来应该是最优解了吧,求教。
如果变成实时统计,没想到好的做法,看了一圈,最好的应该是滑动窗口算法,但本质上是将窗口切分统计,误差最大为一个小窗口的大小,看起来应该是最优解了吧,求教。
1
dzdh Feb 21, 2022 redis lua
incr Ymdhis, expire 1s, return get Ymdhis |
2
ClericPy Feb 21, 2022
QPS 不是 q / secs 么... 谜底就在谜面上啊, 不分时间间隔那还叫 qps 么
PS: 语气越来越弱 |
3
ClericPy Feb 21, 2022
@ClericPy 看了楼上才发现要问啥... 一开始以为问的公式啥的
所以如果想统计最小单位秒的某一秒真实 QPS, 每分钟生成个 60 个桶, 桶内 +1 倒是能拿到具体某秒的 q, 过期的下一个分钟丢弃. 不过性能不是最优遇到上万很容易不准, 还真没琢磨过这东西, 以前一直用分钟窗口除以 60 的... |
4
knightdf Feb 21, 2022
1L 正解,只是去掉“expire 1s”
|
5
nl101531 OP @ClericPy 看了 sentinel 的实现,秒级的统计是滑动窗口,不过只用在限流上,分钟级统计也包含了过去的每秒,用于 dashboard
|
6
WhoMercy Feb 22, 2022 via Android
做纯计数,粗略统计可用单独线程计数分钟级统计,根据分钟级 query 数平均计算分钟内每秒 query 数;精细统计可用循环计数队列,队列根据时间片切分,每个位置做自增原子操作,根据自增数统计时间片 query 数。
做限流,可以用循环令牌桶队列,桶队列同样根据时间片切分,每个位置预设令牌数量,每时间片的个 query 会取得(消耗)对应桶里令牌,剩余令牌数可用于计数和限流。 |