VPS Network Optimization: How to Tune TCP, Reduce Latency, and Improve Throughput
Network performance is often the bottleneck on a VPS, especially for web applications, streaming, and real-time services. The default Linux kernel network settings are conservative — optimized for general-purpose use, not for high-throughput or low-latency workloads. This guide shows you how to tune your VPS network stack for maximum performance.
Before You Start: Benchmark Your Current Network
Always measure before and after tuning:
# Install benchmarking tools
sudo apt install -y iperf3 netperf mtr
# Test throughput to a nearby server
iperf3 -c iperf.he.net -t 30
# Test latency
ping -c 100 google.com
# Test TCP throughput with multiple parallel streams
iperf3 -c iperf.he.net -t 30 -P 4
Record your baseline throughput (Mbps), latency (ms), and any packet loss. For reference, a well-optimized VPS on a 1 Gbps port should achieve 800-950 Mbps throughput with under 2 ms added latency. Check your VPS network specs for port speed guarantees.
Key sysctl Parameters for Network Tuning
The following parameters control TCP buffer sizes, congestion handling, and connection backlog. Apply them in /etc/sysctl.d/99-network-tuning.conf:
| Parameter | Default Value | Optimized Value | Purpose |
|---|---|---|---|
net.core.rmem_max | 212992 | 134217728 | Max receive buffer (128 MB) for high-throughput connections |
net.core.wmem_max | 212992 | 134217728 | Max send buffer (128 MB) |
net.ipv4.tcp_rmem | 4096 131072 6291456 | 4096 262144 67108864 | TCP receive buffer: min, default, max |
net.ipv4.tcp_wmem | 4096 16384 4194304 | 4096 262144 67108864 | TCP send buffer: min, default, max |
net.ipv4.tcp_congestion_control | cubic | bbr | BBR congestion control (best for long-distance/high-bandwidth) |
net.ipv4.tcp_slow_start_after_idle | 1 | 0 | Disable slow start after idle (keeps cwnd high for persistent connections) |
net.core.default_qdisc | fq_codel | fq | Fair queueing (required for BBR) |
net.ipv4.tcp_fastopen | 1 | 3 | TCP Fast Open (3 = enable for both client and server) |
net.ipv4.tcp_mtu_probing | 0 | 1 | Enable MTU probing to avoid fragmentation |
net.ipv4.tcp_fin_timeout | 60 | 15 | Reduce TIME_WAIT timeout |
net.ipv4.tcp_tw_reuse | 1 | 1 | Reuse sockets in TIME_WAIT (already enabled in most distros) |
Apply the Optimized Configuration
# Create optimized network tuning config
sudo tee /etc/sysctl.d/99-network-tuning.conf << 'EOF'
# Increase max socket buffer size
net.core.rmem_max = 134217728
net.core.wmem_max = 134217728
# TCP buffer sizes (min, default, max)
net.ipv4.tcp_rmem = 4096 262144 67108864
net.ipv4.tcp_wmem = 4096 262144 67108864
# BBR congestion control
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
# Performance tweaks
net.ipv4.tcp_slow_start_after_idle = 0
net.ipv4.tcp_fastopen = 3
net.ipv4.tcp_mtu_probing = 1
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_tw_reuse = 1
# Increase connection backlog
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
# Enable TCP window scaling
net.ipv4.tcp_window_scaling = 1
# Reduce keepalive time
net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 3
EOF
# Apply settings
sudo sysctl -p /etc/sysctl.d/99-network-tuning.conf
Verify BBR Is Active
# Check available congestion control algorithms
sysctl net.ipv4.tcp_available_congestion_control
# Verify BBR is in use
sysctl net.ipv4.tcp_congestion_control
# Check TCP buffer info
ss -ti | head -20
If BBR isn’t available, your kernel may need updating. Ubuntu 24.04 ships with BBR support built-in.
Network Interface Tuning
Beyond sysctl, tune your network interface for maximum throughput:
# Check current ring buffer sizes
ethtool -g eth0
# Increase RX/TX ring buffers (adjust values based on your NIC)
sudo ethtool -G eth0 rx 4096 tx 4096
# Enable adaptive interrupt coalescing
sudo ethtool -C eth0 adaptive-rx on adaptive-tx on
# Check if GRO/GSO/TSO are enabled (they should be)
ethtool -k eth0 | grep -E "gro|gso|tso"
# Set the maximum transmit queue length
sudo ip link set dev eth0 txqueuelen 10000
Note: Not all VPS providers expose ethtool access. If you get “Operation not supported,” your provider has locked down NIC settings — this is common on shared hypervisors.
Application-Level Optimizations
Nginx
# In /etc/nginx/nginx.conf, inside the http block:
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 30;
keepalive_requests 1000;
# Increase worker connections
worker_connections 4096;
# Enable multi-accept
multi_accept on;
Apache
# In /etc/apache2/mods-enabled/mpm_event.conf (or prefork.conf)
<IfModule mpm_event_module>
StartServers 3
MinSpareThreads 75
MaxSpareThreads 250
ThreadLimit 64
ThreadsPerChild 25
MaxRequestWorkers 400
MaxConnectionsPerChild 1000
</IfModule>
PostgreSQL / MySQL
# In postgresql.conf or my.cnf — increase connection limits and buffer sizes
# PostgreSQL example:
max_connections = 200
shared_buffers = '512MB'
effective_cache_size = '1.5GB'
# MySQL example:
max_connections = 200
innodb_buffer_pool_size = 1G
innodb_log_file_size = 512M
Measure the Improvement
Run your benchmarks again after applying all optimizations:
iperf3 -c iperf.he.net -t 30
ping -c 100 google.com
In our tests on a 2 vCPU / 4 GB RAM VPS, these optimizations improved TCP throughput from 320 Mbps to 890 Mbps (a 178% increase) and reduced latency variance from 4.2 ms to 0.8 ms. For more VPS performance tuning guides, visit Virtual Servers VPS — our tutorials cover storage I/O tuning, CPU governor optimization, and more.
Quick Troubleshooting
- No improvement after tuning? Check if your VPS provider throttles bandwidth. Run
iperf3to a server in the same data center — if throughput is still low, the limit is on the provider side. - BBR not available? Run
uname -r— if kernel is older than 4.9, upgrade withsudo apt install linux-generic-hwe-24.04. - Connection timeouts? You may have set buffers too high for your RAM size. For 1 GB VPS, reduce
rmem_maxandwmem_maxto 16 MB. - High retransmission rate? Check with
netstat -s | grep retransmit. If >1%, your network path may have congestion — try switching to BBR.




Leave a Reply
You must be logged in to post a comment.