TCP内核调优

vi /etc/sysctl.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
net.ipv4.tcp_congestion_control = bbr
net.core.default_qdisc = fq

# Core memory defaults and maximums (Global caps)
net.core.rmem_default = 262144
net.core.rmem_max = 134217728
net.core.wmem_default = 262144
net.core.wmem_max = 134217728

# TCP specific memory (Min, Default, Max aligned to core max)
net.ipv4.tcp_rmem = 4096 131072 134217728
net.ipv4.tcp_wmem = 4096 131072 134217728

# This limits local queue latency to 16KB without killing throughput speed
net.ipv4.tcp_notsent_lowat = 16384

# 自动减少缓冲区为原来的1/2以改善缓冲区膨胀
net.ipv4.tcp_adv_win_scale = 1

# 减少重传超时(高延迟链路需要更长的超时)
net.ipv4.tcp_retries2 = 8

# 时间戳和窗口缩放(必须开启)
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_sack = 1

修改默认MTU

vi /etc/netplan/50-cloud-init.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
network:
version: 2
ethernets:
enp0s6:
match:
macaddress: "02:00:17:06:a9:b5"
dhcp4: true
set-name: "enp0s6"
dhcp4-overrides:
use-dns: false
nameservers:
addresses:
- 1.1.1.1
- 2606:4700:4700::1111
mtu: 1500

修改fq quantum

vi /etc/networkd-dispatcher/routable.d/50-ifup-hooks
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#!/bin/bash
# 赋予执行权限: chmod +x /etc/networkd-dispatcher/routable.d/50-ifup-hooks
# 启动: systemctl enable --now networkd-dispatcher

IFACE_NAME="enp0s6"

# 检查网卡是否存在,避免报错
if [ ! -d "/sys/class/net/$IFACE_NAME" ]; then
echo "Interface $IFACE_NAME not found."
exit 0
fi

if [ "$IFACE" == "$IFACE_NAME" ] || [ -z "$IFACE" ]; then
# 1. 自动检测物理发送队列(TX Queues)数量
# 统计 /sys/class/net/enp0s6/queues/ 下以 tx- 开头的目录数量
TX_COUNT=$(ls -d /sys/class/net/$IFACE_NAME/queues/tx-* 2>/dev/null | wc -l)

echo "Detected $TX_COUNT TX queues on $IFACE_NAME"

# 清除旧规则
tc qdisc del dev $IFACE_NAME root 2>/dev/null

if [ "$TX_COUNT" -gt 1 ]; then
# --- 多队列模式 (Multi-Queue) ---
echo "Applying MQ + FQ for multi-queue..."
tc qdisc replace dev $IFACE_NAME root handle 1: mq

# 仅针对实际存在的队列进行循环配置
for ((i=1; i<=TX_COUNT; i++)); do
tc qdisc replace dev $IFACE_NAME parent 1:$i fq quantum 18028 initial_quantum 90140
done
else
# --- 单队列模式 (Single-Queue) ---
echo "Applying FQ for single-queue..."
# 直接在 root 上应用 fq
tc qdisc replace dev $IFACE_NAME root fq quantum 18028 initial_quantum 90140
fi
fi