V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
nl101531
V2EX  ›  问与答

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

  •  
  •   nl101531 · 2022-02-21 21:05:37 +08:00 · 1847 次点击
    这是一个创建于 1015 天前的主题,其中的信息可能已经有所发展或是发生改变。
    如果是事后统计,按照自然时间来切分窗口,当每秒结束时,输出当前这一秒的 QPS 数值,这个还比较简单。

    如果变成实时统计,没想到好的做法,看了一圈,最好的应该是滑动窗口算法,但本质上是将窗口切分统计,误差最大为一个小窗口的大小,看起来应该是最优解了吧,求教。
    6 条回复    2022-02-22 11:06:03 +08:00
    dzdh
        1
    dzdh  
       2022-02-21 21:18:17 +08:00   ❤️ 1
    redis lua

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

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

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

    做限流,可以用循环令牌桶队列,桶队列同样根据时间片切分,每个位置预设令牌数量,每时间片的个 query 会取得(消耗)对应桶里令牌,剩余令牌数可用于计数和限流。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5901 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 01:50 · PVG 09:50 · LAX 17:50 · JFK 20:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.