大内存虚拟机在 vMotion 期间内存传输导致的无响应问题

大内存虚拟机在 vMotion 期间内存传输导致的无响应问题

老哥们,今天遇到一个关于虚拟机迁移vmotion的严重问题——分配了大量内存的VM在进行 vMotion 时,可能会在内存传输阶段出现周期性无响应,甚至导致应用程序不可用和性能下降。查了一下 VMware KB 427086,原来这是由于精细内存跟踪缓冲器溢出导致的。

故障现象还原

1. 虚拟机无响应

在 vMotion 内存传输期间,虚拟机可能会经历:

  • 应用程序无响应
  • 客户端 I/O 命令失败
  • 性能严重下降

2. ESXi 主机日志信息

/var/run/log/vmkernel.log 中,会看到以下信息:

YYYY-MM-DDTHH:MM:SS.Z In(182) vmkernel: cpu133:45716049)PVSCSI: 2769: scsi1:2: SCSI ABORT ctx=0x363
YYYY-MM-DDTHH:MM:SS.Z Wa(180) vmkwarning: cpu40:45715994)WARNING: VMotion: 1451: 8686083635737680100 S: Waited 30.315 seconds for the monitor to process a preCopyNext action. This may cause unexpected vMotion failures.

3. 虚拟机日志信息

/vmfs/volumes///vmware.log 文件中,会看到 SCSI 中止和重置信息:

YYYY-MM-DDTHH:MM:SS.Z In(05) vcpu-77 - PVSCSI: scsi3:2: aborting cmd 0x2dc
YYYY-MM-DDTHH:MM:SS.Z In(05) vcpu-92 - PVSCSI: scsi2:2: aborting cmd 0x37a
YYYY-MM-DDTHH:MM:SS.Z In(182) vmkernel: cpu188:45716086)VSCSI: 3473: handle 196348699146723760(GID:8624)(vscsi0:3):Reset request on FSS handle 1892843346 (0 outstanding commands) from (vmm0:)

核心原因分析

根据 KB 427086 的解释,问题的根本原因是:

精细内存跟踪缓冲器溢出

当虚拟机在 vMotion 期间同时处理大量 I/O 请求时:
1. 高 I/O 活动会导致精细内存跟踪缓冲器溢出
2. 系统会回退到粗粒度跟踪模式
3. 在这种模式下,单个内存变更会标记整个大内存块为已修改,而不是仅标记特定页面
4. 这种“放大”效应会极大地增加 CPU 开销,导致系统过载和 I/O 超时

解决方案

1. 未来版本改进

根据 KB 文章,VMware 已经在即将发布的 VCF 9.1 版本中彻底解决了这个问题。新版本将改变 vMotion 期间内存跟踪的实现方式,消除缓冲器溢出和内存跟踪放大效应。

2. 临时解决方法

虽然目前没有立即的修复补丁,但可以通过以下方法减轻问题:

# 1. 在低 I/O 活动期间执行 vMotion
# 这可以减少缓冲器溢出的风险

 

# 2. 调整虚拟机的内存配置
# 对于非常大的内存分配,可以考虑:
# - 减少内存分配(如果可能)
# - 调整内存预留和限制设置

 

# 3. 监控系统资源使用情况
# 在 vMotion 过程中,密切监控主机的 CPU 和内存使用情况
esxcli system process list | sort -k 3 -r

 

# 4. 使用网络优化
# 确保 vMotion 网络带宽充足
esxcli network vswitch standard list

 

# 调整 vMotion 网络 MTU(如果支持)
esxcli network vswitch standard portgroup set -p "vMotion" -m 9000

操作步骤

1. 检查虚拟机和主机状态

# 检查虚拟机内存分配
Get-VM | Select-Object Name, MemoryGB, NumCpu

 

# 检查主机资源使用情况
Get-VMHost | Select-Object Name, CpuUsageMhz, CpuTotalMhz, MemoryUsageGB, MemoryTotalGB

2. 监控 vMotion 过程

# 在 vMotion 过程中,使用 PowerCLI 监控资源使用情况
Get-VMHost | Get-Stat -Stat cpu.usage.average, mem.usage.average -Realtime | Select-Object @{N="Host";E={$_.Entity.Name}}, @{N="Metric";E={$_.MetricId}}, @{N="Value";E={$_.Value}}, @{N="Timestamp";E={$_.Timestamp}}

3. 分析日志信息

# 查看 vMotion 相关的警告和错误
Get-VMHost -Name  | Get-Log -Key vmkernel | Where-Object {$_.Message -like "*vmotion*" -and $_.Severity -gt "Info"}

预防措施

1. 规划迁移时间

# 在低业务负载时段执行虚拟机迁移
# 使用 PowerCLI 检查虚拟机活动
Get-VM | Select-Object Name, @{N="CPUUsage";E={$_.ExtensionData.Summary.QuickStats.OverallCpuUsage}}, @{N="MemoryUsage";E={$_.ExtensionData.Summary.QuickStats.HostMemoryUsage}}

2. 优化内存配置

# 调整虚拟机内存预留和限制
Get-VM -Name  | Set-VM -MemoryReservationGB  -MemoryLimitGB  -Confirm:$false

3. 监控系统资源

# 使用 vRealize Operations Manager 或其他监控工具
# 设置资源使用情况的警报和通知

故障排查

1. 识别受影响的虚拟机

# 根据日志信息识别受影响的虚拟机
Get-VM | ForEach-Object {
    $vm = $_
    $vmwareLog = Get-Content (Get-VMHost -Id $vm.VMHostId | Get-Datastore | ForEach-Object {
        "$($_.DatastoreBrowserPath)$($vm.FolderPath.Split('/')[-1])/$($vm.Name).log"
    }[0])
    if ($vmwareLog -match "scsi.*abort") {
        $vm | Select-Object Name, MemoryGB, NumCpu
    }
}

2. 检查网络配置

# 验证 vMotion 网络配置
Get-VMHostNetworkAdapter -VMHost  -VirtualSwitch 

总结

VMware KB 427086 详细说明了大内存虚拟机在 vMotion 过程中出现的内存传输导致无响应的问题。虽然目前没有立即的修复方案,但了解问题的原因可以帮助我们更好地规划和优化虚拟机迁移过程。

建议:
1. 在低 I/O 活动期间执行 vMotion
2. 密切监控系统资源使用情况
3. 调整虚拟机内存配置(如有可能)
4. 等待 VCF 9.1 版本的正式发布,该版本将彻底解决此问题

记住,对于分配了大量内存的虚拟机,vMotion 过程需要特别注意,因为它们对资源的需求更高,更容易受到内存跟踪放大效应的影响。


Reference: VMware KB 427086

有VM问题需要协助?

免费试用VMware技术助理(已接Deepseek)!即时解答VM难题

→ 🤖VM技术助理

解析和诊断各类vCenter错误,ESXi日志,虚拟机vmware.log

→ 📕VMware日志分析器

图书推介 - 京东自营

24小时热门

还有更多VMware问题?

免费试下我们的VMware技术助理(已接Deepseek)!即时解答VM难题 → 🤖VM技术助理

试试 📕VMware日志分析器 免费诊断各类vCenter错误,ESXi日志,虚拟机vmware.log等等

########

扫码加入VM资源共享交流微信群(请备注加群

需要协助?或者只是想技术交流一下,直接联系我们!

推荐更多

//omg10.com/4/9119499