#!/bin/bash # 确认 BBR 能不能用,并把有效的调优持久化 set -u echo "===== 1. 内核信息 =====" echo " 版本: $(uname -r)" echo " 架构: $(uname -m)" echo echo "===== 2. BBR 模块存在吗 =====" found=$(find /lib/modules -name 'tcp_bbr*' 2>/dev/null | head -3) if [ -n "$found" ]; then echo " 找到模块文件:" echo "$found" | sed 's/^/ /' else echo " 没有任何 tcp_bbr 模块文件" fi echo echo "===== 3. 内核编译时开了 BBR 吗 =====" if [ -f /proc/config.gz ]; then zgrep -i CONFIG_TCP_CONG_BBR /proc/config.gz | sed 's/^/ /' elif [ -f /boot/config-$(uname -r) ]; then grep -i CONFIG_TCP_CONG_BBR /boot/config-$(uname -r) | sed 's/^/ /' else echo " 没有内核配置文件可查" fi echo echo "===== 4. 试着手动加载 =====" modprobe tcp_bbr 2>&1 | sed 's/^/ /' || true echo " 加载后可用算法: $(sysctl -n net.ipv4.tcp_available_congestion_control)" echo echo "===== 5. 当前生效的网络参数 =====" for k in net.ipv4.tcp_congestion_control net.core.default_qdisc \ net.core.rmem_max net.core.wmem_max net.ipv4.tcp_fastopen \ net.ipv4.tcp_tw_reuse net.ipv4.tcp_mtu_probing; do printf " %-40s = %s\n" "$k" "$(sysctl -n $k 2>/dev/null || echo '?')" done echo echo "===== 6. 既然没有 BBR,用 cubic 能调的都调上 =====" cat > /etc/sysctl.d/98-ykxmz-net.conf <<'EOF' # ykxmz 网络调优(4G 高丢包链路) # # ⚠ 这台设备的精简内核**没有 BBR**(只有 reno/cubic), # 所以下面用 cubic,再把其它能帮上忙的参数调好。 # 如果以后换了带 BBR 的内核,把 tcp_congestion_control 改成 bbr 即可。 # TCP 缓冲:长途高延迟链路需要更大窗口 net.core.rmem_max = 4194304 net.core.wmem_max = 4194304 net.ipv4.tcp_rmem = 4096 87380 4194304 net.ipv4.tcp_wmem = 4096 65536 4194304 # 快速打开:省一个 RTT net.ipv4.tcp_fastopen = 3 # 空闲后不重置拥塞窗口 —— 长轮询场景很关键, # 否则每次轮询间隔后都要从慢启动重新爬 net.ipv4.tcp_slow_start_after_idle = 0 # 早重传,别干等 net.ipv4.tcp_retries2 = 8 # 复用 TIME_WAIT 连接 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_fin_timeout = 15 # 接收缓冲自动调节 net.ipv4.tcp_moderate_rcvbuf = 1 EOF sysctl -p /etc/sysctl.d/98-ykxmz-net.conf 2>&1 | grep -v '^net.core.default_qdisc\|^net.ipv4.tcp_congestion_control' | sed 's/^/ /' echo echo " 最终拥塞控制: $(sysctl -n net.ipv4.tcp_congestion_control)" echo " 最终队列: $(sysctl -n net.core.default_qdisc)"