最近看到坛友分享美西服务器通过调整 TCP 缓冲区、队列算法来提升高延迟线路的单线程性能。
原帖:https://www.nodeseek.com/post-847872-1 勾引我玩机,但是没有要到教程,今天有时间问了ai给我调的
各位有技术的大佬,看看是否靠谱,ai给我搞的
下面都是我让ai给我调了以后给我汇总,然后我粘贴过来的
调优前的真实参数
为什么已经开启 BBR 仍有优化空间
适合 1GB VMISS 的参数
带自动备份和一键回滚的完整脚本
调优后的验证结果
使用时需要注意的问题
目前参数已经成功生效,后续有时间再补充相同时间、相同节点下的 TQ/NQ 前后测速对比。
一、服务器配置
这台机器的基本配置如下:
系统:Debian 12
内核:6.1.0-49-cloud-amd64
CPU:1 核
内存:约 1GB
Swap:无
默认网卡:eth0
用途:Xray 代理入口
线路:VMISS 三网优化/精品回程
调优前,服务器已经开启 BBR:
当前拥塞算法:bbr
可用拥塞算法:reno cubic bbr
系统默认队列算法:fq
BBR 模块:已加载
乍一看似乎已经没有什么需要调整,但继续检查后发现,实际情况并不完全是标准的 BBR + fq。
二、调优前存在的问题
1. 系统默认是 fq,但网卡实际运行的是 fq_codel
调优前执行:
tc qdisc show dev eth0
得到:
qdisc fq_codel 0: root refcnt 2 limit 10240p flows 1024 quantum 1514 ...
也就是说:
sysctl 默认队列:fq
eth0 实际队列:fq_codel
BBR 虽然已经启用,但实际网卡没有使用更适合配合 BBR pacing 的 fq。
2. TCP 发送和接收缓冲区偏小
调优前参数:
net.core.rmem_max = 212992
net.core.wmem_max = 212992
net.ipv4.tcp_rmem = 4096 131072 6291456
net.ipv4.tcp_wmem = 4096 16384 4194304
换算下来:
TCP 最大发送缓冲:4MB
TCP 最大接收缓冲:6MB
Socket 收发上限:约 208KB
对于美西回国这种大约 140~180ms 延迟的链路,4MB 发送窗口容易限制单线程吞吐。
可以做一个简单估算:
单线程理论吞吐 ≈ TCP 窗口 ÷ RTT × 8
假设 RTT 为 160ms:
4MB 窗口约为 210Mbps
16MB 窗口约为 839Mbps
这并不代表调优后一定能跑到 839Mbps,只是说明本机 TCP 窗口不再先把单线程速度卡在约 200Mbps附近。
最终速度仍然受以下因素限制:
商家端口限速
共享带宽
晚高峰拥堵
客户端网络
路由质量
测速节点负载
3. MTU 黑洞探测未开启
原参数:
net.ipv4.tcp_mtu_probing = 0
部分跨境线路遇到 ICMP 被屏蔽或路径 MTU 异常时,可能出现特定网站卡顿、大包传输异常等情况。
本次设置为:
net.ipv4.tcp_mtu_probing = 1
模式 1 只会在检测到 MTU 黑洞时启动探测,并不是持续降低 MTU。
4. 空闲后会重新进入慢启动
原参数:
net.ipv4.tcp_slow_start_after_idle = 1
对于 SSH、API、代理以及间歇传输的长连接,短暂空闲后重新慢启动可能影响再次传输时的响应速度。
本次设置为:
net.ipv4.tcp_slow_start_after_idle = 0
三、最终采用的参数
考虑到这台机器只有 1GB 内存,我没有使用几十到几百 MB 的激进 TCP 缓冲,而是采用相对保守的 16MB 档:
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
net.core.rmem_max = 33554432
net.core.wmem_max = 33554432
net.ipv4.tcp_rmem = 4096 262144 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_mtu_probing = 1
net.ipv4.tcp_slow_start_after_idle = 0
net.ipv4.tcp_moderate_rcvbuf = 1
对应关系:
TCP 最大发送缓冲:16MB
TCP 最大接收缓冲:16MB
Socket 收发上限:32MB
拥塞算法:BBR
网卡队列:fq
这个参数更适合:
Debian 12/13
Linux 6.1 或更新内核
1GB 左右内存
美西高延迟回国线路
200Mbps 至数百 Mbps 级别套餐
Xray、Sing-box、SSH、API 等 TCP 使用场景
不建议不同配置的机器完全照抄。
例如 512MB 内存小鸡需要进一步降低缓冲,2GB 以上内存和 G 口机器则可以根据实际 RTT、端口和并发量重新计算。
四、调优前先执行只读检查
下面的命令只查看参数,不会修改系统:
bash <<'EOF'
echo "================ 基本信息 ================"
date
echo
cat /etc/os-release 2>/dev/null | grep -E '^(PRETTY_NAME|VERSION_ID)='
echo "内核版本:$(uname -r) "
echo "CPU核心:$(nproc) "
echo
free -h
echo
echo "================ 默认网卡 ================"
IFACE=$(ip route show default 2>/dev/null | awk '/default/ {print $5; exit}' )
echo "默认网卡:${IFACE:-未识别} "
ip -br link 2>/dev/null
ip route show default 2>/dev/null
echo
echo "================ BBR 支持情况 ================"
echo -n "当前拥塞算法:"
sysctl -n net.ipv4.tcp_congestion_control 2>/dev/null
echo -n "可用拥塞算法:"
sysctl -n net.ipv4.tcp_available_congestion_control 2>/dev/null
echo -n "默认队列算法:"
sysctl -n net.core.default_qdisc 2>/dev/null
if modinfo tcp_bbr >/dev/null 2>&1; then
echo "BBR模块:系统支持"
else
echo "BBR模块:modinfo 未检测到,可能内置于内核或尚不可用"
fi
lsmod 2>/dev/null | grep -E '^tcp_bbr' || echo "tcp_bbr 当前未以模块形式加载"
echo
echo "================ TCP 缓冲参数 ================"
for KEY in \
net.core.rmem_max \
net.core.wmem_max \
net.ipv4.tcp_rmem \
net.ipv4.tcp_wmem \
net.ipv4.tcp_window_scaling \
net.ipv4.tcp_mtu_probing \
net.ipv4.tcp_slow_start_after_idle \
net.ipv4.tcp_moderate_rcvbuf
do
sysctl "$KEY " 2>/dev/null || echo "$KEY = 不支持或不存在"
done
echo
echo "================ 当前队列规则 ================"
if [ -n "$IFACE " ]; then
tc qdisc show dev "$IFACE " 2>/dev/null || echo "无法读取 qdisc"
else
echo "未识别默认网卡"
fi
echo
echo "================ TCP 状态 ================"
ss -s 2>/dev/null
echo
echo "================ 代理程序 ================"
ps -eo pid,comm ,args --sort =comm 2>/dev/null |
grep -E '[x]ray|[s]ing-box|[h]ysteria|[t]uic|[n]aive|[3]x-ui' |
sed -E 's/(password|passwd|token|secret|uuid)=[^ ]+/\1=已隐藏/Ig' ||
echo "没有识别到常见代理进程"
echo
echo "================ 检查结束 ================"
echo "本次仅查看参数,没有修改系统。"
EOF
建议先保存调优前的输出,再开始修改。
五、完整调优脚本
下面脚本具备以下功能:
自动识别默认网卡
检查 root 权限
备份当前 sysctl 和 qdisc
保持并加载 BBR
写入 1GB VMISS 适用参数
将实际网卡切换为 fq
创建开机自动应用服务
自动生成一键回滚脚本
不修改 Xray、3x-ui、端口和防火墙
建议保留当前 SSH 窗口,同时新开一个 SSH 窗口备用。
bash <<'EOF'
set -Eeuo pipefail
if [ "$(id -u) " -ne 0 ]; then
echo "错误:请使用 root 执行。"
exit 1
fi
IFACE="$(ip -4 route show default | awk '/default/ {print $5; exit}') "
if [ -z "${IFACE} " ]; then
echo "错误:无法识别默认网卡。"
exit 1
fi
TIMESTAMP="$(date +%Y%m%d-%H%M%S) "
BACKUP_DIR="/root/vmiss-network-backup-${TIMESTAMP} "
CONFIG_FILE="/etc/sysctl.d/99-vmiss-network.conf"
mkdir -p "${BACKUP_DIR} "
echo "默认网卡:${IFACE} "
echo "备份目录:${BACKUP_DIR} "
sysctl -a 2>/dev/null > "${BACKUP_DIR} /sysctl-all-before.txt" || true
tc qdisc show dev "${IFACE} " > "${BACKUP_DIR} /qdisc-before.txt" || true
if [ -f "${CONFIG_FILE} " ]; then
cp -a "${CONFIG_FILE} " \
"${BACKUP_DIR} /99-vmiss-network.conf.before"
fi
if [ -f /etc/modules-load.d/tcp-bbr.conf ]; then
cp -a /etc/modules-load.d/tcp-bbr.conf \
"${BACKUP_DIR} /tcp-bbr.conf.before"
fi
if [ -f /etc/systemd/system/vmiss-fq.service ]; then
cp -a /etc/systemd/system/vmiss-fq.service \
"${BACKUP_DIR} /vmiss-fq.service.before"
fi
if [ -f /usr/local/sbin/apply-vmiss-fq ]; then
cp -a /usr/local/sbin/apply-vmiss-fq \
"${BACKUP_DIR} /apply-vmiss-fq.before"
fi
OLD_DEFAULT_QDISC="$(sysctl -n net.core.default_qdisc) "
OLD_CC="$(sysctl -n net.ipv4.tcp_congestion_control) "
OLD_RMEM_MAX="$(sysctl -n net.core.rmem_max) "
OLD_WMEM_MAX="$(sysctl -n net.core.wmem_max) "
OLD_TCP_RMEM="$(sysctl -n net.ipv4.tcp_rmem) "
OLD_TCP_WMEM="$(sysctl -n net.ipv4.tcp_wmem) "
OLD_WINDOW_SCALING="$(sysctl -n net.ipv4.tcp_window_scaling) "
OLD_MTU_PROBING="$(sysctl -n net.ipv4.tcp_mtu_probing) "
OLD_SLOW_START="$(sysctl -n net.ipv4.tcp_slow_start_after_idle) "
OLD_MODERATE_RCVBUF="$(sysctl -n net.ipv4.tcp_moderate_rcvbuf) "
OLD_QDISC_TYPE="$(tc qdisc show dev "${IFACE} " | awk 'NR==1 {print $2}') "
if [ -z "${OLD_QDISC_TYPE} " ]; then
OLD_QDISC_TYPE="fq_codel"
fi
modprobe tcp_bbr
printf '%s\n' 'tcp_bbr' > /etc/modules-load.d/tcp-bbr.conf
cat > "${CONFIG_FILE} " <<'SYSCTL'
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
net.core.rmem_max = 33554432
net.core.wmem_max = 33554432
net.ipv4.tcp_rmem = 4096 262144 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_mtu_probing = 1
net.ipv4.tcp_slow_start_after_idle = 0
net.ipv4.tcp_moderate_rcvbuf = 1
SYSCTL
sysctl -p "${CONFIG_FILE} "
cat > /usr/local/sbin/apply-vmiss-fq <<'SCRIPT'
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
IFACE="$(ip -4 route show default | awk '/default/ {print $5; exit}') "
[ -n "${IFACE} " ] || exit 1
exec tc qdisc replace dev "${IFACE} " root fq
SCRIPT
chmod 0755 /usr/local/sbin/apply-vmiss-fq
cat > /etc/systemd/system/vmiss-fq.service <<'SERVICE'
[Unit]
Description=Apply fq qdisc for VMISS network tuning
Wants=network-online.target
After=network-online.target
[Service]
Type=oneshot
ExecStart=/usr/local/sbin/apply-vmiss-fq
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
SERVICE
systemctl daemon-reload
systemctl enable --now vmiss-fq.service >/dev/null
cat > "${BACKUP_DIR} /rollback.sh" <<ROLLBACK
#!/bin/bash
set -Eeuo pipefail
cat > /etc/sysctl.d/99-vmiss-network.conf <<'OLDSYSCTL'
net.core.default_qdisc = ${OLD_DEFAULT_QDISC}
net.ipv4.tcp_congestion_control = ${OLD_CC}
net.core.rmem_max = ${OLD_RMEM_MAX}
net.core.wmem_max = ${OLD_WMEM_MAX}
net.ipv4.tcp_rmem = ${OLD_TCP_RMEM}
net.ipv4.tcp_wmem = ${OLD_TCP_WMEM}
net.ipv4.tcp_window_scaling = ${OLD_WINDOW_SCALING}
net.ipv4.tcp_mtu_probing = ${OLD_MTU_PROBING}
net.ipv4.tcp_slow_start_after_idle = ${OLD_SLOW_START}
net.ipv4.tcp_moderate_rcvbuf = ${OLD_MODERATE_RCVBUF}
OLDSYSCTL
sysctl -p /etc/sysctl.d/99-vmiss-network.conf
systemctl disable --now vmiss-fq.service 2>/dev/null || true
rm -f /etc/systemd/system/vmiss-fq.service
rm -f /usr/local/sbin/apply-vmiss-fq
systemctl daemon-reload
IFACE="\$(ip -4 route show default | awk '/default/ {print \$5; exit}')"
if [ -n "\${IFACE}" ]; then
tc qdisc replace dev "\${IFACE}" root ${OLD_QDISC_TYPE} || true
fi
echo "已恢复调优前的 sysctl 参数和队列算法。"
ROLLBACK
chmod 0700 "${BACKUP_DIR} /rollback.sh"
echo
echo "================ 调优后状态 ================"
echo "备份目录:${BACKUP_DIR} "
echo "回滚命令:bash ${BACKUP_DIR} /rollback.sh"
echo
sysctl net.ipv4.tcp_congestion_control
sysctl net.core.default_qdisc
sysctl net.core.rmem_max
sysctl net.core.wmem_max
sysctl net.ipv4.tcp_rmem
sysctl net.ipv4.tcp_wmem
sysctl net.ipv4.tcp_window_scaling
sysctl net.ipv4.tcp_mtu_probing
sysctl net.ipv4.tcp_slow_start_after_idle
sysctl net.ipv4.tcp_moderate_rcvbuf
echo
tc qdisc show dev "${IFACE} "
echo
systemctl --no-pager --full status vmiss-fq.service || true
echo
echo "调优完成,没有修改或重启 Xray。"
EOF
六、我的实际执行结果
脚本执行后,参数显示为:
net.ipv4.tcp_congestion_control = bbr
net.core.default_qdisc = fq
net.core.rmem_max = 33554432
net.core.wmem_max = 33554432
net.ipv4.tcp_rmem = 4096 262144 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_mtu_probing = 1
net.ipv4.tcp_slow_start_after_idle = 0
net.ipv4.tcp_moderate_rcvbuf = 1
网卡实际队列:
qdisc fq 8001: root refcnt 2 limit 10000p flow_limit 100p ...
说明原来的:
BBR + fq_codel + 4MB发送缓冲
已经变成:
BBR + fq + 16MB TCP缓冲
systemd 服务也设置为了开机启动:
vmiss-fq.service
改进版脚本使用:
systemctl enable --now vmiss-fq.service
正常情况下服务会显示:
Active: active (exited)
七、调优后验证命令
执行:
sysctl net.ipv4.tcp_congestion_control
sysctl net.core.default_qdisc
sysctl net.core.rmem_max
sysctl net.core.wmem_max
sysctl net.ipv4.tcp_rmem
sysctl net.ipv4.tcp_wmem
sysctl net.ipv4.tcp_mtu_probing
sysctl net.ipv4.tcp_slow_start_after_idle
tc qdisc show dev "$(ip -4 route show default | awk '/default/ {print $5; exit}') "
systemctl is-enabled vmiss-fq.service
systemctl is-active vmiss-fq.service
预期应包含:
bbr
fq
33554432
16777216
qdisc fq
enabled
active
检查 Xray 是否仍正常:
pgrep -a xray
ss -s
本次调优:
没有修改 Xray 配置
没有修改节点端口
没有修改防火墙
没有修改 IP 和路由
没有重启 Xray
没有重启网卡
不需要立即重启服务器
tc qdisc replace 只替换发送队列,通常不会中断 SSH,但操作网络参数时仍建议保留一个备用 SSH 窗口。
八、一键回滚
脚本执行完成后会显示类似:
备份目录:/root/vmiss-network-backup-日期时间
回滚命令:bash /root/vmiss-network-backup-日期时间/rollback.sh
需要恢复时,直接复制脚本输出的回滚命令即可,例如:
bash /root/vmiss-network-backup-20260730-173003/rollback.sh
注意每个人的备份目录时间不同,不要照抄我这里的路径,应以自己脚本执行后显示的路径为准。
以上参数仅供同类配置参考,建议先查看自己的系统、内存、带宽、当前队列和 TCP 参数,再决定是否调整,不建议无脑复制。