Wouldn’t the value merely be the requested tx rate minus the actual? Also, why
is ENOBUF interesting?
Bob
From: Andrew Gallatin [mailto:galla...@gmail.com]
Sent: Wednesday, September 17, 2014 6:11 AM
To: Martin T
Cc: Bob (Robert) McMahon; iperf-users
Subject: Re: [Iperf-users] Iperf client sends out less UDP traffic than
determined with "-b" flag
In my (cursory) read of the 3.x code, it looked like it ignores NET_SOFTERROR
returns & retries. It would be nice if it reported the amount of ENOBUF
errors it received like netperf does..
On Wed, Sep 17, 2014 at 4:09 AM, Martin T
<m4rtn...@gmail.com<mailto:m4rtn...@gmail.com>> wrote:
Andrew, Bob,
did I understand you correctly that while ENOBUFS error code is not
shown in Iperf client output, the Iperf client actually takes it into
account and thus sends data out less frequently?
regards,
Martin
On 9/11/14, Bob (Robert) McMahon
<rmcma...@broadcom.com<mailto:rmcma...@broadcom.com>> wrote:
> I thought I remembered hitting the ENOBUFs which is the case per the
> source.
>
> // perform write
> currLen = write( mSettings->mSock, mBuf, mSettings->mBufLen );
> if ( currLen < 0 && errno != ENOBUFS ) {
> WARN_errno( currLen < 0, "write2" );
> break;
> }
> // report packets
> reportstruct->packetLen = currLen;
> ReportPacket( mSettings->reporthdr, reportstruct );
>
> A minor nit, the currLen may need to set to zero when errno==ENOBUFFS before
> the ReportPacket()
>
> Also, ione could count the number of writes that return ENOBUFFS but not
> sure why that's interesting.
>
> As an FYI, I have a tool that manages multiple, distributed iperf sessions
> which I use for wi-fi testing. The following shows an 802.11 AC wi-fi link
> that maxes out around 800Mbs. The offered load is 2G and the iperf client
> seems to be reporting properly and responding as expected when RF
> attenuation is added and then removed.
>
> utf> udp start; udp linkcheck -now; L1 attn 65; UTF::Sleep 0.3; L1 attn 0;
> UTF::Sleep 0.3; udp stop
> 20:45:08 LOG sfast-lx2 iperf -s -w 7350000 -l 1470 -u -i 0.1 -fb -p
> 60001
> 20:45:08 HNDLR_ udp-rx Server listening on UDP port 60001
> (sflx2,file12)
> 20:45:08 HNDLR_ udp-rx Receiving 1470 byte datagrams (sflx2,file12)
> 20:45:08 HNDLR_ udp-rx UDP buffer size: 8388608 Byte (WARNING:
> requested 7350000 Byte) (sflx2,file12)
> 20:45:08 LOG itx-lx1 iperf -c 192.168.1.42 -w 367500 -l 1470 -u -b 2G
> -B 192.168.1.100 -i 0.1 -fb -S 0x0 -T 255 -t 5356800 -p 60001
> 20:45:08 HNDLR udp-tx
> ------------------------------------------------------------
> (43602lx1,file13)
> 20:45:08 HNDLR_ udp-rx [ 3] local 192.168.1.42 port 60001 connected
> with 192.168.1.100 port 60001 (sflx2,file12)
> 20:45:08 HNDLR udp-tx Client connecting to 192.168.1.42, UDP port 60001
> (43602lx1,file13)
> 20:45:08 INFO udp-tx TX start: protocol=UDP Offered rate=2G
> pktsize=1470 delay=5us
> 20:45:08 HNDLR udp-tx Binding to local address 192.168.1.100
> (43602lx1,file13)
> 20:45:08 HNDLR udp-tx Sending 1470 byte datagrams (43602lx1,file13)
> 20:45:08 HNDLR udp-tx UDP buffer size: 735000 Byte (WARNING: requested
> 367500 Byte) (43602lx1,file13)
> 20:45:08 HNDLR udp-tx
> ------------------------------------------------------------
> (43602lx1,file13)
> 20:45:08 HNDLR udp-tx [ 3] local 192.168.1.100 port 60001 connected
> with 192.168.1.42 port 60001 (43602lx1,file13)
> 20:45:08 HNDLR udp-tx [ ID] Interval Transfer Bandwidth
> (43602lx1,file13)
> 20:45:08 HNDLR udp-tx [ 3] 0.000-0.100 sec 11244030 Bytes 899522400
> bits/sec (43602lx1,file13)
> 20:45:08 LOG L1 attn 65
> 20:45:08 INFO ::AF-A Setting attn to 65
> 20:45:08 INFO Sleep 0.3 sec
> 20:45:08 LOG itx-lx1 wl0.0: wlc_send_bar: seq 0x17f tid 0
> 20:45:08 LOG itx-lx1 wl0.0: wlc_send_bar: seq 0x17f tid 0 (repeated 1
> times)
> 20:45:08 LOG L1 attn 0
> 20:45:08 INFO ::AF-A Setting attn to 0
> 20:45:08 INFO Sleep 0.3 sec
> 20:45:08 HNDLR udp-tx [ 3] 0.100-0.200 sec 2625420 Bytes 210033600
> bits/sec (43602lx1,file13)
> 20:45:08 HNDLR udp-tx [ 3] 0.200-0.300 sec 0.00 Bytes 0.00 bits/sec
> (43602lx1,file13)
> 20:45:08 HNDLR udp-tx [ 3] 0.300-0.400 sec 0.00 Bytes 0.00 bits/sec
> (43602lx1,file13)
> 20:45:08 HNDLR udp-tx [ 3] 0.400-0.500 sec 6251910 Bytes 500152800
> bits/sec (43602lx1,file13)
> 20:45:08 HNDLR udp-tx [ 3] 0.500-0.600 sec 10406130 Bytes 832490400
> bits/sec (43602lx1,file13)
> 20:45:08 HNDLR udp-tx [ 3] 0.600-0.700 sec 10229730 Bytes 818378400
> bits/sec (43602lx1,file13)
> 20:45:08 INFO udp Kill signal -HUP sent to (43602lx1,file13) :
> iperf -c 192.168.1.42 -w 367500 -l 1470 -u -b 2G -B 192.168.1.100 -i 0.1
> -fb -S 0x0 -T 255 -t 5356800 -p 60001
> 20:45:09 INFO udp Kill signal -HUP sent to (sflx2,file12) : iperf
> -s -w 7350000 -l 1470 -u -i 0.1 -fb -p 60001
> 20:45:09 HNDLR udp-tx Close actions for event handler
> (43602lx1,file13)
> 20:45:09 INFO udp-tx Closed : (43602lx1,file13)
>
> Bob
> -----Original Message-----
> From: Bob (Robert) McMahon
> Sent: Wednesday, September 10, 2014 5:02 PM
> To: Martin T; galla...@gmail.com<mailto:galla...@gmail.com>
> Cc:
> iperf-users@lists.sourceforge.net<mailto:iperf-users@lists.sourceforge.net>
> Subject: RE: [Iperf-users] Iperf client sends out less UDP traffic than
> determined with "-b" flag
>
> Hi Martin,
>
> Just to confirm Andrew, I'm pretty sure I've seen the write syscall on linux
> return ENOBUFFs. I'll check it out in the next few days and let you know.
>
>
> Bob
> -----Original Message-----
> From: Martin T [mailto:m4rtn...@gmail.com<mailto:m4rtn...@gmail.com>]
> Sent: Wednesday, September 10, 2014 5:12 AM
> To: galla...@gmail.com<mailto:galla...@gmail.com>; Bob (Robert) McMahon
> Cc:
> iperf-users@lists.sourceforge.net<mailto:iperf-users@lists.sourceforge.net>
> Subject: Re: [Iperf-users] Iperf client sends out less UDP traffic than
> determined with "-b" flag
>
> Andrew, Bob:
>
> does Iperf use send() system call? Based on Iperf source code and
> tests with strace, it seems to use write() system call to send data to
> socket and according to write() manual page, it doesn't have a similar
> error to ENOBUFS. However, I could easily be wrong here.
>
>
> Andrew,
>
> if Linux kernel silently drops packets in case the device queue
> overflows, then how does Iperf client know that? For example if I
> start the Iperf client with "iperf -c 10.10.10.1 -fm -t 600 -i 60 -u
> -b 500m" command and thus request Iperf to send data with bandwidth of
> 500Mbps and Iperf client reports me that it has sent data at 120Mbps
> instead of 500Mbps:
>
> [ 3] 0.0-600.0 sec 8602 MBytes 120 Mbits/sec
>
> ..then this means that Iperf client somehow had to know that some of
> the data was dropped or Iperf client was restricted to send data at
> faster rate than 120Mbps. How to explain this behavior?
>
>
> thanks,
> Martin
>
> On 9/8/14, Andrew Gallatin <galla...@gmail.com<mailto:galla...@gmail.com>>
> wrote:
>> No, just that it is fairly new (added 5 years ago in "6ce9e7b ip: Report
>> qdisc packet drops"). Netperf did not have it either, until I tried to
>> figure out why I was getting wildly inaccurate results from netperf (eg,
>> seeing 20Gb/s on a 1GbE link).
>>
>>
>> On Mon, Sep 8, 2014 at 11:34 AM, Bob (Robert) McMahon
>> <rmcma...@broadcom.com<mailto:rmcma...@broadcom.com>
>>> wrote:
>>
>>> Hi Drew,
>>>
>>>
>>>
>>> Thanks for the detailed explanation. Do you know any reason that iperf
>>> doesn’t or shouldn’t set IP_RECVERR on the sending socket(s)?
>>>
>>>
>>>
>>> Thanks,
>>>
>>> Bob
>>>
>>> *From:* Andrew Gallatin
>>> [mailto:galla...@gmail.com<mailto:galla...@gmail.com>]
>>> *Sent:* Monday, September 08, 2014 6:53 AM
>>> *To:* Martin T
>>> *Cc:* iperf-users
>>> *Subject:* Re: [Iperf-users] Iperf client sends out less UDP traffic
>>> than
>>> determined with "-b" flag
>>>
>>>
>>>
>>> Please, there are no "dropping" or "non dropping" NIC drivers, unless
>>> some
>>> driver is so broken that
>>>
>>> it silently returns NETDEV_TX_OK & does not stop its txqueue, but a
>>> driver
>>> that broken would
>>>
>>> not be accepted into the kernel.
>>>
>>>
>>>
>>> What is really happening is that the linux kernel is silently dropping
>>> packets when the device's
>>>
>>> queue is full *AND* when the device queue is too small to hold the
>>> entire
>>> socket buffer's worth
>>>
>>> of traffic. If you want blocking behavior, you need to ensure you have
>>> the driver's queue
>>>
>>> large enough (or the socket buffer small enough) so that the driver's
>>> queue can hold an
>>>
>>> entire socket buffer worth of traffic (* the number of active sockets
>>> per
>>> queue). You can change
>>>
>>> the driver's queue size via ifconfig txqueuelen. It might be better to
>>> reduce the socketbuffer
>>>
>>> size (and remember that linux multiplies whatever value you give it by
>>> 2,
>>> to account for
>>>
>>> slop...).
>>>
>>>
>>>
>>> Note that any silent drops are done by the kernel, not the NIC and that
>>> this is
>>>
>>> (bizarrely) the expected behavior on linux. If you don't believe me,
>>> read the send(2) man page on linux:
>>>
>>> ENOBUFS
>>>
>>> The output queue for a network interface was full. This
>>> generally indicates that the
>>>
>>> interface has stopped sending, but may be caused by
>>> transient congestion. (Normally,
>>>
>>> this does not occur in Linux. Packets are just silently
>>> dropped when a device queue
>>>
>>> overflows.)
>>>
>>>
>>>
>>> If iperf wants a correct accounting of the packets sent by the stack vs
>>> dropped, iperf must set
>>>
>>> the IP_RECVERR sockopt on the sending socket. This stops the kernel
>>> from
>>> silently
>>>
>>> dropping packets, and causes send() to return -ENOBUFS rather than 0
>>> when
>>>
>>> datagram is dropped due to lack of resources (eg, like BSD does).
>>>
>>>
>>>
>>> Drew
>>>
>>
>
------------------------------------------------------------------------------
Slashdot TV. Video for Nerds. Stuff that Matters.
http://pubads.g.doubleclick.net/gampad/clk?id=160591471&iu=/4140/ostg.clktrk
_______________________________________________
Iperf-users mailing list
Iperf-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/iperf-users