Windows – Different versions of iperf for windows give totally different results

iperfnetworkingtcpwindows

Measuring TCP output from a Windows client to Solaris server:
WXP SP3 with iperf 1.7.0 –> returns an average around 90Mbit
Same client, same server but iperf 2.0.5 for windows –> returns an average of 8.5 Mbit

Similar discrepancies have been observed connecting to other servers (W2008, W2003)

It's difficult to get to some conclusions when different versions of the same tool provide vastly different results.

Example below:

C:\temp>iperf -v (from iperf.fr)
iperf version 2.0.5 (08 Jul 2010) pthreads

C:\temp>iperf -c solaris10
Client connecting to solaris10, TCP port 5001
TCP window size: 64.0 KByte (default)

[ 3] local 10.172.181.159 port 2124 connected with 10.172.180.209 port 5001
[ ID] Interval Transfer Bandwidth
[ 3] 0.0-10.2 sec 10.6 MBytes 8.74 Mbits/sec

Abysmal perfomance, but now I test from the same host (Windows XP SP3 32bit and 100Mbit) to the same server (Solaris 10/sparc 64bit and 1Gbit running iperf 2.0.5 with default window of 48k) with the old iperf

C:\temp>1iperf -v
iperf version 1.7.0 (13 Mar 2003) win32 threads

C:\temp>1iperf.exe -c solaris10 -w64k
Client connecting to solaris10, TCP port 5001
TCP window size: 64.0 KByte

[1208] local 10.172.181.159 port 2128 connected with 10.172.180.209 port 5001
[ ID] Interval Transfer Bandwidth
[1208] 0.0-10.0 sec 112 MBytes 94.0 Mbits/sec

So one iperf with a 64k window says 8.75Mbit and the old iperf with the same window size
says 94.0Mbit. These results are constant through repeated tests.

From my testing launching iperf(old) with window size "x" and iperf(new) with window size "x" instead of producing the same or very close results produce totally different results.
The only difference I see is the old compiled as win32 threads vs. pthreads but parallelism (-P 10) appears to work in both.

Anyone has a clue or can recommend a tool that gives results I can trust??

EDIT: Looking at traces from (old) iperf it sets the TCP Window Scale flag to 3 in the SYN packet, when I run the (new) iperf this is set to 0 in the initial packet. A quick analysis of the window size through the exchange shows the (old) iperf moving back and forth but mostly at 32k while the (new) iperf mostly keeps at 64k. Maybe it will help somebody to connect the dots.

Best Answer

The later version of iperf you have is using a different threading library (win32 threads vs. pthread). That alone could explain the difference in performance.

There could be some other code difference between 1.x and 2.x of iperf. It could be simple like the default options changed from 1.x to 2.x (such as TCP_WINDOW_SIZE, ...).

Make sure both are using TCP (or udp), for example by re-running with the --udp option.

You might try the iperf-users mailing list archives, or even posting your question there.