While it can be difficult to have a transfer speed of 1.25GB per second (10Gbp/s), it wouldn't hurt to make sure it works well right?
After some not-so-great performance from my VMXNET3 adapters on napp-it, I decided to investigate how to improve network performance. Theoretically, I believe it is impossible for me to achieve a network transfer of 1.25GB per second.
iPerf
All networking testing is done using iPerf (specifically iPerf 2 as napp-it comes with it bundled). iPerf mesaures network performance through TCP, UDP and SCTP.
For my tests I used the following systems all running iperf
- Ubuntu 14.10 Desktop
- Ubuntu 14.04.3 Server
- Windows Server 2012 R2
- Solaris 11 (running napp-it) - most importantly
Enabling Jumbo Frames
First thing to do is enable jumbo frames. Typically, networks set their 'maximum transmission unit' or MTU to 1500 bytes. A jumbo frame on the otherhand can carry up to 9000 bytes of payload.
To enable jumbo frames on Solaris 11, Oracle provides a very easy guide to this:
1. Select the interface to enable jumbo frames on, list it using the command:
$ dladm show-phys
LINK MEDIA STATE SPEED DUPLEX DEVICE
vmxnet3s0 Ethernet up 10000 full vmxnet3s0
2. See the current MTU, replacing vmxnet3s0 with your interface
$ dladm show-linkprop -p mtu vmxnet3s0
LINK PROPERTY PERM VALUE DEFAULT POSSIBLE
vmxnet3s0 mtu rw 1500 1500 60-9000
3. Turn off the interface to configure it
ifconfig vmxnet3s0 unplumb
4. Set MTU to 9000
dladm set-linkprop -p mtu=9000 vmxnet3s0
5. Re-enable the interface
ifconfig vmxnet3s0 plumb 10.0.0.5/24 up
6. Check if it has updated
$ dladm show-link vmxnet3s0
LINK CLASS MTU STATE BRIDGE OVER
vmxnet3s0 phys 9000 up -- --
At this point you can test the Jumbo Frames using a ping to a machine which can accept an MTU of 9000. I did a ping to my Ubuntu Desktop.
$ ping -s 10.0.0.16 9000 4
PING 10.0.0.16: 9000 data bytes
9008 bytes from 10.0.0.16: icmp_seq=0. time=0.223 ms
9008 bytes from 10.0.0.16: icmp_seq=1. time=0.228 ms
9008 bytes from 10.0.0.16: icmp_seq=2. time=0.243 ms
9008 bytes from 10.0.0.16: icmp_seq=3. time=0.222 ms
----10.0.0.16 PING Statistics----
4 packets transmitted, 4 packets received, 0% packet loss
round-trip (ms) min/avg/max/stddev = 0.222/0.229/0.243/0.010
Enable Jumbo Frames everywhere
At this point you'll want to enable Jumbo Frames everywhere, most importantly ESXi vSwitches and even physical switches. Simply do this by changing the MTU to 9000.
Of course this depends on the hardware you are using so I can't help much here.
Disable LSO
LSO or Large Segment Offload is a technology to reduce CPU while having better network performance through segmentation. Segmentation however is not required if we are using an MTU of 9000 however.
1. Run the following command to disable LSO though Solaris
ndd -set /dev/ip ip_lso_outbound 0
2. Disable LSO through the VMXNET3 driver. Edit /kernel/drv/vmxnet3s.conf. I changed EnableLSO and MTU near the bottom of the file.
EnableLSO=0,0,0,0,0,0,0,0,0,0;
MTU=9000,9000,9000,9000,9000,9000,9000,9000,9000,9000;
Tuning
Finally tune TCP parameters to accommodate the faster speeds
ipadm set-prop -p max_buf=4194304 tcp
ipadm set-prop -p recv_buf=1048576 tcp
ipadm set-prop -p send_buf=1048576 tcp
Test out your new performance
Start iperf 2 as a server on napp-it
cd /var/web-gui/data/tools/iperf
./iperf -s
On another computer, run iperf as a client to connect to napp-it.
Here are the results from my Windows Server 2012 VM. It is quite common to see decreased speeds when running iPerf on Windows. Only 1.82 gigabits per second.
C:iperf.exe -c 10.0.0.5
------------------------------------------------------------
Client connecting to 10.0.0.5, TCP port 5001
TCP window size: 63.0 KByte (default)
------------------------------------------------------------
[ 3] local 10.0.0.16 port 50879 connected with 10.0.0.5 port 5001
[ ID] Interval Transfer Bandwidth
[ 3] 0.0-10.0 sec 2.12 GBytes 1.82 Gbits/sec
Results from Ubuntu Desktop! Amazing! 15.4 gigabits per second!!!
$ iperf -c 10.0.0.5
------------------------------------------------------------
Client connecting to 10.0.0.5, TCP port 5001
TCP window size: 325 KByte (default)
------------------------------------------------------------
[ 3] local 10.0.1.29 port 59889 connected with 10.0.0.5 port 5001
[ ID] Interval Transfer Bandwidth
[ 3] 0.0-10.0 sec 17.9 GBytes 15.4 Gbits/sec
From my Windows 10 Desktop. It's going over a gigabit switch that does not support Jumbo Frames. 528 megabits per second.
C:>iperf-2.0.5-3-win32>iperf.exe -c 10.0.0.5
------------------------------------------------------------
Client connecting to 10.0.0.5, TCP port 5001
TCP window size: 63.0 KByte (default)
------------------------------------------------------------
[ 3] local 10.0.1.41 port 54698 connected with 10.0.0.5 port 5001
[ ID] Interval Transfer Bandwidth
[ 3] 0.0-10.0 sec 630 MBytes 528 Mbits/sec