I have two different Hyper-V 2012 R2
environments that use iSCSI to connect to their virtual machine storage. While the environments are different (one is all 10 GB whereas the other is mixed 1 GB / 10 GB, one is using an SSD array in RAID 6 whereas the other is RAID 10 spread across two arrays), the odd behavior I am seeing is the same.
Bottom line is that when I run a disk i/o test directly on the host against the CSV, I get a particular value for average IOPS. However when I run the same test within the virtual machine against its "local" disk (the vhdx file that is stored on the CSV), I get a greatly reduced IOPS value.
To put things in perspective, here is the environment I am testing
- Host
- Windows 2012 R2 Datacenter
- 512 GB
- 48 Logical processors
- 10 GB fiber for iSCSI traffic
- One (1) virtual machine running
- Storage
- EqualLogic PS6210S
- 24 800GB SSD in RAID 6
- One (1) 1TB volume containing one (1) vm
- 10 GB fiber
- Host and Array are connect to dedicated network switches
- Virtual Machine
- Windows 2012 R2 Datcenter
- 127 GB dynamic disk
- Dynamic RAM
- I/O Test
- FIO 2.2.10 -- Test Software
- 70/30 R/W mix against 500 MB test files (see below for actual test config file)
When I run the test against the CSV from the host (C:\ClusterStorage\VM-Infrastructure
), I get read/write IOPS of about 22k/9k, respectively. However, when I run that same test within the VM against its C:\Temp
folder (with the VM's VHDX file being stored on the array in C:\ClusterStorage\VM-Infrastructure
') I get numbers of 13k/6k.
Is this a known problem? Are there any particular host/vm settings that I should be looking at to get the vm performance closer to what I get on the host? A drop from 22k read performance to 13k is pretty dramatic. I figured that there would be a slight hit within the vm but not this much -- as high as 40% in some cases.
[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