关机与失败语义
说明有序关机流程、最终输出与退出状态,以及各类失败的分类与故障关闭规则。
译自microsoft/nvx · doc/design/5.6-shutdown-and-failure-semantics.md。技术细节以英文原文为准。
有序的客户机关机会通过平台关机设备把工作负载状态传递出去。VMM 停止虚拟处理器和设备,排空有界的最终输出路径,释放挂载,并且只有在拆除达到已知状态之后才报告完成。
5.6.1 最终输出与退出状态
客户机发起的退出会先排空字节通道,并在其存在时排空宿主输出中继,然后才报告完成,整个过程在一个合计五秒的期限之内。成功会保留客户机的退出状态;端点、中继或超时失败则变成进程退出错误,而不是静默丢弃最终输出。这一保证覆盖字节通道及其中继,但不覆盖每一个控制台端点。在管理 RPC 之下,零的客户机状态会完成一个待决的等待并干净地停止服务器,而非零状态或排空失败会让该等待失败,并以错误结束服务器。拆除之后,VMM 可以写出有界的结果报告。
如表 5.8 所示,客户机通过退出状态报告自身的快速失败条件,每一种都伴随着一个指明原因的违规事件或错误行。
表 5.8. 客户机快速失败的退出状态。
| 状态 | 原因 |
|---|---|
| 193 | 某项时间 ABI 一致性检查失败 |
| 194 | 违规监视器检测到运行时时钟违规 |
| 195 | 恢复后修复中属于时间 ABI 的部分失败 |
| 125 | 沙箱准备工作(例如共享放置)在工作负载启动之前失败 |
| 1 | 客户机代理的另一个快照或恢复步骤失败,例如处理器激活或身份刷新 |
仅凭状态并不能确定原因。在一次性生命周期中,客户机的退出状态在其他方面就是工作负载的退出状态,可以取任意 8 位值,而且状态 1 同时也是客户机的通用失败状态。因此,宿主要识别快速失败条件,必须结合它前面出现的违规事件或错误行。控制协议中的退出报告与错误(例如输出超限时的 125)则自带各自的类别,如宿主—客户机控制接口所描述的那样。
5.6.2 失败类别
失败按执行能否安全地继续来分类:
- 无效的配置、产物或挂载会在进入客户机之前失败。
- 时间契约违规会以一个稳定的错误码拒绝冷启动、捕获或恢复,并且绝不回退。
- 被拒绝的捕获预检可以把仍然一致的源交回执行。
- 在虚拟处理器停止开始之后的捕获失败是终止性的,除非回滚已被证明完成。
- 快照发布之后的失败绝不恢复源。
- 确认之前的恢复后修复失败,或确认缺失,会让输入保持门控状态并终止被恢复的进程。
- 已保存状态格式错误或挂载重建失败,会阻止任何被恢复的虚拟处理器运行。
这一故障关闭规则可以防止从不确定状态中做出成功形状的恢复。该架构宁愿终止一个进程代次,也不愿恢复一个其设备所有权、外部输入、已持久化产物或执行边界都无法再建立起来的客户机。