Files
zeekay 00134e3dcd perf(tune): network-stack tuning — amd64-host→arm64-host 194k → 518k (2.67x)
tune.sh (server + every loader): performance governor, NIC ring→max, RPS+RFS+XPS
across all cores (single-hw-queue NIC, driver refuses ethtool -L), netdev_max_backlog
1k→300k, somaxconn 65535, 256MiB socket bufs, wide ports, tw_reuse. Result over the
2.5GbE wire, same handler: c1000 194k→518k, c4000 154k→474k (peak 696k). Tuned network
now beats loopback (arm64-host's 20 cores serve full-time). Next: dual loader (amd64-host 2.5G +
macos-host 1G) for aggregate toward 1M.
2026-07-17 00:38:54 -07:00

41 lines
2.5 KiB
Bash
Executable File

#!/usr/bin/env bash
# Network-stack tuning for max small-request req/sec. Run on the server AND every
# loader box. Idempotent; needs sudo. Usage: sudo ./tune.sh <nic>
# sudo ./tune.sh enP7s7 # arm64-host (server, 2.5GbE)
# sudo ./tune.sh eno1 # amd64-host (loader, 2.5GbE)
set -uo pipefail
NIC=${1:-$(ip route get 8.8.8.8 2>/dev/null | awk '{print $5; exit}')}
NC=$(nproc)
MASK=$(printf '%x' $(( (1<<NC) - 1 )))
echo ">> tuning $(hostname) nic=$NIC cores=$NC"
# 1) CPU: performance governor on every core
for g in /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor; do echo performance > "$g" 2>/dev/null; done
# 2) NIC ring buffers -> hardware max (amd64-host ships at 256; drops under load)
RXMAX=$(ethtool -g "$NIC" 2>/dev/null | awk '/Pre-set maximums/{p=1} p&&/^RX:/{print $2; exit}')
TXMAX=$(ethtool -g "$NIC" 2>/dev/null | awk '/Pre-set maximums/{p=1} p&&/^TX:/{print $2; exit}')
[ -n "${RXMAX:-}" ] && ethtool -G "$NIC" rx "$RXMAX" tx "${TXMAX:-$RXMAX}" 2>/dev/null && echo " ring -> rx=$RXMAX tx=${TXMAX:-$RXMAX}"
# 3) Offloads on (throughput)
ethtool -K "$NIC" gro on gso on tso on 2>/dev/null || true
# 4) RPS (RX softirq across all cores — this NIC has 1 hw queue) + RFS + XPS (TX)
sysctl -qw net.core.rps_sock_flow_entries=1048576 2>/dev/null
for q in /sys/class/net/$NIC/queues/rx-*; do echo "$MASK" > "$q/rps_cpus" 2>/dev/null; echo 65536 > "$q/rps_flow_cnt" 2>/dev/null; done
for q in /sys/class/net/$NIC/queues/tx-*; do echo "$MASK" > "$q/xps_cpus" 2>/dev/null; done
# 5) Kernel network sysctls (big buffers, deep backlog, wide ports, fast recycle)
sysctl -qw \
net.core.rmem_max=268435456 net.core.wmem_max=268435456 \
net.core.rmem_default=16777216 net.core.wmem_default=16777216 \
net.core.optmem_max=65536 \
net.core.netdev_max_backlog=300000 net.core.netdev_budget=60000 net.core.netdev_budget_usecs=8000 \
net.core.somaxconn=65535 net.core.busy_read=0 net.core.busy_poll=0 \
net.ipv4.tcp_rmem="4096 262144 268435456" net.ipv4.tcp_wmem="4096 262144 268435456" \
net.ipv4.tcp_max_syn_backlog=65535 net.ipv4.tcp_tw_reuse=1 net.ipv4.tcp_fin_timeout=10 \
net.ipv4.ip_local_port_range="1024 65535" net.ipv4.tcp_mtu_probing=1 \
net.ipv4.tcp_slow_start_after_idle=0 net.ipv4.tcp_no_metrics_save=1 2>/dev/null
echo ">> done: gov=$(cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor) ring_rx=$(ethtool -g $NIC 2>/dev/null | awk '/Current hardware/{c=1} c&&/^RX:/{print $2; exit}') backlog=$(sysctl -n net.core.netdev_max_backlog) somaxconn=$(sysctl -n net.core.somaxconn)"