指标在实践中的应用
既然我们已经详细描述了为什么选择合适的指标度量服务质量是很重要的,那么究竟如何来识别哪些指标对服务是最重要的呢?
运维人员和最终用户各关心什么
我们不应该将监控系统中的所有指标都定义为SLI;只有理解用户对系统的真实需求才能真正决定哪些指标是否有用。指标过多会影响对那些真正重要的指标的关注,而选择指标过少则会导致某些重要的系统行为被忽略。一般来说,四五个具有代表性的指标对系统健康程度的评估和关注就足够了。
常见的服务,根据它们的相关SLI通常会归类为以下几个大类。
● 用户可见的服务系统,例如莎士比亚搜索服务的前端服务器通常关心可用性、延迟,以及吞吐量。换句话说:是否能正常处理请求?每个请求花费的时间是多少?多少请求可以被处理?
● 存储系统通常强调:延迟、可用性和数据持久性。换句话说:读写数据需要多少时间?我们是否可以随时访问数据?数据是否一段时间内还能被读取?扩展讨论参见第26章。
● 大数据系统,例如数据处理流水线系统,一般来说关心吞吐量和端到端延迟。换句话说:处理了多少数据?数据从输入到产出需要多少时间?(某些流水线任务还会关注某个单独处理阶段的延迟。)
● 所有的系统都应该关注:正确性。是否返回了正确的回复,是否读取了正确的数据,或者进行了正确的数据分析操作。正确性是系统健康程度的一个重要指标,但是它更关注系统内部的数据,而不是系统本身,所以这通常不是SRE直接负责的。
指标的收集
利用某种监控系统,大部分指标数据都在服务器端被收集,例如Borgmon(具体参见第10章)或者Prometheus。或者利用某种日志分析系统,例如分析日志中HTTP 500回复所占的比例。然而,某些系统可以加入对客户端数据的收集,否则可能会错失一些不影响服务器端指标,但是对用户产生影响的问题。例如,只关注莎士比亚服务器搜索后端的延迟可能会错失由页面JavaScript脚本导致的用户可见的延迟问题。在这个例子中,度量页面在浏览器中可用的延迟是度量用户体验的一个更好的指标。
汇总
为了简化和使数据更可用,我们经常需要汇总原始度量数据。汇总过程应该非常小心。
某些指标的汇总看起来是很简单的,例如每秒服务请求的数量,但是即使这种简单度量也需要在某个度量时间范围内进行汇总。该度量值是应该每秒获取一次,还是每分钟内的平均值?后者可能会掩盖仅仅持续几秒的一次请求峰值。假设某个系统在偶数秒处理200个请求,在其他时间请求为0。该服务与持续每秒处理100个请求的服务平均负载是一样的,但是在即时负载上却是两倍。同样的,平均请求延迟可能看起来很简单,但是却掩盖了一个重要的细节;很可能大部分请求都是很快的,但是长尾请求速度却很慢。
大部分指标都应该以“分布”,而不是平均值来定义。例如,针对某个延迟SLI,某些请求可能很快,其他的可能会很慢,有时候会非常慢。简单平均可能会掩盖长尾延迟和其中的变化。图4-1提供了一个例子:虽然常见请求可以在50ms完成,但5%的请求却慢了20倍!针对平均值的监控和报警将不会发现任何改变,但是服务的确在长尾延迟上出现了巨大变化(图中最上面的那条线)。
图4-1:某系统的 50%、85%、95%、99%的请求延迟,注意这里的Y轴是指数级分布的。
利用百分位指标可以帮助我们关注该指标的分布性:高百分位,例如99% 和99.9% 体现了指标的最差情况,而50% 则体现了普遍情况(99%百分位是指在原始数据中99%的数值都满足某种条件。例如请求延迟的99%为100ms指的是,在所有请求中,99%的请求延迟都小于100ms)。响应时间的分布越分散,意味着普通用户受到长尾请求延迟的影响就越明显,这可能预示了负载过高情况下出现的排队问题。用户研究显示,用户通常更喜欢速度较慢的系统,而不是一个请求速度抖动很厉害的系统,所以,某些SRE团队只关注长尾部分,因为如果99.9%的系统行为都正常的话,那50%部分就肯定也是正常的。
关于统计性谬误
一般来说,SRE更倾向于分析一组数据的百分比分布,而非其算术平均值。长尾效应比算术平均值更有特点,使用百分比分布能够更清晰地进行分析。因为计算机系统的本身特质决定,数据是具有特定分布特点的 ——例如,请求延迟必须大于0,同时如果超时设置为1000ms,则不可能有成功请求超过这个时间。因此,我们不能假设算术平均值和中位数是相等的——它们甚至可能相差甚远!
我们同时也不会假设数据是平均分配的,一切都必须经过验证。某些常见的直觉感觉和近似方法在这里并不适用。例如,如果分布情况和假设不一致,那么根据这个假设做出的操作就有可能频率过高,或者频率过低(例如根据请求延迟将过高的服务器自动重启)。
指标的标准化
我们建议标准化一些常见的SLI,以避免每次都要重新评估它们。任何一个符合标准定义模板的服务可以不需要再次自己定义SLI。
● 汇总间隔:每1分钟汇总一次
● 汇总范围:集群中的全部任务
● 度量频率:每10秒一次
● 包含哪些请求:从黑盒监控任务发来的HTTP GET请求
● 数据如何获取:通过监控系统获取服务器端信息得到
● 数据访问延迟:从收到请求到最后一个字节被发出
为了节约成本,应该为常见的指标构建一套可以重用的SLI模板,从而使得理解每个SLI更简单。