Page 56 - 《软件学报》2025年第7期
P. 56
陈元亮 等: 分布式系统动态测试技术研究综述 2977
以微服务架构为典型特征的云原生系统具备高度的动态伸缩性, 其配置管理、服务实例动态变化等提升系统
性能的机制主要由 Kubernetes 等平台层提供支持. 针对云原生系统的性能问题检测, 典型工具 Frisbee [67] 提出了一
个综合框架, 通过声明式方法, 允许用户定义系统配置和测试工作流程, 并在 Kubernetes 环境中自动化执行这些配
置、动态加载请求、注入网络故障如延迟等, 监控和验证系统性能. 虽然用户自定义的判断标准是有效的方法, 但
通常要求用户对待测系统有深入了解, 且需要投入较高的人力成本.
此外, 分布式系统在开放网络中长时间运行过程中, 某些硬件或软件组件可能会因各种原因导致性能大幅下
降, 尽管它们仍能提供服务, 但整体性能受影响. IASO [82] 针对这类性能问题, 设计了基于超时信号的检测机制.
IASO 构建了一个超时评分模型, 实时监控并计算每个节点的超时得分, 生成一个超时分数集. 随后使用 DBSCAN [83]
算法聚类这些得分, 识别并排除噪声点, 将噪声点视为性能缺陷点. IASO 在一个包含 39 000 个节点的集群中成功
捕捉到 232 个性能问题. 然而, IASO 未考虑真实应用场景中的网络延迟和负载变化, 导致许多误报. 为了解决这一
问题, Perseus [73] 使用轻量级回归模型快速定位和分析存储中的性能问题. Perseus 收集每个节点的实时数据, 如磁
盘吞吐量和写延迟, 并建立一个系统负载和正常磁盘写延迟的回归模型. 系统运行时, 实时检测存储磁盘的写延
迟, 若不符合回归模型, 则视为离群点, 即性能问题. 通过该方法, Perseus 在阿里云上找到了 315 个性能问题, 这些
问题修复后极大的增强的阿里云的可用性.
2.5 针对鲁棒性缺陷的测试工具
鲁棒性缺陷是指分布式系统在面对异常情况 (如硬件故障、软件错误、资源耗尽等) 时无法稳定运行或正确
处理错误的缺陷, 影响系统的可用性、容错能力和稳定性. 由于分布式环境中故障种类多样 (如硬件、网络、资源
耗尽) 且故障发生时机不确定, 故障类型及其排列组合的输入空间巨大. 因此, 测试鲁棒性缺陷的主要难点在于设
计高效的故障输入生成算法, 以覆盖多样的故障场景.
早期研究工作关注实现级别模型检测技术, 将模型检测应用于分布式系统动态测试中, 通过捕捉系统行为的
深层语义进行建模, 并模拟故障场景以检测鲁棒性缺陷. 典型工具如 MODIST [52] 和 SAMC [57] 通过建模分布式系统
的主要操作 (如增、删、改、查等) 和故障操作 (如网络延迟、磁盘故障、内存故障等), 抽象关键状态 (如数据存
储、复制、同步), 形成状态转换模型, 并定义关键属性 (如数据不丢失、节点故障后恢复). 这些工具在系统源码
中插入监控逻辑, 记录状态变化和操作事件, 定义测试场景模型, 并基于模型自动生成测试用例, 确保覆盖各种状
态转换和边界情况. 在执行测试时, 工具实时比较实际运行状态和模型预期行为的差异, 验证关键属性是否满足.
如果存在差异或关键属性未被满足, 工具将检测出鲁棒性缺陷. 通过这种方式, 模型检测技术为分布式系统的鲁棒
性测试提供了有效支持.
然而, 对分布式系统进行建模需要很强的领域知识, 并会花费较大的人力成本, 同时常常会面临模型状态空间
爆炸问题, 复杂系统可能难以完全建模和验证. 为了解决这一问题, 后续的故障注入工具如 ChaosMonkey [59] 和
Jepsen [58] 等, 不采用建立模型的方法, 而是直接在测试环境中随机注入故障. ChaosMonkey 在待测系统运行期间随
机终止节点或服务, 观察系统如何处理这些故障并恢复正常运行, 帮助开发团队验证系统在部分组件失效时的响
应能力. 此外, Jepsen 还会随机模拟网络分区、时钟偏差以及各种软硬件故障, 测试分布式系统的容错能力. 除随
机注入测试外, Jepsen 还提供了一系列用户友好的测试接口, 允许测试人员通过编写 Clojure 语言的代码脚本及相
应配置文件, 详细指定故障注入策略, 如故障类型、注入时机、持续时长及其影响范围, 从而增加了工具的灵活
性. 随机探索的方法虽然放弃了验证的完备性, 但极大地提高了工具的可用性, 并在众多分布式系统中发现了上百
个鲁棒性缺陷.
考虑到随机探索容易遗漏许多故障输入空间, 模糊测试技术擅长探索输入空间并触发系统缺陷, 因此多项研
究尝试将模糊测试与故障注入结合, 以挖掘分布式系统的鲁棒性缺陷. 典型工具 CrashFuzz [79] 利用代码覆盖率作为
引导信息, 在测试中动态优化故障序列, 相比随机探索测试提高了 20% 以上的代码覆盖率, 发现了 4 个新的鲁棒
性缺陷. Mallory [77] 在测试过程中动态捕捉关键事件的顺序, 建立事件先发生关系 (happen-before), 并使用
Q-learning 优化故障序列, 以最大化系统行为的观察, 增加触发缺陷的可能性, 发现了 22 个新的鲁棒性缺陷. 针对

