我有两个不同的 Hyper-V 2012 R2
使用的环境互联网SCSI连接到虚拟机存储。虽然环境不同(一个是全部 10 GB,而另一个是混合 1 GB / 10 GB,一个使用 RAID 6 中的 SSD 阵列,而另一个是分布在两个阵列中的 RAID 10),但我看到的奇怪行为是相同的。
最重要的是,当我运行磁盘 I/O 测试时直接地在主机上针对 CSV,我得到了平均 IOPS 的一个特定值。但是当我运行相同的测试之内虚拟机与其“本地”磁盘(存储在 CSV 上的 vhdx 文件)相比,我得到了大大减少IOPS 值。
为了便于理解,下面是我正在测试的环境
- 主持人
- Windows 2012 R2 数据中心
- 512 GB
- 48 个逻辑处理器
- 10 GB 光纤用于 iSCSI 流量
- 一 (1) 个虚拟机正在运行
- 贮存
- EqualLogic PS6210S
- 24 块 800GB SSD 组成 RAID 6
- 一 (1) 个 1TB 卷,包含一 (1) 个虚拟机
- 10 GB 光纤
- 主机和阵列连接到专用网络交换机
- 虚拟机
- Windows 2012 R2 数据中心
- 127 GB 动态磁盘
- 动态RAM
- 输入/输出测试
- FIO 2.2.10——测试软件
- 针对 500 MB 测试文件进行 70/30 R/W 混合(请参阅下文了解实际测试配置文件)
当我针对来自的 CSV 运行测试时主持人( C:\ClusterStorage\VM-Infrastructure
),我的读/写 IOPS 约为22k/9k分别。但是,当我在虚拟机中针对其C:\Temp
文件夹运行相同的测试时(虚拟机的 VHDX 文件存储在C:\ClusterStorage\VM-Infrastructure
' 中的阵列上),我得到了13千/6千。
这是一个已知问题吗?是否有任何特定的主机/虚拟机设置我应该查看以使虚拟机性能更接近我在主机上获得的性能?从 22k 读取性能下降到 13k 相当惊人。我认为会有一个轻微在虚拟机中命中,但不是那么多——在某些情况下高达 40%。
[global]
ioengine=windowsaio
directory=C\:\ClusterStorage\VM-Infrastructure
;directory=C\:\Temp
rw=randrw
rwmixread=70
;rwmixwrite=30
direct=1 ; 1 for direct IO, 0 for buffered IO
bs=8k
iodepth=32 ; For async io, allow 'x' ios in flight
invalidate=1 ; Invalidate page cache for file prior to doing io
numjobs=16 ; Create 'x' similar entries for this job
runtime=120
group_reporting ; ?
thread ; Use pthreads instead of forked jobs
[workload]
name=8k7030test
size=500m
答案1
经过进一步的研究以及与存储专家的讨论,罪魁祸首已经被找到。
尽管主机正在运行单身的虚拟机,该虚拟机是仅有的客户端读写存储阵列,内置Hyper-V 存储和网络负载平衡器正在启动并限制虚拟机。当负载平衡器被禁用时,虚拟机的 IOPS 数字与我们直接从主机上看到的数字非常接近。
对于存储操作,延迟临界点值为83 ms
和2 ms
用于网络。据我们所知,默认阈值过于激进或不适合 iSCSI 存储连接。(iSCSI 连接当然会增加延迟,而直接连接或本地存储则不会出现这种延迟。)控制此设置(用于存储)的注册表设置是HKLM\System\CurrentControlSet\Services\StorVsp\IOBalance\Enabled
。将值设置为0
禁用平衡器。
更多信息请访问http://www.aidanfinn.com/?p=13232
我们还没有决定是否要关闭平衡器。显然,它的存在和启动是有原因的。虽然它可能不应该为少数虚拟机打开,但当我开始加载主机时,它会更有用。我的主要目标是理解为什么我的数字如此悬殊。