Building a Telco Test Lab Using srsRAN – #4 Network Adapter Optimization

In this chapter I will look into optimizing network adapters for high performance. The default settings of Ubuntu and other Linux distributions are usually not optimized for high throughput.

The optimizations are done on Ubuntu 24.04. I am using an Intel E810 network card with the most recent drivers:

  • ice driver version: 2.3.10
  • iavf driver version: 4.13.16
  • Firmware version: 4.9

To check your current driver and firmware version, use ethtool and modinfo:

ethtool -i enp81s0f0np0
modinfo iavf

Update Intel E810 Drivers

The Intel E810 cards use two important drivers that need to be updated. ice is the driver for the regular network interface. iavf is the driver for the Virtual Functions (VF). Both drivers have to be updated.

You can find the driver packages here:

Download both driver packages and extract them.

Install the ICE driver:

tar xvf ice-2.3.14.xvf
cd ice-2.3.14/src
make
sudo make install

Install the IAVF driver:

tar xvf iavf-4.13.16.tar.gz
cd iavf-4.13.16/src
make
sudo make install

After the installation reboot your system. On the next boot verify the drivers were applied correctly using the following commands:

ethtool -i enp81s0f0np0
modinfo iavf

Update Intel E810 Firmware

Updating the firmware is similar but sometimes challenging because there are two versions:

  • The regular firmware version
  • The Dell OEM firmware version (E810-XXV-stg)

To determine which one you have, identify the PCI IDs:

lspci | grep Ethernet

01:00.0 Ethernet controller: Intel Corporation Ethernet Controller E810-C for SFP (rev 02)
01:00.1 Ethernet controller: Intel Corporation Ethernet Controller E810-C for SFP (rev 02)
01:00.2 Ethernet controller: Intel Corporation Ethernet Controller E810-C for SFP (rev 02)
01:00.3 Ethernet controller: Intel Corporation Ethernet Controller E810-C for SFP (rev 02)
01:01.0 Ethernet controller: Intel Corporation Ethernet Adaptive Virtual Function (rev 02)

Check SR-IOV capability:

sudo lspci -vvv -s 01:00.0 | grep SR-IOV

Download the correct firmware update:

After updating drivers and firmware, reboot the system and verify again:

ethtool -i enp81s0f0np0
modinfo iavf

Update Network Adapter Settings

In this section, I will explain the parameters I usually use to optimize throughput on Intel E810 cards. The optimizations benefit both UDP and TCP traffic. These settings may need small adjustments for other Intel NICs. In this example:

  • enp81s0f1np1 = backhaul traffic

I apply all of the following changes only to the backhaul interface because I am using DPDK for the fronhaul interface. In case you dont want to use DPDK for the fronhaul traffic consider apply the same changes to your fronhaul interface.

1. Enable NIC Flow Control (Pause Frames)

ethtool -A enp81s0f1np1 rx on tx on

Enables Ethernet pause-frame flow control in both directions. Helps avoid packet loss during congestion.

2. Increase Maximum Socket Buffer Sizes

sysctl -w net.core.rmem_max=134217728 net.core.wmem_max=134217728

Sets maximum send/receive buffer size to 128 MB.

3. Configure TCP Receive Buffer Limits

sysctl -w net.ipv4.tcp_rmem="4096 87380 33554432"

Prevents TCP starvation under high load.

4. Configure TCP Send Buffer Limits

sysctl -w net.ipv4.tcp_wmem="4096 65536 33554432"

Allows larger send windows for high-throughput workloads.

5. Increase NIC Packet Backlog Capacity

sysctl -w net.core.netdev_max_backlog=32768

Prevents drops during traffic bursts.

6. Increase NAPI Processing Budget

sysctl -w net.core.netdev_budget=600

Higher packet budget per polling cycle improves stability under load.

7. Increase NAPI Time Budget

sysctl -w net.core.netdev_budget_usecs=12000

Allows up to 12 ms of processing per cycle.

8. Set TCP Congestion Control

sysctl -w net.ipv4.tcp_congestion_control=cubic

Uses the CUBIC algorithm (recommended default).

9. Enable MTU Probing

sysctl -w net.ipv4.tcp_mtu_probing=1

Avoids PMTU black holes.

10. Disable Busy Polling

sysctl -w net.core.busy_poll=0 net.core.busy_read=0

Reduces jitter and CPU usage.

11. Increase NIC Ring Buffer Sizes

ethtool -G enp81s0f1np1 rx 8160 tx 2048

Larger buffers = fewer drops during bursts.

12. Replace Qdisc with FQ (Fair Queuing)

tc qdisc replace dev enp81s0f1np1 root fq flow_limit 100000 quantum 1514 buckets 4096 orphan_mask 1023

Improves fairness and reduces bufferbloat.

13. Increase Interface TX Queue Length

ip link set dev enp81s0f1np1 txqueuelen 10000

Helps absorb bursts before ring-buffer overflow.

14. NIC Offloading Settings

ethtool -K enp81s0f1np1 tso on gso on gro on lro off rxvlan on txvlan on
  • TSO/GSO/GRO: improve throughput
  • LRO: must stay off
  • VLAN hardware tagging: enabled

15. Disable Adaptive Interrupt Moderation

ethtool -C enp81s0f1np1 adaptive-rx off adaptive-tx off rx-usecs 16 tx-usecs 16

Makes interrupt behavior deterministic, that’s better for real-time workloads.

Verify Setup

To verify the setup I connect another server to port 0 (OFH) and 1 (backhaul) of my NIC as shown in the diagram below.

I push traffic from one interface to the other using iperf3. Both ports are connected directly, no switch in between. While testing, I monitor CPU usage (e.g., in htop) and the thorughput to confirm no IRQ or CPU core is overloaded but also the maximum rate is achieved.

Expected:

  • 10G link: ~9.4 Gbit/s
  • 25G link: ~23.5 Gbit/s
  • 100G link: ~94 Gbit/s

First I set up an iperf3 server on the testing server:

iperf3 -s -u

Now I use ipef3 to push traffic in both directions for 60 seconds. While iperf3 runs I monitor htop and the throughput.

iperf3 -c 192.168.1.101 -t 60 -P 8 --bidir  # TCP
iperf3 -c 192.168.1.101 -u -b 10G -t 60 --bidir  # UDP

Reboot Persistence

To make all changes persistent, I add them to the TuneD startup script.
If commands are applied immediately on boot, they are sometimes overridden, which is why I added a delay of 30 seconds.

An updated version of the tuned config is be available here.

Comments
Join the Discussion and Share Your Opinion
Add a Comment

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert