软件自恢复综述-笔记
作者:silverbullettt
出处:原始链接已失效
本人根据其论文经过改写,提炼成笔记,保存于此处,日后备查。 应该算是高价值内容。
软件恢复技术简介与评估
作者利用两周课余时间查阅了数十篇关于软件恢复技术(software recovery)的论文,本文旨在进行梳理总结,并提出一个用于评估软件恢复技术的模型,希望对学习和研究该领域的朋友有所帮助。
软件恢复与故障研究及可靠性领域密不可分。近年来关注故障领域的研究者,大多都读过文献[1]。该论文对可靠性计算中的关键概念——包括 Recovery——给出了精确定义,四位作者均是该领域的权威,其定义清晰而深刻。因此,本文将结合该文献的观点,并补充我个人的理解。
〇. 失效(Failure)、错误(Error)与故障(Fault)
(注:罗马数字中没有“零”,此处用汉字替代。)
软件行业常用“bug”一词泛指缺陷,但该词含义过于宽泛。学术界也曾缺乏统一术语来描述计算机系统中的异常。为此,[1] 采用了三个更精确的术语:
-
失效(Failure):当计算机系统无法正确提供用户所需的服务(service),且被用户察觉时,即发生服务失效(service failure)。
-
错误(Error):若系统处于某种可能导致失效的状态,则该状态称为错误状态(error state)。
-
故障(Fault):故障是导致错误的根本原因。若一个故障引发了错误,则称该故障被“激活”,否则为“休眠”。
需注意失效与错误的关系:系统可能已处于错误状态,但只要仍能提供正确服务,就尚未失效。此外,这三个术语也并非绝对严格,同一现象在不同上下文中可能被称为错误或故障。
明确这些概念后,便可进一步讨论“恢复”。
I. 什么是软件恢复(Recovery)?
在可靠性领域中,软件恢复指将软件系统从错误状态转换到正常状态的行为。更准确地说,恢复依赖于已检测到的故障和错误,目标是将系统迁移到不包含这些已检测异常的状态。用状态机来描述恢复过程非常合适。
II. 软件恢复属于什么领域?
可靠性研究的终极目标是确保计算机系统持续稳定地提供服务。故障是导致不可靠的根源,因此提升可靠性可视为一场“人与故障的持久战”。目前,人们总结出四种应对故障的策略:
-
故障预防(Fault prevention):防止故障的发生或引入。
-
容错(Fault tolerance):在存在故障的情况下避免服务失效。
-
故障移除(Fault removal):减少故障的数量与严重性。
-
故障预测(Fault forecasting):在故障发生前预测其存在。
显然,软件恢复属于容错技术 [3,4],其目的是在系统进入错误状态后仍能回归正常。
2001 年,IBM 提出自主计算(Automatic Computing)[2],其四大核心概念包括:
-
自配置(Self-configuration)
-
自我优化(Self-optimization)
-
自愈(Self-healing)
-
自我保护(Self-protection)
软件恢复同样属于自愈范畴,系统能在诊断故障后执行恢复以保持健康。自愈也属于容错领域。
2002 年,UC Berkeley 与 Stanford 合作提出面向恢复的计算(Recovery-Oriented Computing, ROC)[5],自此恢复技术有了更明确的学科归属。
III. 软件恢复技术的分类
我依据恢复技术作用于软件的层次进行分类,不同阶段引入恢复机制会带来不同效果与特征。据此可分为三大类:
-
架构层(Architecture layer):在软件设计初期就将可恢复性作为设计目标。此层次引入恢复机制最为彻底,但也最困难,尤其对现有系统进行改造成本很高。
-
实现层(Implementation layer):在编程实现阶段利用语言特性(如异常处理)加入恢复机制。
-
运行层(Runtime layer):针对已投入运行的系统,通过修改或增加组件使其具备恢复功能。现有大部分恢复技术属于此类。
该分类并不完全正交,某些技术可能跨越多层。理想情况下,越早考虑可恢复性越好,但现实中大量现有系统并未预先设计,因此运行层恢复技术成为研究重点。
IV. 当前主要的恢复技术
4.1 架构层(Architecture layer)
目标:使系统“天生”具备可恢复性。
关键特征:低耦合与冗余的架构最具恢复潜力。
4.1.1 隔离(Isolation)
隔离虽非直接恢复策略,但是许多恢复技术的基础,并能提升系统稳定性。主要包括两类:
-
隔离不同组件:降低耦合度,减少整体崩溃风险,并支持部分重启。
-
隔离执行环境:将关键代码的执行与系统隔离,确保局部故障不影响整体。
代表技术:
-
微内核(Microkernel),如 Minix 3[6,7]。
-
执行环境隔离:Nooks[8](针对 Linux 驱动)、FreeBSD Jail[9](完整虚拟环境)、SafeDrive[10](针对 Linux 驱动的类型安全检查)。
设备驱动程序是系统故障的主要来源之一,相关研究[11,12,13]也证实了这一点。
4.1.2 冗余(Redundancy)
通过多重备份关键组件提升可靠性。冗余恢复效果理论上最好,但成本高,通常用于高可靠场景(如航空、金融)。
代表技术:
-
Recovery Box[14]:在内存中保留精选状态快照,故障时快速恢复。
-
多版本(Multi-version / N-version)[15]:并行运行多个实现同一功能的版本,投票决定输出结果。要求各版本独立开发以降低相关性,效果佳但成本极高。
4.2 实现层(Implementation layer)
在编程实现阶段通过语言机制引入恢复能力。
代表技术:Choices[16]——一个用 C++ 实现的面向对象操作系统,利用 C++ 异常处理机制构建了内核级的异常处理框架,为系统恢复提供了基础。
4.3 运行层(Runtime layer)
针对现有系统,在不进行重大修改的前提下添加恢复功能。最直接的恢复方式就是回滚(Rollback),即让软件回到之前的某个正常状态。
实现 Rollback 需回答三个问题:
-
When:何时回滚?
-
Where:回滚到哪里?
-
How:如何回滚?
根据“回滚到哪里”,可分为三类:
4.3.1 回滚到检查点(Rollback to checkpoint)
检查点(checkpoint) 是运行时的状态快照,存储于外存。故障时重启并恢复到检查点状态,该技术常称为 Checkpoint/Restart。瓶颈在于周期性写外存的速度。
代表实现:Berkeley Lab Checkpoint/Restart (BLCR)[17],支持 Linux 集群的同步检查点机制。
4.3.2 回滚到崩溃点(Rollback to crash point)
若崩溃由外部原因引起,最理想的回滚是回到崩溃瞬间并继续执行,以最小化数据丢失。
代表技术:The Rio File Cache[18](UMich),利用热重启后内存数据未丢失的特性,恢复文件缓存状态。
4.3.3 回滚到初始状态(Rollback to initial state)
即重启。最简单彻底,但会导致数据丢失和耗时较长。
改进技术:
-
微重启(Microreboot)[19]:仅重启故障组件,要求系统高内聚、低耦合。适用于如 Erlang 等支持热更新的系统。
-
软件回春(Software rejuvenation)[20]:针对“软件老化”(如内存泄漏、碎片累积)问题,定期主动刷新系统状态(如可控重启),防止因长期运行导致的性能下降。
此外,运行时层还有如 Fault masking 等其他技术。以上列举仅为经典代表,更多技术可进一步查阅相关文献及其引用。
V. 评估软件恢复技术的要素
如何为特定系统选择合适的恢复技术?需综合考虑以下三方面:
5.1 用户需求(User requirements)
用户可能期望:
-
数据丢失更少
-
开销(时间、空间)更低
-
对系统修改更少
-
连续运行时间更长
不同技术满足不同需求,需对照选择。
5.2 系统属性(System properties)
系统的“体质”影响技术选择:
-
耦合度:低耦合系统(如微内核)适合更多恢复技术。
-
其他视角分类:如状态复杂度、实时性要求等,也为评估提供依据。
5.3 故障特征(Fault features)
“对症下药”:某些技术专门针对特定故障类型(如拜占庭故障)。故障分类可参考[1],选择时需匹配故障特性。
总结:选择恢复技术应统筹考虑用户需求、系统属性和故障特征,才能制定出合适的“治疗方案”。
VI. 参考文献
[1] "Basic Concepts and Taxonomy of Dependable and Secure Computing", Algirdas Avizienis, Jean-Claude Laprie, Brian Randell, and Carl Landwehr
[2] "The Vision of Autonomic Computing", Jeffrey O. Kephart, and David M. Chess
[3] "Software Fault Tolerance: A Tutorial", Wilfredo Torres-Pomales
[4] "System Structure for Software Fault Tolerance", Brian Randell
[5] "Recovery Oriented Computing (ROC): Motivation, Definition, Techniques, and Case Studies", David Patterson et al.
[6] "Can We Make Operating Systems Reliable and Secure?", Andrew S. Tanenbaum, Jorrit N. Herder, and Herbert Bos
[7] "Building a Dependable Operating System: Fault Tolerance in MINIX3", Jorrit N. Herder
[8] "Nooks: An Architecture for Reliable Device Drivers", Michael M. Swift, Steven Martin, Henry M. Levy, and Susan J. Eggers
[9] "Jails: Confining the Omnipotent Root", Poul-Henning Kamp and Robert N. M. Watson
[10] "SafeDrive: Safe and Recoverable Extensions Using Language-Based Techniques", Feng Zhou et al.
[11] "An Empirical Study of Operating System Errors", A. Chou, J. Yang, B. Chelf, S. Hallem, and D. Engler.
[12] "Faults in Linux - Ten Years Later", Nicolas Palix et al.
[13] "Windows Error Reporting"
[14] "The Recovery Box: Using Fast Recovery to Provide High Availability in the UNIX Environment", Mary Baker, and Mark Sullivan
[15] "An Experimental Evaluation of the Assumption of Independence in Multi-Version Programming", John C. Knight, and Nancy G. Leveson
[16] "Exception Handling in the Choices Operating System", Francis M. David, Jeffrey C. Carlyle, Ellick M. Chan, David K. Raila, and Roy H. Campbell
[17] "The Design and Implementation of Berkeley Lab's Linux Checkpoint/Restart", Jason Duell
[18] "The Rio File Cache: Surviving Operating System Crashes", Peter M. Chen, Wee Teck Ng, Gurushankar Rajamani, and Christopher M. Aycock
[19] "Microreboot – A Technique for Cheap Recovery", George Candea et al.
[20] "Software Rejuvenation: Analysis, Module and Applications", Yennun Huang, Chandra Kintala, Nick Kolettis, and N. Dudley Fulton
[21] "Building a Self-Healing Operating System", Francis M. David, and Roy H. Campbell
[22] "Dynamic Self-Checking Techniques for Improved Tamper Resistance", Bill Horne, Lesley Matheson, Casey Sheehan, and Robert E. Tarjan
[23] "Exploring Recovery from Operating System Lockups", Francis M. David, Jeffrey C. Carlyle, and Roy H. Campbell
[24] "Practical Byzantine Fault Tolerance and Proactive Recovery", Miguel Castro, and Barbara Liskov
更多推荐

所有评论(0)