Day30-18|9.6.2 怎样选择可靠性模型:让模型假设与系统证据相匹配

一、教材定位

软件可靠性模型是对软件故障发生、发现、修复和变化规律的数学或统计抽象。选择可靠性模型,不是从模型名称中挑一个最复杂的公式,而是要根据评价目的、软件运行方式、故障数据质量、故障修复过程和模型假设,选择能够解释当前问题的方法。模型的价值在于帮助估计、比较和预测可靠性,但模型结果的可信度取决于数据和假设是否与实际相符。

本节是软件可靠性评价中的方法选择部分。考试常见问题包括:如何根据项目阶段和数据条件选择模型;为什么不同模型的预测结果不同;模型使用前需要检查哪些假设;当数据量不足或运行剖面变化时应如何处理。回答时不能只写“选择合适模型”,要说明评价目标、数据特征、故障类型、修复方式和验证方法。

二、选择模型前先明确评价问题

1. 是描述现状还是预测未来

如果目标是描述当前版本在某个观察窗口内的故障率和可用性,直接指标或简单统计可能已经足够,不一定需要复杂模型。如果目标是预测继续测试后的故障数量、判断可靠性增长趋势或估计达到目标所需时间,就需要使用具有预测能力的模型。

预测结论要特别谨慎。软件运行剖面、版本、配置和用户行为发生变化后,过去数据未必能代表未来。模型只能在假设仍成立的范围内外推,不能把历史平均值当成未来保证。

2. 是评价故障发生还是评价恢复能力

有些模型主要描述故障发生和发现趋势,适合研究故障率、平均无故障时间和可靠性增长;有些评价方法需要同时分析修复时间、切换时间和恢复成功率。若题目关注高可用和业务连续性,只选择故障发生模型可能遗漏恢复能力和数据一致性。

3. 是评价组件还是完整系统

单个组件的故障可能相互独立,也可能通过共享数据库、网络和配置产生相关故障。把各组件的可靠性简单相乘,只有在结构和独立性假设成立时才有意义。对微服务、分布式系统和多区域系统,应考虑共因故障、级联故障和依赖传播。

三、模型选择的关键依据

1. 评价对象和运行剖面

模型所描述的软件对象必须与数据对象一致。若数据来自支付核心链路,就不能直接用于全站可靠性;若测试剖面只包含正常查询,就不能用来预测包含批处理和故障恢复的生产表现。运行剖面稳定时,历史数据更有可比性;运行剖面经常变化时,应分阶段建模或重新采集数据。

2. 软件生命周期阶段

开发早期通常缺少真实运行故障数据,适合使用专家判断、历史项目数据、场景分析和设计评审;测试阶段有受控的故障和修复记录,可研究可靠性增长;试运行和生产阶段拥有真实运行数据,可进行现场可靠性估计和趋势分析。模型不能脱离生命周期阶段强行使用。

3. 故障数据的数量和质量

模型需要足够的故障样本、时间戳、运行量和修复记录。样本过少时,参数估计不稳定;故障定义变化时,数据不可比;只记录严重故障而忽略轻微故障时,模型描述的是被观测到的部分。数据质量不高时,应降低预测精度要求,优先完善采集体系。

4. 故障是否独立

某些模型假设故障事件相互独立,但分布式系统经常存在共因故障,例如同一配置错误同时影响多个节点,证书过期导致整个集群通信失败,数据库故障导致多个服务同时异常。若独立性假设不成立,模型可能低估系统性风险。

5. 修复是否有效

可靠性增长模型通常假设故障被发现后会修复,并且修复能够降低后续故障概率。实际修复可能无效、引入新缺陷或只修复表面现象。应记录修复版本、修复前后故障类型和回归结果,验证“修复有效”是否成立。

6. 是否存在删失数据

测试结束时尚未发生故障、项目中途停止观察或系统在达到目标前退出,都会形成删失数据。不能把这些样本简单当作无故障完整运行,否则会夸大可靠性。选择模型时要确认是否能够处理右删失、左删失和不完整观察。

四、常见模型思路及适用范围

1. 基于故障计数的模型

按照单位时间、单位事务或单位运行量统计故障次数,适合快速描述当前故障率和版本差异。它直观、易解释,但对低频故障、运行条件变化和未来预测能力有限。用于比较版本时,必须保证剖面、观察窗口和故障口径一致。

2. 基于时间间隔的模型

使用相邻故障之间的时间间隔研究无故障运行能力,适合关注平均无故障时间和故障间隔变化。它要求故障时间记录准确,且要处理测试开始和结束时未完整观察的情况。若系统存在批量运行或负载波动,可改用事务数、处理量等运行量作为尺度。

3. 可靠性增长模型

通过故障发现、修复和再次运行,描述可靠性随测试过程的变化。适合开发测试阶段和持续改进场景,能够帮助判断故障是否逐步减少、继续测试是否值得以及达到目标还需要多少工作。

使用时要验证修复活动确实改变了故障率。如果只是不断增加测试范围,故障数增加并不一定表示可靠性下降;如果修复后引入新缺陷,简单的单调增长假设也可能失效。

4. 失效时间分布模型

将故障时间视为随机变量,用某种分布描述失效概率随时间的变化。这类模型适合分析早期故障、随机故障和老化故障等不同趋势,但需要足够的时间数据和合理的分布假设。应通过图形、拟合检验和残差分析检查假设,而不是只看拟合优度。

5. 结构可靠性模型

将系统表示为串联系统、并联系统、冗余结构或状态转移结构,研究组件可靠性如何影响系统可靠性。适合分析架构冗余、主备切换和服务组合,但要注意组件故障独立性、切换成功率、共因故障和依赖关系。分布式系统通常不能简单套用理想并联公式。

