How to Use ethtool in Linux to Configure Network Interface Ring Buffers, Offloading, and Link Speed

Modern Linux servers and high-throughput network appliances process tens of gigabits of ingress and egress frames per second. When network interfaces experience micro-burst traffic spikes, default kernel socket buffers and Network Interface Card (NIC) hardware queues often exhaust their allocated descriptors, precipitating silent packet drops and latency spikes. The ethtool utility is the definitive Linux administration tool for querying and controlling network device drivers, hardware ring buffers, link speeds, and hardware offload engines directly at the physical and data link layers.

Architectural Overview: NIC Hardware Rings, Offload Engines, and the Linux Network Stack

Understanding the transition of an Ethernet frame from physical wire into the Linux kernel memory subsystem reveals where hardware configuration impacts processing latency and CPU utilisation.

Subsystem Component Operational Role Configurable Parameters via ethtool Performance Impact
RX / TX Ring Buffers Circular FIFO descriptor arrays storing incoming and outgoing DMA packet pointers rx, tx, rx-mini, rx-jumbo descriptor counts Prevents hardware-level frame drops during kernel context switching and sudden ingress traffic spikes.
Segmentation Offload (TSO / GSO) Offloads large TCP frame segmentation from the host CPU directly to the NIC hardware tso (TCP Segmentation Offload), gso (Generic Segmentation Offload) Minimises CPU overhead by allowing the kernel to push 64 KB buffers to the adapter for physical chunking.
Receive Offload (LRO / GRO) Aggregates multiple sequential TCP packets into a single contiguous sk_buff structure lro (Large Receive Offload), gro (Generic Receive Offload) Reduces kernel softirq invocations and per-packet traversal through the IP stack.
Physical Link Layer (PHY) Electrical/optical transceiver negotiation, duplex mode, and link speed state speed, duplex, autoneg, port Guarantees deterministic line-rate connectivity without duplex mismatches or negotiation flapping.

Querying Device Capabilities and Physical Link State

Before adjusting buffer depths or toggling offload flags, evaluate the hardware constraints and active operational parameters of your target interface (e.g., eth0 or enp3s0).

1. Inspecting Link Speed, Duplex, and Autonegotiation

To inspect physical link parameters, invoke ethtool followed by the interface name:

sudo ethtool enp3s0

The output enumerates supported link modes, advertised capabilities, active speed, and whether link partner autonegotiation is established:

Settings for enp3s0:
    Supported ports: [ TP ]
    Supported link modes:   10baseT/Half 10baseT/Full
                            100baseT/Half 100baseT/Full
                            1000baseT/Full
                            2500baseT/Full
    Supported pause frame use: Symmetric Receive-only
    Supports auto-negotiation: Yes
    Speed: 2500Mb/s
    Duplex: Full
    Auto-negotiation: on
    Link detected: yes

2. Extracting Driver and Firmware Metadata

To identify the active kernel driver, firmware version, and bus architecture for hardware compliance, pass the -i flag:

sudo ethtool -i enp3s0

This confirms whether your adapter uses vendor-optimised drivers (such as Intel ixgbe or ice, or Mellanox mlx5_core).

Tuning RX and TX Ring Buffers to Eliminate Packet Drops

When high-throughput traffic triggers packet drops at the network interface layer—visible as discarded frames in netstat -i or ip -s link—the root cause is frequently an undersized hardware ring buffer.

1. Auditing Ring Buffer Capacity

Query the maximum supported descriptor sizes and current active values using the -g flag:

sudo ethtool -g enp3s0

The output partitions into preset maximums and current hardware settings:

Ring parameters for enp3s0:
Pre-set maximums:
RX:             4096
RX Mini:        n/a
RX Jumbo:       n/a
TX:             4096
Current hardware settings:
RX:             512
TX:             512

2. Expanding Ring Buffer Allocations

In this scenario, the adapter is operating at only 512 descriptors while supporting up to 4096. To allocate the maximum ring buffer depth and provide ample cushion against burst absorption:

sudo ethtool -G enp3s0 rx 4096 tx 4096

Re-run ethtool -g enp3s0 to verify that the active descriptors now reflect 4096.

Configuring Hardware Offloading Engines

Modern Ethernet controllers feature dedicated application-specific integrated circuits (ASICs) capable of processing checksums, protocol encapsulation, and packet aggregation. Offloading these tasks reduces host CPU cycles and memory bus contention.

1. Auditing Current Offload Features

