[dns-operations] wrapup of fragmentation/do/tcp discussion requested

Rick Jones rick.jones2 at hp.com
Mon Jun 22 19:00:00 UTC 2009


When I first read "120 connections per second" I thought it seemed 
rather trivial so I started seeing how I could (ab)use netperf to try to 
get an idea of the limits.  I had to make a couple of changes to the 
released 2.4.5 bits to make it work, but for a rough idea of the 
difference in protocol stack overhead between using UDP and TCP, one can 
probably take the _top_of_trunk_ netperf with a suvbersion client 
pointed at:

http://www.netperf.org/svn/netperf2/trunk

and then (ab)use the no-control connection option to run varations on 
the theme of:

manny:~# cat runem
netperf -H 192.168.1.100 -t TCP_CRR -c -C -l 30 -P 0 -- -r 128,4096 -P 
,12345 &
sleep 0.1
for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
do
   netperf -H 192.168.1.100 -t TCP_CRR -c -C -l 30 -N  -P 0 -- -r 
128,4096 -P ,12345 -L 192.168.1.$i &
done
manny:~# cat runem_udp
netperf -H 192.168.1.100 -t UDP_RR -c -C -l 30 -P 0 -- -r 128,4096 -P 
,12345 &
sleep 0.1
for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
do
   netperf -H 192.168.1.100 -t UDP_RR -c -C -l 30 -N  -P 0 -- -r 
128,4096 -P ,12345 -L 192.168.1.$i &
done

The idea being a "full control connection" test up and running, which 
will get the listen (in the case of TCP_CRR) endpoint going or the udp 
socket created in the case of UCP_RR).  The -N is the "no control 
connection" option.  The -P ,12345 sets the remote (server) port number 
and still lets netperf let the stack pick the local port number, the -L 
192.168.1.$1 is picking a different local (netperf side) IP address to 
help avoid TIME_WAIT conflicts.

One could also probably run one really long, but really slow 
(./configure --enable-intervals and then some global -b and -w options) 
first netperf command just to prime the pump and then run the real ones, 
either all from the same system or from different systems.

The server side of the UDP_RR test will be doing recvfrom()/sendto() by 
default.  The server side of the TCP_CRR test will be doing 
accept()/recv()/send()/close() - it started life behaving like an HTTP 
1.0 server might - one transaction per connection.

The -r option sets the request,response size, other help can be found 
either in the manual on netperf.org or emailing me.

The above will be single-threaded on the netserver side.  If you want to 
bring multiple cores into play on the netserver side, you can either add 
a -T ,N option to the "base" netperf command to bind netserver to some 
place other than the interrupt CPU, or you can run muliple "base" 
netperf commands with each using a different "server port number" - why 
not a different server IP - because IIRC I don't pass IP addresses in 
classic netperf control messages only port numbers.

FWIW a 1GbE link seems to max-out at around 29ishK trans/s with 4096 
byte responses.

happy benchmarking,

rick jones

PS - another way to run the UDP_RR side is to ./configure --enable-burst 
and then start incrementing a test-specific -b option to increase the 
number of transactions in flight between netperf and netserver for that 
test.  The TCP_CRR test cannot behave that way though, at least not as 
currently coded.  The TCP_RR test can (I would add a test-specific -D in 
that case) but that will have epsilon for the connection establishment 
overhead.



More information about the dns-operations mailing list