老哥们,今天遇到一个关于虚拟机迁移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







