What is SMB3 with RDMA / SMB Direct

Following the full release of Violin’s WFA product, I can now share some of my understanding gained from using it over the last six months or so. Violin’s WFA – “Windows Flash Array”-  is a storage system that embeds a specially optimised version of Windows 2012 R2 on our gateway modules and provides very fast performance to SQL, Hyper-V and other application environments over SMB3. For more details see HERE, or for Microsofts view you can review the TechNet blog here.

This is the first of a number of blog entries to provide some further technical detail on the product and the benefits it provides.

 

Screen Shot 2014-04-22 at 11.14.22 AM

While it is essentially a simple premise and a product that is very easy to use and manage, it has taken me a while to get my head around the new vocabulary associated with using the latest version of SMB3. SMB Direct, iWARP, RoCE, SMB-Multichannel  are all technologies and acronyms that combine to deliver the biggest benefits to SMB3 over previous versions of the protocol. What are those benefits I hear you ask? In short they fall into two areas: performance and availability.

cheeter

Performance: with the improvements in the protocol, we can now drive very high bandwidth and very low latency from a modest Windows server only using a small amount of CPU resource. I have done my own testing and can confirm that the latencies are significantly lower then FC to the same array for nearly every IO profile…. For full details of the performance numbers please contact your Violin representative.

Why is it faster? The simple answer is RDMA. Microsoft have added the capability to perform data transfers via “Remote Direct Memory Access” to SMB3 and named it SMB Direct. In my simple understanding, RDMA allows one system to perform a data copy by directly reading or writing from the memory of another computer, avoiding many levels of protocol overhead. There are two competing implementations that are both supported by SMB Direct; iWARP and RoCE and interfaces either support one or the other.

The other nice thing about SMB-Direct is that it requires no setup, if the environment supports SMB-Direct it just works. The easiest way to tell if it’s working is by looking at the SMB-Direct counters in perfmon, or using the powershell “commandlet” Get-SmbMultichannelConnection.

Screen Shot 2014-04-22 at 11.10.48 AM

 

Availability: Microsoft have added a new capability in to the SMB protocol called SMB-Multichannel. This automatically detects and utilises all available paths to an SMB share that are running at the fastest speed. It is like MPIO or Ethernet link bonding, but requires no manual setup or additional software and provides very fast failover and failback. Failover between cluster nodes on the Violin WFA are pretty much undetectable to a client server; even when physically pulling a network link on a client under very heavy load IO continues with little interruption. The below example is created by saturating 4 links on a client before pulling one link, then reinserting it 30 seconds later.

linkremoval and re-add

Historically I have been reluctant to recommend file based shared storage solutions for applications or databases that require the lowest latency and the highest reliability. However, with SMB3 and SMBDirect we get higher bandwidth and lower latency storage connectivity with automatic resiliency. When combined with the Violin 6000 array as WFA you get a very high performance solution that is very easy to manage.

Look out for the next blog to provide comparisons with FC & SMB3 traffic and also SMB3 with and without RDMA…

Yum update Oracle linux 6u2 to 6u5 causes direct connect lun visibility issues BFA HBAs

One of my esteemed Oracle colleagues recently discovered a problem accessing his data after upgrading a system with Yum to 6u5. He was upgrading to get the newer UEK kernel but he also ended up with a newer Brocade HBA driver.

 Brocade FC/FCOE Adapter, hwpath: 0000:8b:00.1 driver: 3.0.2.2   <- before upgrade

 Brocade FC/FCOE Adapter, hwpath: 0000:8b:00.1 driver: 3.1.2.1  <- after upgrade

It took a while to spot the problem because there are no obvious errors but it seems that the default behavior of the Brocade HBAs had changed. I think this is specific to “direct connect” storage connections (ones with no switch between server and storage ports).

On the older version all was working well with the storage FC ports set to “Point to Point” only and the adapters set as default (also point to point).

After switching the upgrade to get a functional environment we had to switch the storage array ports to “Loop preferred” the host and storage then successfully negotiated a “Point to Point”  communication.

The only indication of the problem was the below entrys from the messages file.

Apr 22 16:52:31 kernel: bfa 0000:86:00.0: Remote port (WWN = 21:00:00:24:ff:34:6c:ba) connectivity lost for logical port (WWN = 10:00:00:05:1e:59:f3:9e)

