Re: Router congestion (?) caused by b2 upload-file

"Thomas Rosenstein" <[email protected]> Wed, 04 Nov 2020 08:24:58 +0000
Newsgroups org.kernel.vger.lartc
Message-ID <[email protected]>

On 3 Nov 2020, at 22:32, Rich Brown wrote:

>> On Nov 3, 2020, at 3:15 PM, Thomas Rosenstein 
>> <[email protected]> wrote:
>>
>> Hi all,
>>
>> I have multiple routers which connect to multiple upstream providers, 
>> I have noticed a high latency shift in icmp (and generally all 
>> connection) if I run b2 upload-file --threads 40 (and I can reproduce 
>> this)
>>
>> What options do I have to analyze why this happens?
>>
>> General Info:
>>
>> Routers are connected between each other with 10G Mellanox Connect-X 
>> cards via 10G SPF+ DAC cables via a 10G Switch from fs.com
>> Latency generally is around 0.18 ms between all routers (4).
>> Throughput is 9.4 Gbit/s with 0 retransmissions when tested with 
>> iperf3.
>> 2 of the 4 routers are connected upstream with a 1G connection 
>> (separate port, same network card)
>> All routers have the full internet routing tables, i.e. 80k entries 
>> for IPv6 and 830k entries for IPv4
>> Conntrack is disabled (-j NOTRACK)
>> Kernel 5.4.60
>> 2x Xeon X5670 @ 2.93 Ghz
>> 96 GB RAM
>> No Swap
>>
>> During high latency:
>>
>> Latency on routers which have the traffic flow increases to 12 - 20 
>> ms, for all interfaces, moving of the stream (via bgp disable 
>> session) moves also the high latency
>> iperf3 performance plumets to 300 - 400 MBits
>> CPU load (user / system) are around 0.1%
>> Ram Usage is around 3 - 4 GB
>> if_packets count is stable (around 8000 pkt/s more)
>>
>>
>> for b2 upload-file with 10 threads I can achieve 60 MB/s 
>> consistently, with 40 threads the performance drops to 8 MB/s
>>
>> I do not believe that 40 tcp streams should be any problem for a 
>> machine of that size.
>>
>> Thanks for any ideas, help, pointers, things I can verify / check / 
>> provide additional!
>
> These are the classic symptoms of bufferbloat. I note two indicators: 
> latency jumps 50-100x when uploading, and the decrease in bandwidth 
> (likely caused because ack's are slow to return.) I'm not saying it 
> *is* bufferbloat, but it could be useful to rule it out.
>
> I see you have kernel 5.4, so fq_codel and cake qdisc's should be 
> available. I don't understand enough about your configuration, but 
> you'll want to enable one of those qdisc's "in front of" the 
> bottleneck link so the qdisc can control the queueing. Those qdiscs 
> keep stats to see how much data is queued, how often flow control is 
> given, etc.

Systems are CentOS 7, so the 5.4.60 is a custom compile.

I have another router where this traffic flow goes over with kernel 
3.10.0-229.14.1.el7.x86_64, there the problem is not happening.

>
> I would be curious to hear how this works out.

A bit more info: eth4 and eth4.2300 is the internal port, eth5 and 
eth5.2501 and eth5.2502 are the upstream ports

I replaced now the pfifo queues with fq_codel, cake threw an error (file 
not found), is that a specific compile option? (not according to 
bufferbloat.net)

Still the same happening, as soon as the transfer is started, ping times 
go up to around 10 - 15 ms, the 3.10.0 is unaffected.

Here is the tc -s qdisc output:

qdisc fq_codel 8005: dev eth4 root refcnt 193 limit 10240p flows 1024 
quantum 1514 target 5.0ms interval 100.0ms ecn
  Sent 8374229144 bytes 10936167 pkt (dropped 0, overlimits 0 requeues 
6127)
  backlog 0b 0p requeues 6127
   maxpacket 25398 drop_overlimit 0 new_flow_count 15441 ecn_mark 0
   new_flows_len 0 old_flows_len 0
qdisc fq_codel 8008: dev eth5 root refcnt 193 limit 10240p flows 1024 
quantum 1514 target 5.0ms interval 100.0ms ecn
  Sent 1072480080 bytes 1012973 pkt (dropped 0, overlimits 0 requeues 
735)
  backlog 0b 0p requeues 735
   maxpacket 19682 drop_overlimit 0 new_flow_count 15963 ecn_mark 0
   new_flows_len 0 old_flows_len 0
qdisc fq_codel 8004: dev eth4.2300 root refcnt 2 limit 10240p flows 1024 
quantum 1514 target 5.0ms interval 100.0ms ecn
  Sent 8441021899 bytes 11021070 pkt (dropped 0, overlimits 0 requeues 
0)
  backlog 0b 0p requeues 0
   maxpacket 68130 drop_overlimit 0 new_flow_count 257055 ecn_mark 0
   new_flows_len 0 old_flows_len 0
qdisc fq_codel 8006: dev eth5.2501 root refcnt 2 limit 10240p flows 1024 
quantum 1514 target 5.0ms interval 100.0ms ecn
  Sent 571984459 bytes 2148377 pkt (dropped 0, overlimits 0 requeues 0)
  backlog 0b 0p requeues 0
   maxpacket 7570 drop_overlimit 0 new_flow_count 11300 ecn_mark 0
   new_flows_len 0 old_flows_len 0
qdisc fq_codel 8007: dev eth5.2502 root refcnt 2 limit 10240p flows 1024 
quantum 1514 target 5.0ms interval 100.0ms ecn
  Sent 1401322222 bytes 1966724 pkt (dropped 0, overlimits 0 requeues 0)
  backlog 0b 0p requeues 0
   maxpacket 19682 drop_overlimit 0 new_flow_count 76653 ecn_mark 0
   new_flows_len 0 old_flows_len 0

I'm not sure if that's how you intended it, maybe you could give a 
sample output, or a few commands on how "in front of" is meant?

Is there any tool(s) where I could easily check various buffers and 
their load?

>
>>
>> Thomas
>
> Rich