We were using iperf3 at work to test a network path (we wanted the
fixed-rate throttling that it can do).  And while TCP would fill the 50Mbps
link from the ISP, UDP couldn't.  UDP couldn't get over 8Mbps of goodput,
no matter what rate we specified on the command line.

We found a 100ms timer that's used to PWM the packet transmission to
perform the throttling.  Fine for TCP, fine where the end-to-end physical
links are the same rate.  But throw a 10:1 rate change through a switch
into that, and suddenly you find out that the switch isn't that bloated.

I modified iperf3 to use a 1ms timer, and was able to get things much
smoother.  I doubt it's as smooth as iperf3 gets on Linux when fq pacing is
used, but it's a big improvement vs. the nice small buffers in switches.

I put together a writeup with graphs on my blog:

I have a forked version of iperf3 on github:

This uses the 1ms timer, and has a few other fixes, such as it resets the
throttling calculations at the start of each stats interval.  That change
stops iperf3 from transmitting at maximum rate after congestion has stopped
it from achieving the target rate.  There will be another writeup on that,
but I need to get some good sample data together for graphing.

-Aaron Wood
Bloat mailing list

Reply via email to