Apr 22 16:52:31 kernel: bfa 0000:86:00.0: Target (WWN = 21:00:00:24:ff:34:6c:ba) connectivity lost for initiator (WWN = 10:00:00:05:1e:59:f3:9e)

 

 

 

SLES 11 SP3 error from multipath rport-6:0-0: failed to set fast_io_fail_tmo to 5, error 22

SLES 11 SP has quite a few differences from other flavours and from earlier versions of SLES in the format of it multipth.conf configuration. When testing in the lab i hit a new error which stumped me for a while,

When scanning for multipath devices I was getting the below entry.

rport-6:0-0: failed to set fast_io_fail_tmo to 5, error 22

I found that i could get rid of this error by setting both fast_io_fail_tmo and  dev_loss_tmo explicitly in a custom multipath.conf entry. This appeared to work, but should not be required as the SLES defaults are fine.

However a quick gateway failover test showed that setting these parameters had had a very bad effect on path failback time. Increasing failover from subsecond to multiple minutes.

After some scratching of heads the solution was obscure but simple. I had rr_min_io set as this had provids a significant performance boost on other versions of linux. This parameter is deprecated as of SLES 11sp2. With this parameter and the tmo parameters removed from the configuration path and controller failover again works perfectly.

So the sles 11 SP3 version of the multipath.conf devices entry looks like this for Violin.

