低概率问题分析解决

在软件开发过程中,经常会遇到出现概率很低,但只要出现了就会对系统可用性影响很大的问题。这类问题总是在JIRA上被挂起,时不时的在测试中被报出来。不解决是永不歇停的。因此,在这里根据我遇到的各种低概率问题,整理出一套解决问题的方法,希望在解决其他低概率问题时能够有些借鉴。

明确问题现象

明确问题现象对于解决分析问题有很大的帮助。有时候,我们看到的现象只是表面的,或者只是具体现象的某一部分。以视频会议为例,当出现视频画面卡顿,如果我们只关注这一现象,很有可能认为是丢包了。但卡顿这个现象和更多的细节有关:

  • 卡顿周期:是一直卡顿还是周期性出现卡顿,卡顿周期是多少?
  • 是否丢包:丢包率是多少?是否持续丢包?
  • 卡顿发生时间:是白天还是晚上?是工作日还是周末?

越多的信息能够更好地帮助我们分析问题,不要急于下定论。低概率问题也存在出现的时候,出现时首先要仔细观察,明确问题现象。由于低概率问题出现概率很低,这次观察的结果至关重要。

这里需要谨记:我们要关注哪些现象与我们具体的业务有关。因此利用自己的经验,但不要局限于现存的经验,开阔的思维有利于问题的解决。

引入分析工具

团队在项目一开始就要制订潜在的问题分析工具开发计划。分析工具能够帮我们定位深层次的现象,并将干扰现象排除在分析之外。一般情况下,团队需要哪些工具帮助分析是很好规划的。工具可能是产品软件的自带功能,也可以是第三方或者自研的小工具。在我们视频会议团队,存在如下分析工具:

graph LR 分析工具-->第三方 第三方-->Wireshark 第三方-->IPerf3.0 第三方-->SocketTools 第三方-->Elecard-StreamEye-Tools 第三方-->YUVPlayer 第三方-->MFTools 第三方-->Network-Emulator-Toolkit 分析工具-->自研 自研-->音频分析小工具 自研-->视频分析小工具 自研-->音视频数据Dump 自研-->日志分析工具 自研-->煲鸡功能 自研-->性能测试小工具

如果因为缺少分析工具,而导致存在的问题迟迟不得解决,或是解决迟缓。开发人员自己需要反思。针对于视频卡顿问题,在发现时我们利用了两个工具:视频分析小工具和Wireshark。通过WireShark我们定位到当前网络没有丢包。通过视频分析小工具我们定位到问题出现在接收端。现在我们能够确定的当前现象是:

  • 视频卡顿
  • 网络无丢包
  • 周期性卡顿
  • 夜晚发生

分析问题现象

不要急着去看代码。先分析可能导致这个现象的原因,并根据各种可能原因做好准备。力求一旦下次出现,一次性定位问题。上面的例子总体现象是卡顿,包含了三个细节内容,针对现象和细节部分做针对性分析:

graph LR 卡顿问题-->卡顿现象 卡顿现象-->采集/预处理/编码/发送 采集/预处理/编码/发送-->排除 卡顿现象-->网络波动 卡顿现象-->接收 卡顿现象-->解码 卡顿现象-->处理 卡顿现象-->渲染 卡顿问题-->周期性卡顿 周期性卡顿-->周期性网络波动 周期性卡顿-->代码周期性丢包 卡顿问题-->无丢包 无丢包-->排除网络丢包因素 无丢包-->网络抖动 卡顿问题-->夜晚发生 夜晚发生-->网络因素影响

现象分析可能会引入一系列可能原因,先将所有可能的原因罗列出来,然后逐项排查。无法排除的就是我们分析的关键。对问题正确的分析,能够帮助我们少走很多弯路,这个需要耐心。

调用链分析

对于问题现象一定存在着一条调用链,这个调用链中某一个链条出错,进而导致问题发生。通过调用链分析,我们能够更深层次的理解这个问题的可能原因,并且有可能在分析过程中就找打了问题的根源。

对于调用链简单的问题,可以直接评审代码,尝试找到问题。但是对于调用链很复杂,涉及很多模块,直接评审代码就和大海捞针一样。此时需要做的是熟悉核心调用步骤。如果代码是自己开发的,只要时间不长大多都熟悉,但是如果是长时间未维护或者是第三方代码,熟悉核心调用步骤就极为重要。

针对视频卡顿场景,需要熟悉的调用链步骤包含:RTP接收、RTP组帧、视频解码、视频处理、视频渲染。

潜在原因埋点

调用链分析无法找到原因时,就需要进行潜在原因埋点。埋点通常是通过日志和数据上报。埋点要注意粒度、频度和准确度问题。

  • 粒度:调用链核心步骤
  • 频度:不影响正常数据分析
  • 准确度:埋点信息要全面,埋点位置合理

针对视频卡顿场景,最终埋点的地方为:RTP接收出口、RTP组帧出口、视频解码出口、视频处理出口、视频渲染出口。

煲鸡压力测试

低概率问题其核心表现在于出现概率低。要突破概率限制,有两个办法:增加尝试次数和增加并发。两个方法的具体表现为:煲鸡测试和压力测试。对于压力测试,使用压力测试工具,增加大并发;对于煲鸡测试,利用煲鸡小工具,增加尝试次数。

压力测试和煲鸡测试都要考虑环境问题。这个环境是根据问题现象的推导出来的。针对视频卡顿问题,有一个现象是夜晚发生,意味着可能网络并不差。因此我们在煲鸡测试时,特定针对这一现象,在周末过来煲鸡复现。

煲鸡是个拼耐心的过程,有些问题是可以通过其他手段监控提醒,有些问题是需要时刻盯着,否则转瞬即逝,还有一些问题是需要我们反复操作,记住操作步骤。

定位解决问题

等煲鸡测试复现该问题。可能很多次才会复现一次。上面的所有手段也无法保证我们一次解决问题。但也为我们向解决问题迈了一大步。如果经过一次复现,通过埋点数据,一次性解决问题皆大欢喜。如果不能解决,埋点数据能够为我们进一步分析问题。如果上次埋点的数据对你一点用都没有,这个时候就要好好反思。大多数情况下,埋点的数据会给我提供更多的思路。这个时候,可以通过评审代码,或者增加核心埋点数据,争取下次一次性解决问题。

反思总结

问题解决了,这个时候就要用手术刀来剖析自己了。剖析分为三点:

  • 解决问题是否优雅
  • 问题根源分析
  • 潜在问题排查
  • 后续问题避免

低概率问题处理流程

有些低概率问题就出现了一次,后续再也没出现,需要执行一定的流程。这个流程需要和测试人员共同制定。一个简单的流程如下:

虚心接受批评和指导

解决问题的过程一定不是一帆风顺的,不要妄下定论,保持耐心,开阔思路。对于外界的批评和指导都要需求接收。很多时候自以为是会让我们忽略一些问题,拒绝指导又会让我们难以解决一些问题。成长的机会白白浪费,问题还得不到解决。


本文作者:ZeroJiu
本文链接: http://www.freehacker.cn/advanced/low-probability-analysis/
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 CN 许可协议。转载请注明出处!