如何科学地利用MTTR优化软件交付流程?
谷歌提出的衡量 DevOps 质量的 DORA 指标让 MTTR(平均恢复时间) 名声大振。在本文中,你将了解到 MTTR 的作用、为什么它对行业研究很有用、你可能被它误导的原因以及如何避免 MTTR 产生的弊端。
MTTR 究竟是在测量什么?
MTTR 指平均恢复时间,既是 Mean Time to Recovery,有时也是 Mean Time to Restore。它是指在发生故障后使系统恢复运行所需的时间,它是 DORA 指标的一部分,目前已经成为软件交付性能的标准。
当你的所有 DORA 指标都表现良好,那么就会拥有快速交付的高质量软件、更满意的员工,从而在所处的行业中取得竞争优势。
如何计算 MTTR
收集 MTTR 需要收集每个故障从开始到结束的持续时间,然后将这些时间相加,并用总数除以数量。一些团队会对所有事件进行排序,并选择中间值来计算恢复时间的中位数。
软件交付过程会影响恢复时间,尤其是:
- 软件架构
- 文档
- 可观测性
- 部署流水线性能
当你可以快速恢复,事件的影响就会降低,客户也会更满意。因此,企业应该检查和调整流程以快速恢复并降低风险。
为什么 MTTR 对行业研究很有用?
DevOps 研究和评估(DORA)将调查作为研究方法的一部分。需要各类数据和性能水平不同的企业对问题进行回答。DORA quick check 将 MTTR 问题表述为:
对于您开发的主要应用程序或服务,当发生影响用户的服务事件或故障(例如,计划外中断、服务受损)时,通常需要多长时间才能恢复服务?
- 超过6个月
- 1-6个月之间
- 1周到1个月之间
- 1天到1周之间
- 小于1天
- 小于1个小时
大多数从事软件交付工作的人对故障持续时间都有大概的感觉,因此在调查中使用宽泛的选项可以让人们很容易选择答案。研究人员利用这些信息来寻找数据中的性能组,他们还寻找各种实践之间的关系以及对业务成果的影响,并利用这些发现搭建 DevOps 结构方程模型。
为什么 MTTR 数据可能误导你的团队?
虽然 MTTR 在研究中对性能组有帮助,但这并不是你在团队中使用故障信息的方式。你应该利用这些信息从服务中断中学习,并改进今后的处理方式。最终目标并不是与其他团队或组织进行攀比。
如果要持续优化软件开发和交付流程,只关注平均数可能忽略了一些重要信号。因此需要更细化的信息来了解故障处理的情况,并找到其原因。
Verica 事件数据库(VOID)包含了由近600个组织共享的超过10000个事件,他们在 VOID 报告中分析了这些事件。在2022年的报告中对 MTTR 做出如下评论:
MTTR 不是衡量复杂软件系统可靠性的可行指标,原因有很多,其中突出的原因是其存在潜在的差异性。
当数据量很大时,平均数所带来的差异性会变得平缓,但一般而言企业的故障频率不太可能会达到每月数千起(即在这个数量级才使平均数有效)。如果事件数量较少,平均数则成为一个不稳定的指标。甚至尽管在事件管理方面有所改进,但平均数依旧在增加。
VOID 数据库还发现,大多数事件在2小时内得到解决,但存在一些长尾数据导致平均值被推高或推低,进而无法代表客户看待系统可靠性的方式。
组织可以通过排除异常值来消除这种差异性,但那样就会隐藏一些有价值的信息。因此需要一个更好的方法使用这些数据来改善整个流程。
恢复时长的用武之地
与其把事件恢复时间压缩成一个平均数,不如把每个持续时间绘制在图表上。使用散点图或箱线图(Box-and-whisker chart),在不失真实性的情况下将持续时间可视化。这可以显示趋势和异常值,这比平均数更有价值。
你现在可以清晰地了解修复时长的趋势,看看是否随着时间的推移而改善。还可以识别出异常值,并充分讨论如何更好地处理它们,进而利用它们来改善事件管理和系统稳定性。
如果事件需要代码修复,恢复时间取决于部署流水线的性能。能够快速、安全地部署软件新版本也有助于进行事件管理。另外,引入监控和告警工具有助于帮助企业在影响客户之前发现问题。
明确事件的定义
要获取大部分事件持续时间的数据,你需要对此有统一的定义:
- 什么是事件
- 什么是开始时间
- 什么是结束时间
对于事件,企业内部需要有一个清晰、一致的定义。它应该包括当系统可以优雅地处理一个故障时,组织是否将其算作一个事件。例如,团队可以认为只有对客户产生影响的故障才是事件。
对于开始时间和结束时间也是一样的。是在导致事件发生的条件首次出现时开始计时,还是在问题对客户可见时开始计时?根据定义,甚至可能出现负的事件持续时间,即在故障影响到客户之前就解决了它。
就事件的定义和如何衡量其持续时间达成一致,使你的衡量标准更具可比性。当长期使用 DORA 指标时,它们可能不再能激发你进行下一步改进。你可以用 SPACE 框架设计一个新的衡量系统。
使用 SPACE 框架来衡量事件响应
你可以通过 SPACE 框架来全面了解事件响应和管理,其将测量结果分为5个类别:
- 满意度和幸福感(Satisfaction and wellbeing)
- 表现(Performance)
- 活跃度(Activity)
- 沟通与协作(Communication and collaboration)
- 效率与流程(Efficiency and flow)
企业不必一次性采用所有指标。SPACE 框架建议至少在3个维度上进行测量,如果能涵盖个人、团队和系统层面则更好。最终目标是建议一套合理的测量方法来帮助企业改进流程。
满意度和幸福感
定性调查在这里最有效,可以调查事件管理者,看他们对事件发生后恢复的满意程度:
- 事件管理流程
- On-call 排期
- 在事件发生期间升级或访问专家以提供帮助的难易程度
还可以去查看相关数据以确定 On-call 排期的合理性:
- 当地时间几点电话响起
表现
使用以下指标可以衡量事件管理表现:
- 系统是否按照其可靠性目标执行
- 事故条件和察觉到事故发生之前的时长
- 解决事故所需的时间
活跃度
事件活跃度并不仅仅是事件数量,其他指标也可以纳入参考。大部分数据其实已经在你的现有系统之中:
- 监控工具发出的告警数量
- 事件发生的数量
- 同时发生事件的数量
沟通与协作
信息透明对事件管理至关重要。你应该把这个维度纳入事件测量策略中。拥有高质量的沟通将减少解决故障所需的时间,可以衡量以下指标:
- 每个事件所牵涉的人员数量
- 每个事件涉及多少个不同的团队
- 为处理一个事件建群的数量
- 查看事件报告的次数(或给予积极评价,或在其他事件中提到它)
效率及流程
当采用效率和流程的指标时,就会发现系统中的浪费。如果反复“踢皮球”,那么处理事件的进度就会停滞不前,解决时间更长。以下指标可以帮你发现瘟疫:
- 重新分配事件的频率
- 每个事件尝试缓解的次数
SPACE 框架总结
当需要获得各种洞察并改进系统时,团队应该自由构建并根据实际情况调整指标。企业可能会发现从满意度、沟通和效率这3类指标开始是有帮助的,因为通过测量这些指标并对相关情况进行优化会带来立竿见影的效果。
如果你已经对客户进行调查,不妨问问他们如何为你的系统可靠性评分。
SPACE 框架提供了一种构建衡量体系的方法,它可以直接对事件管理产生影响。
不囿于数字,解决问题才是硬道理
衡量相关指标可以通过明确的数据来帮助团队做出调整。如果没有数字,可能会把一个实际发生很频繁的事件当作一次性事件处理。
尽管数字发挥了作用,但它们只能告诉你问题所在,而无法解决它。因此,不要囿于数字,充分利用事件复盘和 review 来研究如何优化企业中的事件管理。
数字并不能推动持续改进,但它可以消除讨论中的偏见和逻辑谬误,以帮助团队处理好眼前的现实问题。
团队应该形成在事件发生后立刻对其进行复盘,以防止回归到日常工作之后缺少了上下文环境而无法正确分析出事件发生的原因。
对于根本原因的分析要谨慎,因为软件系统发生事故很少只有单一的原因,它通常是几个因素共同促成的。根本原因分析侧重于最接近事件的人,而不是更广泛的系统性问题。另外,需要进行事件后的 review,详细说明发生的一切以及您为减轻和解决它所做的工作。
事件复盘的成果可以提供给处理未来事件的人使用,有助于缩短解决时间。
安全是吸取事故教训的能力,而不是没有故障,事故复盘是最佳的学习机会。
—— Adrian Cockcroft
导致事故发生的原因从来不是单个员工,而是整个工作系统。如果有人登录服务器,不小心选择了“关闭”而不是“登出”导致服务器关闭,这本质上是系统的故障——为什么不隐藏“关闭”选项?为什么他们需要直接访问服务器?我们可以用 runbook 来做这个吗?
定期 review 来复盘最近的事件,可以在冷静理智的情况下找到模式并思考改进方式。从事件中学习比围绕恢复时间制定目标更重要。
参考链接:
https://octopus.com/blog/how-to-measure-mean-time-to-resolve
如何科学地利用MTTR优化软件交付流程?的更多相关文章
- Docker学习总结(8)——利用Docker开启持续交付之路
持续交付即Continuous Delivery,简称CD,随着DevOps的流行正越来越被传统企业所重视.持续交付讲求以短周期.小细粒度,自动化的方式频繁的交付软件,在这个过 程中要求开发.测试.用 ...
- Android中利用ViewHolder优化自定义Adapter的典型写法
利用ViewHolder优化自定义Adapter的典型写法 最近写Adapter写得多了,慢慢就熟悉了. 用ViewHolder,主要是进行一些性能优化,减少一些不必要的重复操作.(WXD同学教我的. ...
- 利用Gulp优化部署Web项目[长文慎入]
Gulp Gulp是一款项目自动化的构建工具,与Grunt一样可以通过创建任务(Task)来帮助我们自动完成一些工作流的内容.当然,今天我们的内容并不是讨论这二者的区别,仅仅是介绍介绍如何利用Gulp ...
- 【转】利用TCMalloc优化Nginx的性能
From: http://www.linuxidc.com/Linux/2013-04/83197.html TCMalloc的全称是 Thread-Caching Malloc,是谷歌开发的开源工具 ...
- VB|xp风格:终于解决了“图片优化软件”在部分xp系统上无法启动的问题。
一年以来,图片优化软件一直存在一个“兼容”性问题. 因为之前的软件是在windows 2003系统上开发的,制作成安装文件后,经部分用户测试发现,在部分用户的xp系统上安装后,无法正常启动,只能听到p ...
- 小众软件:Windows 下优化软件推荐—— Dism++ | 强迫症晚期患者福音 - 少数派
Windows 下优化软件推荐—— Dism++ | 强迫症晚期患者福音 - 少数派 https://sspai.com/post/41992 官方网站免费下载
- 使用Rainbond实现离线环境软件交付
一.离线交付的痛点 在传统行业,如政府.能源.军工.公安.工业.交通等行业,为了防止数据泄露和运行安全考虑,一般情况下网络会采取内外网隔离的策略,以防范不必要的风险,毕竟在安全防护方面,网络物理隔离是 ...
- 华为云计算IE面试笔记-华为云计算解决方案业务迁移支持哪些迁移?有哪些特点?请描述基本的业务交付流程、业务迁移流程和原则。
1. 迁移场景:华为云计算解决方案按照源端环境来说,支持P2V.V2V(P2V:物理设备(操作系统及其上的应用软件和数据)迁移到华为虚拟化平台.V2V:其他厂商的虚拟化平台迁移到华为虚拟化平台.)以及 ...
- 软件开发流程 Software development process
软件开发流程(Software development process)即软件设计思路和方法的一般过程,包括设计软件的功能和实现的算法和方法.软件的总体结构设计和模块设计.编程和调试.程序联调和测试以 ...
- python之路76 路飞项目 企业项目类型、软件开发流程、路飞项目需求、pip永久换源、虚拟环境、路飞项目前后端创建、包导入、后端项目目录调整
知识获取渠道 cnblogs csdn 掘金 思否 找工作app boss直骗.拉钩.智联.猎聘.脉脉(内推,hr). 企业项目类型 1.面向互联网用户:商城类项目 微信小程序商城 2.面向互联网用户 ...
随机推荐
- springboot jpa---->总结一下遇到的问题
Native Query throw exception dto code import lombok.Value; @Value public class IdsOnly { Integer id; ...
- ASP.NET CORE开发 (三)
1. 在使用singleton时出现 Cannot resolve scoped service 'AlgoTag.Models.AlgoContext' from root provider. ht ...
- 云上大数据存储:探究 JuiceFS 与 HDFS 的异同
HDFS 作为 Hadoop 提供存储组件,已经成为大数据生态里面数据存储最常用的选择,通常在机房环境部署. JuiceFS 是一个基于对象存储的分布式文件系统,用户可以在云上快速地搭建按需扩容的弹性 ...
- window启动和停止服务命令
NET STOP serviceNET STOP 用于终止 Windows 服务.终止一个服务可以取消这个服务正在使用的任何一个网络连接.同样的一些服务是依赖于另外一些服务的.终止一个服务就会终止其它 ...
- Python最详细的Excel操作方式,
为 什么要学会使用Excel在机器学习模型的建立中,不得不借助于Excel强大的统计分析能力,这个时候就牵涉到了如何将python直接处理得到的数据存入excel表格当中以及获取表格的数据进行分析,简 ...
- mysql迁移:docker迁入迁出mysql
docker迁出mysql数据库 测试环境: docker服务器 mysql服务器 IP 192.168.163.19 192.168.163.16 操作系统 CentOS7.8 CentOS7.8 ...
- socket搭建web服务端
import socket from threading import Thread import time def html(conn): time_tag = str(time.time()) p ...
- 【D01】Django中实现带进度条的倒计时功能(简易版)
首先说明简易版是只有一个 倒计时 和一个 进度条,页面加载后自动开始计时,下次计时需要手动刷新页面. 后续会更新实现完整的倒计时功能的文章 前期准备 前端框架 你需要准备一些前端框架:Bootstra ...
- YII文件上传
<span style="font-size:14px;">use yii\web\UploadedFile; public function actionDoarta ...
- R读入数据
两种方式: edit()自动生成一个红色的表格,列名会自动的放上去,不够的会显示var5,var6,var7 mydata <- data.frame( age = numeric(0), ge ...