devices {
device {
vendor                  “VIOLIN”
product                 “SAN ARRAY”
path_grouping_policy    group_by_serial
path_selector           “round-robin 0”
path_checker            tur
hardware_handler        “0”
failback                immediate
rr_weight               uniform
no_path_retry           fail
}
device {
vendor                  “VIOLIN”
product                 “SAN ARRAY ALUA”
path_selector           “round-robin 0”
prio                    “alua”
path_grouping_policy    group_by_prio
path_checker            tur
hardware_handler        “0”
failback                immediate
no_path_retry           fail
detect_prio             yes

Infiniband SRP and fast small IOPS

A couple of months ago I hit a problem getting Infiniband SRP connectivity functional on SLES 11 SP1 with the XEN kernel running. I first struggled to find the documentation, to get the SRP running on the non-standard Kernel. Then when it was running I struggled to get the respectable levels of IOPS performance from a single Violin Memory Array LUN.

Once you have IB connectivity to the storage working this gives you the ability to combine a resilient high bandwidth, low latency, network and storage connections on to a single card or pair of cards.

The interesting bit was the final step to get good performance above of 100k IOPS from an individual LUN. To do this I had to dedicate cores to the Hypervisor (Dom0) and also lock the affinity of those cores to a single CPU.

Different variations of the core count and which cores from which socket to pin have since been seen to provide benefits to other versions of Xen on linux distributions and different hardware platforms. I should note this is not an optimisation setting specific to IB SRP connectivity, we have seen a similar benefit when using FC connectivity

Of course depending on how you utilise the Guest VMs may determine if the extra performance from dedicating cores to the Hypervisor, is worth potentially reducing the cores available to Guests.

More details are below, in case any one is working on a similar setup, or is struggling to sleep 🙂

Steps required installing and configuring IB SRP connectivity on SLES 11 SP1

Step 1, Install the OS
Install SLES with xen host option ticked or add xen from yast option afterwards. (problems have been seen on the SM hardware nics installing the xen kernel during install.
Change /boot/grub/menu.lst file to point at the xen kernel by default and reboot.

Step 2,
Install pre req packages required to be able to compile IB drivers for the xen kernel.
The list is in the readme file on the driver package from Mellanox.

On SLES this is easiest from yast

From read me
OS Distribution Required Packages
————— ———————————-
General:
o Common to all gcc, glib, glib-devel, glibc, glibc-devel,
glibc-devel-32bit (to build 32-bit libraries on x86_64
and ppc64), zlib-devel, libstdc++-devel
o RedHat, Fedora kernel-devel, rpm-build, redhat-rpm-config
o SLES kernel-source, kernel-syms, rpm

Note: To build 32-bit libraries on x86_64 and ppc64 platforms, the 32-bit
glibc-devel should be installed.

Step3 Re-compile the Mellanox driver for SLES to include SRP support.
Copy the Mellanox driver bundle to the server and mount the iso

mount -o ro,loop MLNX_OFED_LINUX-1.5.3-3.1.0-SLES11sp1-x86_64.iso /mnt/MLNX_OFED_LINUX-1.5.3-3.1.0-SLES11sp1-x86_64.iso

Copy the fies from the iso to a temporary folder and run

server1:/tmp/tom # ./mlnx_add_kernel_support.sh -i /root/MLNX_OFED_LINUX-1.5.3-3.1.0-SLES11sp1-x86_64.iso
Note: This program will create MLNX_OFED_LINUX ISO for SLES11sp1 under /tmp directory.
All Mellanox, OEM, OFED, or Distribution IB packages will be removed.
Do you want to continue?[y/N]:y
See log file /tmp/mlnx_ofed_iso.6694.log

Building OFED RPMs. Please wait…
Removing OFED RPMs…
Running mkisofs…
Created /tmp/MLNX_OFED_LINUX-1.5.3-3.1.0-SLES11sp1-x86_64.iso

server1:/tmp/tom # umount /mnt/MLNX_OFED_LINUX-1.5.3-3.1.0-SLES11sp1-x86_64.iso/

server1:/tmp/tom # mount -o ro,loop /tmp/MLNX_OFED_LINUX-1.5.3-3.1.0-SLES11sp1-x86_64.iso /mnt/MLNX_OFED_LINUX-1.5.3-3.1.0-SLES11sp1-x86_64.iso

Install drivers

server1:/mnt/MLNX_OFED_LINUX-1.5.3-3.1.0-SLES11sp1-x86_64.iso # ./mlnxofedinstall
This program will install the MLNX_OFED_LINUX package on your machine.
Note that all other Mellanox, OEM, OFED, or Distribution IB packages will be removed.
Do you want to continue?[y/N]:y

Starting MLNX_OFED_LINUX-1.5.3-3.1.0 installation …

Installing kernel-ib RPM
Preparing… ##################################################
kernel-ib ##################################################
Installing kernel-ib-devel RPM
Preparing… ##################################################
kernel-ib-devel ##################################################
Installing kernel-mft RPM
Preparing… ##################################################
kernel-mft ##################################################
Installing knem RPM
Preparing… ##################################################
knem ##################################################
Installing mpi-selector RPM
Preparing… ##################################################
mpi-selector ##################################################
Installing user level RPMs:
Preparing… ##################################################
ofed-scripts ##################################################
Preparing… ##################################################
libibverbs ##################################################
Preparing… ##################################################
libibverbs ##################################################
Preparing… ##################################################
libibverbs-devel ##################################################
Preparing… ##################################################
libibverbs-devel ##################################################
Preparing… ##################################################
libibverbs-devel-static ##################################################
Preparing… ##################################################
libibverbs-devel-static ##################################################
Preparing… ##################################################
libibverbs-utils ##################################################
Preparing… ##################################################
libmthca ##################################################
Preparing… ##################################################
libmthca ##################################################
Preparing… ##################################################
libmthca-devel-static ##################################################
Preparing… ##################################################
libmthca-devel-static ##################################################
Preparing… ##################################################
libmlx4 ##################################################
Preparing… ##################################################
libmlx4 ##################################################
Preparing… ##################################################
libmverbs ##################################################
Preparing… ##################################################
libmverbs ##################################################
Preparing… ##################################################
libmlx4-devel ##################################################
Preparing… ##################################################
libmlx4-devel ##################################################
Preparing… ##################################################
libmverbs-devel ##################################################
Preparing… ##################################################
libmverbs-devel ##################################################
Preparing… ##################################################
libmqe ##################################################
Preparing… ##################################################
libmqe ##################################################
Preparing… ##################################################
libmqe-devel ##################################################
Preparing… ##################################################
libmqe-devel ##################################################
Preparing… ##################################################
libcxgb3 ##################################################
Preparing… ##################################################
libcxgb3 ##################################################
Preparing… ##################################################
libcxgb3-devel ##################################################
Preparing… ##################################################
libcxgb3-devel ##################################################
Preparing… ##################################################
libnes ##################################################
Preparing… ##################################################
libnes ##################################################
Preparing… ##################################################
libnes-devel-static ##################################################
Preparing… ##################################################
libnes-devel-static ##################################################
Preparing… ##################################################
libipathverbs ##################################################
Preparing… ##################################################
libipathverbs ##################################################
Preparing… ##################################################
libipathverbs-devel ##################################################
Preparing… ##################################################
libipathverbs-devel ##################################################
Preparing… ##################################################
libibcm ##################################################
Preparing… ##################################################
libibcm ##################################################
Preparing… ##################################################
libibcm-devel ##################################################
Preparing… ##################################################
libibcm-devel ##################################################
Preparing… ##################################################
libibumad ##################################################
Preparing… ##################################################
libibumad ##################################################
Preparing… ##################################################
libibumad-devel ##################################################
Preparing… ##################################################
libibumad-devel ##################################################
Preparing… ##################################################
libibumad-static ##################################################
Preparing… ##################################################
libibumad-static ##################################################
Preparing… ##################################################
libibmad ##################################################
Preparing… ##################################################
libibmad ##################################################
Preparing… ##################################################
libibmad-devel ##################################################
Preparing… ##################################################
libibmad-devel ##################################################
Preparing… ##################################################
libibmad-static ##################################################
Preparing… ##################################################
libibmad-static ##################################################
Preparing… ##################################################
ibsim ##################################################
Preparing… ##################################################
ibacm ##################################################
Preparing… ##################################################
librdmacm ##################################################
Preparing… ##################################################
librdmacm ##################################################
Preparing… ##################################################
librdmacm-utils ##################################################
Preparing… ##################################################
librdmacm-devel ##################################################
Preparing… ##################################################
librdmacm-devel ##################################################
Preparing… ##################################################
libsdp ##################################################
Preparing… ##################################################
libsdp ##################################################
Preparing… ##################################################
libsdp-devel ##################################################
Preparing… ##################################################
libsdp-devel ##################################################
Preparing… ##################################################
opensm-libs ##################################################
Preparing… ##################################################
opensm-libs ##################################################
Preparing… ##################################################
opensm ##################################################
opensmd 0:off 1:off 2:off 3:off 4:off 5:off 6:off
Preparing… ##################################################
opensm-devel ##################################################
Preparing… ##################################################
opensm-devel ##################################################
Preparing… ##################################################
opensm-static ##################################################
Preparing… ##################################################
opensm-static ##################################################
Preparing… ##################################################
compat-dapl ##################################################
Preparing… ##################################################
compat-dapl ##################################################
Preparing… ##################################################
compat-dapl-devel ##################################################
Preparing… ##################################################
compat-dapl-devel ##################################################
Preparing… ##################################################
dapl ##################################################
Preparing… ##################################################
dapl ##################################################
Preparing… ##################################################
dapl-devel ##################################################
Preparing… ##################################################
dapl-devel ##################################################
Preparing… ##################################################
dapl-devel-static ##################################################
Preparing… ##################################################
dapl-devel-static ##################################################
Preparing… ##################################################
dapl-utils ##################################################
Preparing… ##################################################
perftest ##################################################
Preparing… ##################################################
mstflint ##################################################
Preparing… ##################################################
mft ##################################################
Preparing… ##################################################
sdpnetstat ##################################################
Preparing… ##################################################
srptools ##################################################
Preparing… ##################################################
rds-tools ##################################################
Preparing… ##################################################
rds-devel ##################################################
Preparing… ##################################################
ibutils2 ##################################################
Preparing… ##################################################
ibutils ##################################################
Preparing… ##################################################
cc_mgr ##################################################
Preparing… ##################################################
dump_pr ##################################################
Preparing… ##################################################
ar_mgr ##################################################
Preparing… ##################################################
ibdump ##################################################
Preparing… ##################################################
infiniband-diags ##################################################
Preparing… ##################################################
qperf ##################################################
Preparing… ##################################################
fca ##################################################
INFO: updating …

IMPORTANT NOTE:
===============

– The FCA Manager and FCA MPI Runtime library are installed in /opt/mellanox/fca directory.
– The FCA Manager will not be started automatically.
– To start FCA Manager now, type:
# /etc/init.d/fca_managerd start

– There should be single process of FCA Manager running per fabric.

– To start FCA Manager automatically after boot, type:
# /etc/init.d/fca_managerd install_service

– Check /opt/mellanox/fca/share/doc/fca/README.txt for quick start instructions.

Preparing… ##################################################
mxm ##################################################
Preparing… ##################################################
infinipath-psm ##################################################
Preparing… ##################################################
infinipath-psm-devel ##################################################
Preparing… ##################################################
mvapich_gcc ##################################################
Failed to install RPMs

Step 4 ConfigureIB services

server1:/mnt/MLNX_OFED_LINUX-1.5.3-3.1.0-SLES11sp1-x86_64.iso # chkconfig –list |grep ib
libvirtd 0:off 1:off 2:off 3:on 4:off 5:on 6:off
openibd 0:off 1:off 2:on 3:on 4:off 5:on 6:off
server1:/mnt/MLNX_OFED_LINUX-1.5.3-3.1.0-SLES11sp1-x86_64.iso # chkconfig openibd 235
server1:/mnt/MLNX_OFED_LINUX-1.5.3-3.1.0-SLES11sp1-x86_64.iso # chkconfig –list |grep opens
opensmd 0:off 1:off 2:off 3:off 4:off 5:off 6:off
server1:/mnt/MLNX_OFED_LINUX-1.5.3-3.1.0-SLES11sp1-x86_64.iso # chkconfig opensmd 235
insserv: warning: script ‘mst’ missing LSB tags and overrides
insserv: Default-Start undefined, assuming default start runlevel(s) for script `mst’
insserv: warning: script ‘mst’ missing LSB tags and overrides
insserv: Default-Start undefined, assuming default start runlevel(s) for script `mst’
server1:/mnt/MLNX_OFED_LINUX-1.5.3-3.1.0-SLES11sp1-x86_64.iso #

server1:/mnt/MLNX_OFED_LINUX-1.5.3-3.1.0-SLES11sp1-x86_64.iso # chkconfig –list |grep multi
multipathd 0:off 1:off 2:off 3:off 4:off 5:off 6:off
server1:/mnt/MLNX_OFED_LINUX-1.5.3-3.1.0-SLES11sp1-x86_64.iso # chkconfig multipathd on
insserv: warning: script ‘mst’ missing LSB tags and overrides
insserv: Default-Start undefined, assuming default start runlevel(s) for script `mst’
server1:/mnt/MLNX_OFED_LINUX-1.5.3-3.1.0-SLES11sp1-x86_64.iso # chkconfig –list |grep multi
multipathd 0:off 1:off 2:off 3:on 4:off 5:on 6:off

Edit the openIB.conf file

server1:/mnt/MLNX_OFED_LINUX-1.5.3-3.1.0-SLES11sp1-x86_64.iso # vi /etc/infiniband/openib.conf
server1:/mnt/MLNX_OFED_LINUX-1.5.3-3.1.0-SLES11sp1-x86_64.iso # cat /etc/infiniband/openib.conf |grep -v ^\#
ONBOOT=yes
NODE_DESC=$(hostname -s)
NODE_DESC_TIME_BEFORE_UPDATE=10
UCM_LOAD=yes
RDMA_CM_LOAD=yes
RDMA_UCM_LOAD=yes
RENICE_IB_MAD=no
RUN_SYSCTL=yes
MTHCA_LOAD=yes
QIB_LOAD=yes
MLX4_LOAD=yes
MLX4_EN_LOAD=yes
MLX4_VNIC_LOAD=no
CXGB3_LOAD=yes
NES_LOAD=yes
IPOIB_LOAD=yes
SET_IPOIB_CM=yes
SDP_LOAD=no
SRP_LOAD=yes
ISER_LOAD=no
RDS_LOAD=no
SRPHA_ENABLE=no
SRP_DAEMON_ENABLE=yes

Put the Violin recommended multipath.conf and vdbench files in place and reboot

Step 6

Export some luns from the Violin master gateway VIP to an igroup containing the guid for the Server in question.

memgate-220953 [v6232: master] (config) # show igroup
Initiator group: IB_SLES #Initiators: 4
guid.0000:c903:0057:8290
guid.0000:c903:0057:8293
guid.0002:c903:0057:8291
guid.0002:c903:0057:8292
memgate-220953 [v6232: master] (config) # show exports
Container LUN Target Initiator LUNID Status
——————————————————————————–
41216F00254 Test_3 hca-a all 3 HA
41216F00254 Test_3 hca-b all 3 HA
41216F00254 Test_4 hca-a all 4 HA
41216F00254 Test_4 hca-b all 4 HA
41216F00254 test hca-a all 1 HA
41216F00254 test hca-b all 1 HA
41216F00254 test_2 hca-a all 2 HA
41216F00254 test_2 hca-b all 2 HA
41216F00254 webfarm1 hca-a all 5 HA
41216F00254 webfarm1 hca-b all 5 HA
41216F00254 webfarm2 hca-a all 6 HA
41216F00254 webfarm2 hca-b all 6 HA
41216F00254 webfarm3 hca-a all 7 HA
41216F00254 webfarm3 hca-b all 7 HA
41216F00254 webfarm4 hca-a all 8 HA
41216F00254 webfarm4 hca-b all 8 HA

Step 7 Check for lun visibility on the server

server1:~ # uname -a
Linux server1 2.6.32.12-0.7-xen #1 SMP 2010-05-20 11:14:20 +0200 x86_64 x86_64 x86_64 GNU/Linux

server1:~ # multipath -ll
mpathe (SVIOLIN_SAN_ARRAY_DF2B3E01F9F71EB6) dm-4 VIOLIN,SAN ARRAY
size=123G features=’0′ hwhandler=’0′ wp=rw
`-+- policy=’round-robin 0′ prio=1 status=active
|- 13:0:0:7 sdi 8:128 active ready running
|- 14:0:0:7 sdq 65:0 active ready running
|- 15:0:0:7 sdy 65:128 active ready running
`- 16:0:0:7 sdag 66:0 active ready running
.
.
.

Step 8 Check performance with vdbench

This may require installing the JRE packages if they are not already

server1:~ # more vdbench_config
sd=sd0,lun=/dev/dm-39,openflags=o_direct

rd=4K_Random_Readbd,wd=4K_Random_Read*,interval=5,iorate=max,elapsed=30,forthreads=(14),
rd=4K_Random_Readce,wd=4K_Random_Read*,interval=5,iorate=max,elapsed=30,forthreads=(16),

server1:~ # ./vdbench -f vdbench_config

Vdbench distribution: vdbench503rc11
For documentation, see ‘vdbench.pdf’.

20:03:24.601 *
20:03:24.601 * This beta version ‘vdbench503rc11’ was built on Fri April 08 9:48:23 MDT 2011.
20:03:24.601 * which is more than 90 days ago.
20:03:24.602 * It is recommended that you look for a newer beta or possibly
20:03:24.602 * a newer GA version.
20:03:24.602 * Of course, it is preferred you download a newer beta version
20:03:24.602 * if available to help test the latest code.
20:03:24.602 *
20:03:24.604 input argument scanned: ‘-fvdbench_config’
20:03:24.732 Starting slave: /root/vdbench SlaveJvm -m localhost -n localhost-10-130120-20.03.24.556 -l localhost-0 -p 5570
20:03:25.823 All slaves are now connected
20:04:22.003 Starting RD=4K_Random_Readbd; I/O rate: Uncontrolled MAX; elapsed=10; For loops: threads=14.0

Jan 20, 2013 interval i/o MB/sec bytes read resp read write resp resp queue cpu% cpu%
rate 1024**2 i/o pct time resp resp max stddev depth sys+u sys
20:04:24.013 1 56772.50 221.77 4096 100.00 0.242 0.242 0.000 5.003 0.075 13.7 4.6 3.7
20:04:26.050 2 59928.50 234.10 4096 100.00 0.235 0.235 0.000 3.139 0.044 14.1 5.0 3.8
20:04:28.052 3 57940.50 226.33 4096 100.00 0.234 0.234 0.000 1.750 0.040 13.5 4.5 3.8
20:04:30.052 4 59416.00 232.09 4096 100.00 0.233 0.233 0.000 5.271 0.065 13.8 3.9 3.5
20:04:32.051 5 59473.00 232.32 4096 100.00 0.232 0.232 0.000 6.729 0.054 13.8 4.2 3.6
20:04:32.054 avg_2-5 59189.50 231.21 4096 100.00 0.233 0.233 0.000 6.729 0.052 13.8 4.4 3.7
20:04:33.003 Starting RD=4K_Random_Readce; I/O rate: Uncontrolled MAX; elapsed=10; For loops: threads=16.0

Jan 20, 2013 interval i/o MB/sec bytes read resp read write resp resp queue cpu% cpu%
rate 1024**2 i/o pct time resp resp max stddev depth sys+u sys
20:04:35.011 1 64992.00 253.88 4096 100.00 0.241 0.241 0.000 6.340 0.064 15.7 4.1 3.5
20:04:37.052 2 63007.00 246.12 4096 100.00 0.251 0.251 0.000 13.526 0.110 15.8 5.4 4.9
20:04:39.051 3 64862.00 253.37 4096 100.00 0.242 0.242 0.000 5.351 0.049 15.7 5.2 4.6
20:04:41.048 4 63141.50 246.65 4096 100.00 0.248 0.248 0.000 18.297 0.101 15.7 5.8 4.9
20:04:43.053 5 65678.00 256.55 4096 100.00 0.240 0.240 0.000 3.297 0.053 15.8 6.1 5.5
20:04:43.055 avg_2-5 64172.12 250.67 4096 100.00 0.245 0.245 0.000 18.297 0.083 15.7 5.6 5.0
20:04:44.003 Starting RD=4K_Random_Readd; I/O rate: Uncontrolled MAX; elapsed=10; For loops: threads=32.0

The above rates of IOPS are very low even for the single LUN on the Slowest of violins arrays that was being tested.

After some research it was found that giving Dom-0 the Hypervisor access to all 8 cores on one CPU socket, and pin’ing the hypervisor to those cores we were able to demonstrate respectable performance.

Prior to the change

21:35:02.003 Starting RD=4K_Random_Readd; I/O rate: Uncontrolled MAX; elapsed=10; For loops: threads=32.0

Jan 20, 2013 interval i/o MB/sec bytes read resp read write resp resp queue cpu% cpu%
rate 1024**2 i/o pct time resp resp max stddev depth sys+u sys
21:35:04.014 1 104751.00 409.18 4096 100.00 0.294 0.294 0.000 5.100 0.098 30.8 9.8 8.4
21:35:06.054 2 96334.50 376.31 4096 100.00 0.324 0.324 0.000 26.977 0.308 31.2 13.7 12.3
21:35:08.054 3 57867.00 226.04 4096 100.00 0.539 0.539 0.000 42.014 0.618 31.2 18.0 16.6
21:35:10.056 4 32946.50 128.70 4096 100.00 0.961 0.961 0.000 40.408 0.698 31.7 17.6 16.5
21:35:12.055 5 30703.00 119.93 4096 100.00 1.034 1.034 0.000 25.417 0.460 31.7 17.4 17.1
21:35:12.059 avg_2-5 54462.75 212.75 4096 100.00 0.577 0.577 0.000 42.014 0.572 31.4 16.7 15.7

After the change
xm vcpu-set Domain-0 8
xm vcpu-pin Domain-0 all all

21:45:33.003 Starting RD=4K_Random_Readd; I/O rate: Uncontrolled MAX; elapsed=10; For loops: threads=32.0

Jan 20, 2013 interval i/o MB/sec bytes read resp read write resp resp queue cpu% cpu%
rate 1024**2 i/o pct time resp resp max stddev depth sys+u sys
21:45:35.015 1 75897.50 296.47 4096 100.00 0.404 0.404 0.000 80.293 0.475 30.7 17.0 14.2
21:45:37.054 2 101608.50 396.91 4096 100.00 0.305 0.305 0.000 5.100 0.126 31.0 29.0 25.8
21:45:39.055 3 105596.00 412.48 4096 100.00 0.288 0.288 0.000 10.910 0.104 30.4 29.8 26.0
21:45:41.050 4 105490.00 412.07 4096 100.00 0.289 0.289 0.000 16.003 0.112 30.5 30.4 25.7
21:45:43.050 5 107178.50 418.67 4096 100.00 0.288 0.288 0.000 7.813 0.108 30.8 32.0 25.9
21:45:43.057 avg_2-5 104968.25 410.03 4096 100.00 0.292 0.292 0.000 16.003 0.113 30.7 30.3 25.9
21:45:44.003 Starting RD=4K_Random_Reade; I/O rate: Uncontrolled MAX; elapsed=10; For loops: threads=64.0