12 bug的空间属性环境依赖与过敏反应.pdfVIP

  • 1
  • 0
  • 约3.84千字
  • 约 5页
  • 2021-01-24 发布于北京
  • 举报

12 bug的空间属性环境依赖与过敏反应.pdf

2018/8/29 极客时间 | 程序员进阶攻略 技术性 Bug 可以从很 度分类,而我则习惯于从 Bug 出现的 “时空” 特征角度来分类。可 划为如下两类: 空间:环境过敏 时间:周期规律 我们就先看看 Bug 的空间维度特征。 环境过敏 环境,即程序运行时的空间与依赖。 程序运行的依赖环境是很复杂的,而且一般没那么可靠,总是可能出现这样或那样的问题。曾经 我经历过一次因为运行环境导致的故障案例:一开始系统异常表现出来的现象是,有个功能出现 时不时的不可用;不久之后,系统开始报警,不停地接到系统的报警短信。 这是一个大规模部署的线上分布式系统,从一开始能感知到的个别系统功能异常到逐渐演变成大 面积的报警和业务异常,这让我们陷入了一个困境:到底异常根源在哪里?为了迅速恢复系统功 能的可用性,我们先把线上流量切到备用集群后,开始紧急地动员全体团队成员各自排查其负责 的子系统和服务,终于找到了原因。 只是因为有个别服务器容器的磁盘故障,导致写日志阻塞,进程挂起,然后引发调用链路处理上 的连锁雪崩效应,其影响效果就是整个链路上的系统都在报警。 互联网企业多采用普通的 PC Server 作为服务器,而这类服务器的可靠性大约在 99.9%,换言 之就是出故障的概率是千分之一。而实际在服务器上,出问题概率最高的可能就是其机械硬盘。 Backblaze 2014 年发布的硬盘统计报告指出,根据对其数据中心 38000 块硬盘(共存储 100PB 数据)的统计,消费级硬盘头三年出故障的几率是 15%。而在一个足够大规模的分布式 集群部署上,比如 Google 这种百万级服务器规模的部署级别上,几乎每时每刻都有硬盘故障 发生。 我们的部署规模自是没有 Google 那么大,但也不算小了,运气不好,正好赶上我们的系统碰 上磁盘故障,而程序的编写又并未考虑硬盘 I/O 阻塞导致的挂起异常问题,引发了连锁效应。 这就是当时程序编写缺乏对环境问题的考虑,引发了故障。人有时换了环境,会产生一些从生理 到心理的过敏反应,程序亦然。运行环境发生变化,程序就出现异常的现象,我称其为 “程序 过敏反应”。 以前看过一部美剧《豪斯医生》,有一集是这样的:一个手上出现红色疱疹的病人来到豪斯医生 的医院,豪斯医生根据病症现象初步诊断为对某种肥皂产生了过敏,然后开了片抗过敏药,吃过 后疱疹症状就减轻了。但一会儿后,病人开始出现呼吸困难兼并发哮喘,豪斯医生立刻给病人注 /column/article/14339 2/5 2018/8/29 极客时间 | 程序员进阶攻略 射了 1cc 肾上腺素,之后病人呼吸开始变得平稳。但不久后病人又出现心动过速,而且很快心 跳便停止了,经过一番抢救后,最终又回到原点,病人手上的红色疱疹开始在全身出现。 这个剧情中表现了在治疗病人时发生的身体过敏反应,然后引发了连锁效应的问题,这和我之前 描述的例子有相通之处:都是局部的小问题,引发程序过敏反应,再到连锁效应。 过敏在医学上的解释是:“有机体将正常无害的物质误认为是有害的东西。”而我对 “程序过 敏反应” 的定义是:“程序将存在问题的环境当作正常处理,从而产生的异常。”而潜在的环 境问题通常就成了程序的 “过敏原”。 该如何应对这样的环境过敏引发的 Bug 呢? 应对之道 应对环境过敏,自然要先从了解环境开始。 不同的程序部署和运行的环境千差万别,有的受控,有的不受控。比如,服务端运行的环境,一 般都在数据中心(IDC)机房内网中,相对受控;而客户端运行的环境是在用户的设备上,存在 不同的品牌、不同的操作系统、不同的浏览器等等,多种多样,不可控。 环境那么复杂,你需要了解到何种程度呢?我觉得你至少必须关心与程序运行直接相关联的那一 层环境。怎么理解呢?以后端 Java 程序的运行为例,Java 是运行在 JVM 中,那么 JVM 提供 的运行时配置和特性就是你必须要关心的一层环境了。而 JVM 可能是运行在 Linux 操作系统或 者是像 Docker 这样的虚拟化容器中,那么 Linux 或 Docker 这一层,理论上你的关

文档评论(0)

1亿VIP精品文档

相关文档