最近被问到一个问题,是关于监控系统的4个黄金信号(也被称为黄金指标)的,不太记得了,看了一些资料,做个笔记。
来源
监控系统的4个黄金指标来源于《SRE:Google运维解密》这本书的第六章 分布式系统的监控。
这一章讲了为什么要监控,黑盒监控与白盒监控,4个黄金指标,长尾问题,度量指标时应该采用合适的精度以及监控系统的长期维护这些问题,基本上构建一个监控系统比较重要的几个方面都有讲到。
这本书是我上班的第二年领导推荐给我看的,是一本很好的书,时间很久了,内容忘了很多,这两天在重新读。
四个黄金指标是什么
这四个黄金指标分别是:
- 延迟(Latency)
延迟是指请求从发出到接收响应所花费的时间。这个信号不仅包括成功请求的响应时间,还应该包括失败请求的响应时间。
- 流量(Traffic)
流量是指系统接收到的请求数量或处理的数据量。流量通常以每秒请求数(QPS)或每秒事务数(TPS)来测量。
- 错误(Errors)
错误是指请求未能成功处理的次数或比率。错误可以是 HTTP 状态码 500 系列、应用程序异常或其他失败条件。
- 饱和度(Saturation)
饱和度是指系统资源的使用情况及其接近极限的程度。资源包括 CPU、内存、磁盘 I/O、网络带宽等。一般可以使用利用率或者剩余率来表示。
应用这四个指标时需要注意的内容
- 延迟
- 监控 P50、P95、P99 等不同百分位数的延迟,以更全面了解系统性能。
- 应当区分成功请求和失败请求的延迟,以便更准确地诊断问题。
- 关注不同时间段的延迟变化,比如高峰时间和非高峰时间。
- 针对重要的API和服务应该创建特别的dashboard和告警规则。
- 流量
- 监控每秒请求数及其变化趋势,了解系统负载情况。
- 监控数据吞吐量,比如每秒处理的字节数。
- 结合业务指标(如活跃用户数、交易量、artifacts下载次数等),更好地理解流量与业务活动之间的关系。
- 错误
- 要分别监控总体错误率和特定类型错误率(如 4xx、5xx 错误)。
- 监控错误随时间的变化情况,发现异常波动。
- 必要的时候结合应用日志和LB日志,追踪和诊断错误的根本原因。
- 饱和度
- 监控 CPU 使用率、内存使用率、磁盘 I/O 使用率、网络带宽使用率等关键资源。
- 设置警报阈值,及时预警资源的过度使用。
- 监控系统资源的使用趋势,提前进行容量规划。
关注指标的分布而不是平均值
关注监控指标的分布而不是单纯的平均值,这是因为平均值往往不能全面反映系统的实际性能和用户体验,特别是在存在高可变性或异常的情况下。
主要有以下几个原因:
平均值掩盖了重要细节
平均值是所有数据点的中心趋势,但它无法反映数据的分布情况。以下几个方面说明了平均值的局限性:
- 忽略波动性:平均值不能反映数据的波动性。例如,一个系统的响应时间如果大部分时间很快但偶尔非常慢,平均响应时间可能看起来不错,但用户实际体验可能很糟糕。
- 掩盖异常:如果有一些极端值(outliers),它们可能极大地拉高或降低平均值,从而掩盖了大多数数据点的实际情况。
分布提供了更全面的视角
关注监控指标的分布可以帮助我们更全面地理解系统的性能和行为:
- 百分位数(Percentiles):通过查看不同的百分位数(如P50、P90、P95、P99),可以更好地了解大多数用户的实际体验。例如,P90表示90%的请求比这个值快,而10%比这个值慢。P99表示99%的请求比这个值快,1%比这个值慢。
- 直方图和分位图:这些图表可以展示数据的分布情况,帮助识别性能瓶颈和异常值。例如,Prometheus 支持使用直方图和摘要(Histogram and Summary)来记录和展示数据的分布。
举例说明
响应时间:假设一个 web 服务的响应时间如下(单位:毫秒):
计算平均值: (50 + 50 + 50 + 50 + 50 + 500) / 6 = 125 ms
从平均值来看,响应时间似乎是 125 ms。但实际上,大部分请求的响应时间是 50 ms,只有一个请求是 500 ms。这很可能导致用户体验极差。
如果我们查看百分位数:
- P50(中位数):50 ms
- P90:50 ms
- P95:50 ms
- P99:500 ms
从这些百分位数,我们可以看到绝大多数请求的响应时间是 50 ms,只有少数请求非常慢。
实践中的工具和方法
在实践中,使用适当的工具和方法可以帮助我们更好地分析监控指标的分布:
Prometheus:支持Histogram和Summary类型,可以用来记录和分析时间序列数据的分布。例如,Summary可以在PromQL中进行百分位数查询:
histogram_quantile(0.99, sum(rate(http_request_duration_seconds_bucket[5m])) by (le))
Grafana:与Prometheus结合,Grafana可以用于可视化不同百分位数、呈现直方图和分位图等。例如,使用Prometheus数据源绘制延迟的百分位图:
quantile(0.99, rate(http_request_duration_seconds_bucket[5m]))