Use the -k flag to audit active hardware features:

sudo ethtool -k enp3s0

The console lists features accompanied by their status (on, off, or [fixed]):

rx-checksumming: on
tx-checksumming: on
    tx-checksum-ipv4: off [fixed]
    tx-checksum-ip-generic: on
tcp-segmentation-offload: on
    tx-tcp-segmentation: on
    tx-tcp-ecn-segmentation: on
generic-segmentation-offload: on
generic-receive-offload: on
large-receive-offload: off

2. Modifying Offloading Parameters

To explicitly toggle features, use the uppercase -K flag:

  • Enable TCP Segmentation and Generic Receive Offload:
    sudo ethtool -K enp3s0 tso on gro on gso on
  • Disable Checksum Offload for Packet Inspection / Troubleshooting: If diagnosing packet corruption or capturing unfiltered frames with tcpdump:
    sudo ethtool -K enp3s0 rx off tx off

Persisting ethtool Parameters Across System Reboots

Modifications executed via ethtool are transient and reset when the system reboots or the network interface restarts. To enforce persistent settings across Ubuntu, Debian, and systemd-based distributions, implement native system configuration hooks.

1. Configuration via systemd-networkd (Modern Distributions)

Create or edit the network link configuration file in /etc/systemd/network/10-enp3s0.link:

[Match]
OriginalName=enp3s0

[Link]
BitsPerSecond=2500M
Duplex=full
AutoNegotiation=yes
RxBufferSize=4096
TxBufferSize=4096
GenericReceiveOffload=yes
TCPSegmentationOffload=yes

2. Configuration via Netplan (Ubuntu Server)

In Ubuntu Server installations managing interfaces with Netplan, append ethtool directives to /etc/netplan/01-netcfg.yaml:

network:
  version: 2
  renderer: networkd
  ethernets:
    enp3s0:
      dhcp4: true
      ring-buffer:
        rx: 4096
        tx: 4096

Apply the configuration with sudo netplan apply.

Root-Cause Troubleshooting Matrix

When network throughput stalls or NIC configuration generates errors, consult the troubleshooting matrix below.

Observed Issue Underlying Cause Remediation Action
“Cannot set device ring buffer: Invalid argument” Requested descriptor count exceeds the adapter’s hardware limit or is not a power of 2. Query ethtool -g <interface> to check the exact Pre-set maximums; ensure the requested value (e.g., 1024, 2048, 4096) conforms to hardware constraints.
High RX frame drops in “netstat -i” despite large rings Kernel NAPI polling loop starved by CPU core saturation or single-core interrupt affinity. Distribute interface interrupts across multiple CPU cores by configuring irqbalance or manually pinning MSI-X vectors in /proc/irq/<id>/smp_affinity.
Duplex mismatch / half-duplex downgrade Autonegotiation disabled on one end of the physical link while forced on the switch port. Ensure both host and switch port are configured for standard autonegotiation (sudo ethtool -s <interface> autoneg on).
Corrupted packets observed in middleboxes (Routers/Firewalls) Hardware LRO (Large Receive Offload) reassembling packets with invalid header structures. Disable LRO (sudo ethtool -K <interface> lro off) and rely exclusively on kernel-managed GRO (Generic Receive Offload).
Link flapping during configuration updates Altering ring buffers resets the PCIe DMA engine, briefly taking the link offline. Execute ring buffer and speed adjustments during planned maintenance windows, or perform changes over an out-of-band management interface.

Operational Hardening and Performance Best Practices

To extract optimal deterministic performance from enterprise network infrastructure while maintaining system stability:

  • Audit Hardware Error Counters Regularly: Use ethtool -S <interface> to inspect vendor-specific MAC counters, PCIe error registers, and CRC checksum failures.
  • Match Buffer Sizing to Memory Architecture: Larger ring buffers consume non-swappable DMA memory. On memory-constrained appliances, avoid indiscriminately maxing buffers unless drop counters actively increment.
  • Standardise Network Link Configurations: Store interface profiles in version-controlled configuration templates (Netplan or Ansible) to prevent manual configuration drift across clustered server fleets.
  • Enable Flow Control Judiciously: Verify pause frame negotiation via ethtool -a <interface>; unmanaged Ethernet flow control can propagate head-of-line blocking across switch fabrics during heavy congestion.

Get the best tech tips delivered straight to your inbox.

Join thousands of readers mastering Apple, Google, Microsoft, and Linux.