How to Optimize a 10Gbps Linux Dedicated Server for Maximum Performance
How to Optimize a 10Gbps Linux Dedicated Server for Maximum Performance
If you recently provisioned a high-performance 10Gbps bare-metal dedicated server, you might be surprised to see your actual network throughput cap at 2 Gbps or 3 Gbps.
The reality of high-speed networking is simple: Having a 10GbE network port does not automatically guarantee 10Gbps of real-world application throughput.
At 10 Gigabits per second, default Linux kernel parameters, CPU interrupt handling, and TCP buffer settings create invisible bottlenecks. At Servers99, we frequently configure high-bandwidth infrastructure. Here is a breakdown of how to identify and resolve these performance caps on Linux.

1. Verify Your Physical Link Layer
Never start modifying Linux kernel settings until you confirm that your hardware is properly negotiated at 10Gbps. A bad cable, unsupported SFP+ module, or switch auto-negotiation error can silently force your link to 1Gbps.
Run ethtool on your active network interface:
Bash
sudo ethtool <interface>
Check the negotiated speed:
Plaintext
Speed: 10000Mb/s
Duplex: Full
If the output displays 1000Mb/s, stop software tuning immediately. Resolve the physical link or switch configuration issue first.
2. Prevent Single CPU Core Saturation
Processing millions of network packets per second requires significant processing power. If all hardware interrupts (IRQs) are processed by a single CPU core (usually CPU0), that core will hit 100% utilization, throttling your entire network while the remaining cores stay idle.
Receive-Side Scaling (RSS): Ensures multi-queue NICs distribute incoming network traffic across multiple hardware queues.
IRQ Balance: Ensure the irqbalance daemon is active to distribute network interrupts across all available logical CPU cores.
Bash
# Check interrupt distribution across CPU cores
grep -i <interface> /proc/interrupts
# Verify irqbalance status
systemctl status irqbalance
3. Tune Linux TCP Buffers Safely
Connections traveling over longer geographic distances experience higher latency, requiring larger TCP socket buffers to maintain high throughput.
Instead of applying unverified buffer sizes, establish a conservative, tested baseline in /etc/sysctl.d/99-10gbps-network.conf:
Plaintext
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
Apply your new configuration safely:
Bash
sudo sysctl --system
4. Benchmark Throughput with iperf3
Web browser speed tests introduce significant application overhead and fail to accurately measure raw 10Gbps capacity. Use iperf3 between two 10Gbps-capable servers to get reliable metrics.
Run a test using parallel TCP streams:
Bash
iperf3 -c <REMOTE_SERVER_IP> -P 8 -t 30
If 8 parallel streams achieve 9.5+ Gbps but a single stream maxes out at 2.5 Gbps, your underlying network interface and link are healthy—your single-flow TCP window or per-core processing simply needs tuning.
📖 Complete 17-Step Technical Guide
System optimization requires a methodical approach: record a baseline, make one controlled change, and re-benchmark.
We have published our full 17-step command-line guide covering MTU 9000 (Jumbo Frames) path validation, NIC offloading (TSO/GRO/GSO), ring buffer configurations, and packet drop troubleshooting.