尝试从群集环境中运行的虚拟机获取完整内存转储文件时损坏的内存转储文件

本文提供了一个解决方案,用于解决尝试从虚拟机获取完整内存转储文件时生成损坏的内存转储文件的问题。

原始 KB 数: 2913486

现象

你有一个虚拟机,该虚拟机在 Windows Server 2012 或 Windows Server 2008 R2 的群集环境中运行。 尝试从虚拟机获取完整内存转储文件时,将生成损坏的内存转储文件。 当内存转储文件正在加载时,可能会收到以下消息:


此转储文件已部分损坏。

KdDebuggerDataBlock 不存在或不可读。


GetContextState 失败,0xD0000147

无法获取程序计数器

GetContextState 失败,0xD0000147

无法获取当前计算机上下文 NTSTATUS 0xC0000147

此外,你可能会注意到,写入完整内存转储文件未完成,并且虚拟机在群集中的另一个节点上重新启动。

原因

之所以出现此问题,是因为 为虚拟机选择了“为 虚拟机启用检测信号监视”选项。 此选项在一分钟(默认值)后重置群集虚拟机,群集虚拟机需要更长一分钟才能完成内存转储的写入。

注意

虚拟机和 Virtual Machine Manager 之间的检测信号每隔几秒钟发生一次。 最多可能需要一分钟才能检测到虚拟机已关闭,因为虚拟机资源在其 isAlive 入口点函数中检查 Virtual Machine Manager 的检测信号状态。 默认情况下,isAlive 每分钟发生一次。 但是,检测信号可能会在一分钟间隔前停止 30 秒。 在这种情况下,群集可以在同一台服务器上重启虚拟机,或将其故障转移到另一个节点。

解决方法

若要解决此问题,请禁用 虚拟机 选项的“启用检测信号监视”。

选项 1:从 GUI 更改设置

  1. 打开“故障转移群集管理器”。
  2. 单击“角色,然后找到虚拟机资源。
  3. 在“资源”选项卡上,右键单击虚拟机。
  4. 单击“属性,然后单击“设置”选项卡。
  5. 检测信号设置中,单击可清除 “为应用程序运行状况监视 启用自动恢复”复选框。
  6. 单击可清除 虚拟机 的“启用检测信号监视”复选框,然后单击“ 确定”。

选项 2:使用 Windows PowerShell 更改设置

  1. 启动 Windows PowerShell。

  2. 检查虚拟机名称。 为此,请键入以下 Windows PowerShell 命令:

    PS C:\> Get-ClusterResource
    
  3. 检查是否 选择了“为虚拟机 启用检测信号监视”和 “为应用程序运行状况监视 启用自动恢复”选项。 为此,请键入以下 Windows PowerShell 命令:

    PS C:\> Get-ClusterResource <VirtualMachineName> | Get-ClusterParameter CheckHeartbeat
    
  4. 如果 CheckHeartbeat 值为 1,则选择这两个选项。 若要取消这两个选项,请将此值更改为 0。 为此,请键入以下 Windows PowerShell 命令:

    PS C:\> Get-ClusterResource <VirtualMachineName> | Set-ClusterParameter CheckHeartbeat 0
    

    如果只想 取消“为应用程序运行状况监视 启用自动恢复”选项,则应运行以下 Windows PowerShell 命令:

    PS C:\> (Get-ClusterResource <Object>).EmbeddedFailureAction = 1
    

详细信息

小型和内核内存转储文件已成功写入。 之所以发生这种情况,是因为写入这些文件所需的时间不超过一分钟阈值。