6. 马尔可夫或状态转移思路

将系统表示为正常、降级、故障、恢复和维修等状态,通过状态转移概率分析可用性和长期行为。适合有明确状态和转移机制的高可用系统,例如主备集群、服务降级和维修过程。模型建立需要定义状态、转移条件和参数,过度简化会遗漏关键业务状态。

五、模型选择的实际步骤

第一步:写清评价目标和质量属性

先确定要估计故障发生、恢复时间、长期可用性、数据一致性还是可靠性增长。不同目标要求的观测数据和模型不同。

第二步:盘点数据和假设

列出故障记录、运行时间、事务量、修复时间、版本、配置、负载和删失情况,检查数据是否完整。对独立性、稳定剖面、修复有效性和分布形式等假设逐项确认,不能为了使用某个模型而忽略不满足的条件。

第三步:选择候选方法

优先选择能够解释问题且复杂度适中的方法。可以先使用直接指标建立基线,再用一到两个候选模型分析趋势。不要一开始就使用难以解释的复杂模型,除非项目确实有足够数据和建模能力。

第四步:拟合与验证

将数据分成建模和验证部分,或者使用时间上的前段数据预测后段数据。检查预测误差、残差、参数稳定性和不同分组下的结果。模型在历史数据上拟合很好,不代表对未来有效。

第五步:敏感性分析

改变关键参数或剔除部分样本,观察结论是否发生重大变化。如果一个极少数故障就能完全改变结论,应降低结论强度,并继续收集数据。对不同模型进行结果比较,解释差异来自哪些假设。

第六步:形成适用边界

报告中写明模型名称、输入数据、假设、参数、拟合和验证结果、预测范围、不能解决的问题以及复审时间。模型结论必须与业务决策关联,而不是只提供一组数字。

六、模型误用的典型问题

第一,数据量很少却进行精确预测,把不确定性隐藏在小数点后。第二,把不同版本、不同配置和不同运行剖面的故障混在一起。第三,把未观测到故障的时间当成完整可靠运行,忽略删失。第四,假设修复一定有效,却没有验证修复后故障趋势。第五,用组件独立模型处理存在共因故障的分布式系统。第六,使用模型输出代替业务数据一致性和恢复验证。

发现模型不适用时,不应强行修改数据迎合模型。可以退回直接指标评价,分阶段建模,增加故障采集,使用场景评审,或把结论表达为区间和风险等级。

七、案例分析:选择电商平台可靠性模型

某电商平台希望比较单体架构和微服务架构的可靠性。两者测试时长不同,业务流量比例不同,微服务版本还包含新的支付和库存功能。项目组计划把两套系统的故障数直接输入同一个模型,并根据模型输出选择架构。

这个做法存在明显问题。首先,评价目标是架构比较,但两套系统的运行剖面和功能集合不一致;其次,微服务存在共享配置、消息平台和数据库等共因故障,不能假设各服务独立;再次,故障记录没有区分服务不可用、数据不一致和可重试错误;最后,测试结束时有大量未完成事务,属于删失和恢复数据,不能直接当作无故障样本。

改进时应先定义共同的业务剖面和核心业务边界,分别记录请求量、故障类型、恢复时间和数据差异。对于总体当前表现,使用统一口径的直接指标;对于微服务架构的切换和降级能力,建立状态转移或结构可靠性模型,并显式考虑共享依赖和切换成功率;对未完成事务继续观察或按删失数据处理。最终给出分维度结论:某架构在隔离故障方面更好,另一架构在部署复杂度或恢复一致性方面存在优势,而不是用单一总分替代分析。

八、综合知识练习

题1

选择软件可靠性模型时,最先要明确什么?

参考答案:最先明确评价目标、对象、运行条件和需要回答的问题。只有知道是描述现状、预测趋势、比较版本还是分析恢复能力,才能选择相应的数据和模型。

题2

为什么分布式系统不能简单把各组件可靠性相乘或相加?

参考答案:这种计算通常依赖组件独立、结构清晰和故障定义一致等假设。分布式系统存在共享数据库、网络、配置、证书和消息平台等共因故障,也存在降级、切换和级联传播,简单组合会高估或低估系统可靠性。

题3

模型在历史数据上拟合良好,是否可以直接用于未来预测?

参考答案:不能直接确定。需要检查运行剖面、版本、配置、修复策略和依赖是否稳定,并进行留出验证、预测误差和敏感性分析。若条件发生变化,应重新建模或降低预测结论强度。

九、论文写作素材

论文中可以这样描述模型选择:

“在进行可靠性评价时,我没有直接套用固定模型,而是先明确评价目标、系统边界、运行剖面和数据条件。对当前版本的运行表现,使用统一口径的故障率、业务成功率、恢复时间和数据差异指标建立基线;对持续测试中的故障变化,选择能够描述可靠性增长的分析方法;对包含主备切换和降级状态的架构,结合状态转移分析,并将共享数据库、消息平台和配置中心等共因故障纳入假设。模型使用前检查故障独立性、修复有效性、样本量和删失数据,使用后通过留出数据和敏感性分析验证结果,最终明确预测范围和适用边界。”

十、今日复盘

  1. 可靠性模型是对数据和运行规律的抽象,不是越复杂越好。
  2. 选择模型前必须明确评价目标、对象、剖面、数据和假设。
  3. 直接指标适合描述现状,增长模型适合分析测试改进,状态模型适合高可用和恢复过程。
  4. 分布式系统要关注共因故障、级联传播和切换成功率。
  5. 样本不足、运行条件变化和删失数据会削弱模型结论。
  6. 模型必须经过验证、敏感性分析,并写明适用边界。