PromQL 的 rate 和 irate 有什么区别?
更新时间:2026-09-19。短答页。这两个函数都用来把只增的 counter 变成「每秒速率」,区别在窗口内用哪些点计算。
一句话回答
rate(m[5m]) 用窗口首尾样本算平均每秒增速,曲线平滑,用于告警和 SLO;irate(m[5m]) 只取窗口内最后两个样本算瞬时速率,对突发尖峰更敏感,用于看板观察实时抖动。两者都只对 counter 用,都会自动处理进程重启导致的计数器归零。
对比
| 维度 | rate | irate |
|---|---|---|
| 计算用点 | 整个窗口首尾(实际取首尾外推) | 窗口内最后两个点 |
| 结果 | 窗口平均速率,平滑 | 最后两点的瞬时速率,毛刺多 |
| 反应 | 钝但稳 | 灵敏、容易抖 |
| 适用 | 告警、SLO、趋势、聚合后再算分位 | Grafana 看「此刻」突发 |
| 误报 | 低 | 高(瞬时抖动就跳) |
promql
sum(rate(http_requests_total[5m])) # 告警/容量:平均 QPS
histogram_quantile(0.99, sum by(le)(rate(..._bucket[5m]))) # SLO 分位必须用 rate
sum(irate(http_requests_total[5m])) # 仅看图:瞬时 QPS为什么告警别用 irate
irate 只反映最后两个采样点之间的速率,一次几秒钟的瞬时抖动就能让曲线冲高回落,若用它配告警会频繁误报;rate 对整窗取平均,要求问题持续存在才体现出来,正好符合「短窗口判严重度 + 长窗口确保持续」的告警思想(见多窗口燃烧率)。
坑
- 对 gauge(内存/队列长度)用 rate:gauge 不是累计量,没有速率语义。
- 窗口短于 2 个采样间隔:irate 至少要两个点,rate 窗口一般 ≥4 倍 scrape_interval,否则结果为空或抖动。
- 先 sum 后 rate:应先对每条序列 rate 再 sum,反了会在重启时产生错误尖刺。
完整用法见 PromQL 实战。
总结
rate 和 irate 都把 counter 转成每秒速率并自动修正重置,差别在 rate 用整个窗口算平均值、平滑稳定、应统一用于告警和 SLO/histogram_quantile,irate 只用最后两个样本算瞬时值、灵敏但抖动大、只适合在 Grafana 看实时尖峰;使用时窗口取至少 4 倍抓取间隔、只对 counter、坚持先 rate 再聚合。