每个服务该看哪几个指标?RED 和 USE 各看什么、各能发现什么问题?错误率该怎么定义?这篇用一个带工作线程池的服务注入四种故障,用 Prometheus 逐项量出来。
阶段 | 到达速率(/s) | 完成速率(/s) | 错误率 | 平均耗时(ms) | p99(ms) | 线程利用率 | 队列长度(最大) | 被拒绝(/s) -----------------+----------+----------+-------+----------+---------+-------+----------+-------- 基准 | 200 | 200 | 0.0% | 26 | 50 | 60% | 0 | 0 错误率升高 | 200 | 200 | 17.7% | 26 | 50 | 62% | 1 | 0 下游变慢(每个请求 60 ms) | 100 | 100 | 0.0% | 67 | 100 | 81% | 0 | 0 过载(来得比处理得快) | 600 | 307 | 48.8% | 186 | 249 | 100% | 50 | 293 同一个服务四种不同的问题:错误率升高时 RED 的错误率马上变,利用率和队列都正常;下游变慢时耗时升高、利用率升高,但还没有排队;过载时到达速率超过完成速率,利用率 100%、队列满、请求被拒绝、耗时被队列拉长——只看某一个指标会漏掉另一种问题
RED(速率、错误、耗时)描述请求的体验,USE(利用率、饱和度、错误)描述资源的状态;不同问题先在不同的指标上露头。
错误率的定义 | 结果
-----------+------
5xx ÷ 全部 | 5.0%
非 2xx ÷ 全部 | 30.1%
404 是客户端的问题,不是服务的错误;把所有非 2xx 都算错误,错误率会被客户端的请求虚高,告警会误报。哪些状态码算“错误”需要按 SLI 的目的定义
ERRORS {}客户端错误(4xx)不是服务的错误,要按 SLI 的目的定义哪些状态码算错误。