[netperf-talk] SCTP Benchmark significantly slow
Rick Jones
rick.jones2 at hp.com
Fri Jun 1 14:22:15 PDT 2007
Vlad Yasevich wrote:
> Chris Lydick wrote:
>
>>So, it does look like TSO and CKO are both being utilized for TCP like
>>you said, Rick.
>
>
> Well, since the cards don't have any support for SCTP, TCP gets the
> advantage there.
>
>
>>As for the memory, here's that info:
>>
>>$ RMEM_DEF=`cat /proc/sys/net/core/rmem_default`; echo $RMEM_DEF
>>129024 (it was the same for wmem_default)
>>
>>$ RMEM_MAX=`cat /proc/sys/net/core/rmem_max`; echo $RMEM_MAX
>>16777216 (again, same for wmem_max)
>>
>>Now, here's the output that appears when I'm running netperf. Mind you,
>>on the other end of things (at server host), the command I ran was
>>"netserver -4".
>>
>>$ LOC_RATE=`./netperf -t REM_CPU`; echo $LOC_RATE
>>100
>>$ REM_RATE=`./netperf -H xxx.xxx.xxx.xxx -t REM_CPU`; echo $REM_RATE
>>100
>>$ ./netperf -H xxx.xxx.xxx.xxx -c $LOC_RATE -C $REM_RATE -t SCTP_STREAM
>>-l 30 -a $RMEM_MAX,$RMEM_MAX -A $RMEM_MAX,$RMEM_MAX
>
>
> why are you specifying the alignment of 16777216?
That could be having some rather significant consequences on the buffer
allocation being done by netperf. It will add that value to the size of
the buffers it allocates, and since it sends from a ring of buffers,
which has as many entries as SO_[SND|RCV]BUF size divided by the
send/recv size plus one entry you are likely asking netperf to be
skipping all over the place cache-miss wise. The default alignement for
a netperf buffer is 8 bytes, which (at least at the time) was sufficient
for optimal copy routines.
>
> Let's do some math:
>
> mtu = 9000.
> largest sctp data without fragments (optimum result):
> 9000 - 20 - 12 (sctp hdr) - 16 (data hdr) = 8952
>
> That's your ideal message size. Remember that SCTP is a message oriented
> protocol that preserves message boundaries.
>
> So try running:
> netperf -H xxx.xxx.xxx.xxx -c $LOC_RATE - C $REM_RATE -t SCTP_STREAM \
> -l 30 -- -s $RMEM_MAX,$RMEM_MAX -S $RMEM_MAX,$RMEM_MAX -m 8952
>
> (I think I got that right)
Replacing the global -a/-A with test-specific -s/-S is almost certainly
the right thing to do.
FWIW, the CPU util mechanism on Linux does not require calibration, so
while stuff cribbed from the increasingly ancien example scripts will
still work, the $REM_RATE $LOC_RATE stuff isn't strictly necessary to
maintain quick measurement times. Doesn't hurt really, as if you are on
a reasonably current netperf (forget which) the calibration-free CPU
util mechanisms will have the REM_CPU or LOC_CPU tests finish in very
much less than the traditional 40 seconds.
>
>>Here's another issue... When running a utility I found a while back
>>called SCTPPerf (http://tinyurl.com/34hcwu), I was able to get better
>>results... My best throughput test was using the following parameters.
>>While it seems I could use this program, I'd much rather work with
>>Netperf. Any suggestions on this one? *Note* message length is 8938
>>because that plus lower-layer headers = 9000 bytes, the MTU.
>>
>>(server) $ ./scptperf_srv -P 6420 -H xxx.xxx.xxx.xxx -f 16384 -v
>>(client) $ ./scptperf_clnt -P 6421 -p 6420 -H xxx.xxx.xxx.xxx -h
>>xxx.xxx.xxx.xxx -l 8938 -f 16384 -t 1 -v -m 1 -x 1
I take it there are "SCTP calls" one can make to set congestion window
parameters (-f)?
The URL was somewhat thin on units, but I'm guessing that the test ran
for only one second? Seems confirmed by the output below. Might be
enough, but I'd be more comfortable with a longer run time.
One other thing that netperf does is make certain the remote has
received all the data - and I am pretty sure that carried over into the
netperf SCTP tests. In nettest_bsd.c for say send_tcp_stream() you can
see the call to shutdown() followed by the call to recv() to get the
indication that the remote has seen our close and has drained all the
data. It would be good, especially for very short runs, to make sure
that this SCTPperf tool does something similar.
>>
>>Local host: xxx.xxx.xxx.xxx
>>Local port: 6421
>>Remote host: xxx.xxx.xxx.xxx
>>Remote port: 6420
>>Packet size: 8938
>>Measure period: 1
>>Print period: 1
>>Streams: 1
>>Sender buffer: 16777216
>>Receiver buffer: 16777216
>>Verbose: 1
>>
>>Binding single address
>>
>>[2007/06/01 19:35:15] 1s_BDW = 873.425110 Mbits/s, PACKETS = 12809, TIME
>>= 1 sec 46 usec
>>
>>BEGIN: 2007/06/01 19:35:14
>>END: 2007/06/01 19:35:15
>>TIME: 1 sec 46 usec
>>MESSAGE SIZE: 8938 bytes
>>SENT: 12809 messages
>>DATA SENT: 114486842 bytes
>>BANDWIDTH: 873.425110 Mbits/s
>>
>>Are there any alternate libraries for SCTP I might be able to download
>>and try? Or are the libraries I included in the first email sufficient?
>>
>
>
> It's not the issue of libraries. The libraries are just a tiny shim layer
> that lets you write apps easier instead of messing around with all the
> sendmsg() stuff.
>
>
>>I'm ready to start digging through the source code on both programs and
>>see if there are different SCTP calls between SCTPPerf and Netperf.
>>Looking forward to a reply :)
By all means start digging. Netperf would love additional input on the
tests.
> You can also try iperf. That also has SCTP support.
>
> My guess the difference in results in the difference in message sizes that are
> used by each application. What you want to avoid is any semblance of SCTP level
> fragmentation as that will always slow things down.
>
> -vlad
More information about the netperf-talk
mailing list