September 10, 2024

tc fq_codel bufferbloat on bridge

tc, short for traffic control, can do all kinds of things like hook and manage bufferbloat issues, set bandwidth limits and lots of other stuff.

Here’s the setup I use for controlling bufferbloat across a couple bridge interfaces. This will give you a transparent bridge that will “automagically” manage package contention using fq_codel. Later, we’ll add MAC-based traffic limits. This assumes a topology like:

Laptop A ——— 192.168.10.200 — — bridge fq_codel machine B —— laptop C 192.168.10.150
Machine D ——— 192.168.3.50 — —|

Laptop A:

straight gigE interface 192.168.10.200

On server do:

vi /etc/network/interfaces
  enp3s0 mgmt interface
	enp2s0 bridge interface 1
	enp1s0 bridge interface 2
	br0 bridge for 1 and 2
 
  # The loopback network interface 
  auto lo br0 
  iface lo inet loopback 
 
  # The primary network interface 
  allow-hotplug enp3s0 
  iface enp3s0 inet static 
        address 172.16.0.5/24 
	gateway 172.16.0.5 
	dns-nameservers 8.8.8.8
 
  iface enp1s0 inet manual 
	tc qdisc add dev enp1s0 root fq_codel 
 
  iface enp2s0 inet manual 
	tc qdisc add dev enp2s0 root fq_codel 
 
  # Bridge setup 
  iface br0 inet static 
	bridge_ports enp1s0 enp2s0 
	address 192.168.3.75 
	broadcast 192.168.3.255 
	netmask 255.255.255.0 
	gateway 192.168.3

note: I still have to run this command later, will troubleshoot at some point (unless you have suggestions to make it work):

tc qdisc add dev enp1s0 root fq_codel

To start, my pings from Machine A to Laptop C were around 0.75 msec, then I flooded the link from Machine A to Laptop C using:

dd if=/dev/urandom | ssh user@192.168.10.150 dd of=/dev/null

Then my pings went up to around 170 msec. Once I enabled fq_codel on the bridge machine B, my pings dropped to around 10 msec.

To make it start on boot:

crontab -e

# m h dom mon dow command
@reboot /usr/src/start.fq_codel.sh

vi /usr/src/start.fq_codel.sh
#!/bin/bash

/sbin/tc qdisc add dev enp1s0 root fq_codel
/sbin/tc qdisc add dev enp2s0 root fq_codel

chmod 755 /usr/src/start.fq_codel.sh

it seems to be working under load (so far) though load will increase in the next 24 hours so I’ll watch it, but here’s what I get:

tc -s qdisc show dev enp2s0
qdisc fq_codel 8002: root refcnt 2 limit 10240p flows 1024 quantum 1514 target 5.0ms interval 100.0ms memory_limit 32Mb ecn
Sent 4273930406 bytes 3059139 pkt (dropped 0, overlimits 0 requeues 1269)
backlog 0b 0p requeues 1269
maxpacket 54504 drop_overlimit 0 new_flow_count 401 ecn_mark 0
new_flows_len 0 old_flows_len 0