logo NodeSeekbeta

Debian 12 BBR 一键优化脚本 让小鸡网络飞起 TCP一键运行调优脚本

1234
  • 把源码扔给gpt告知针对debian13优化的结果如下:

    #!/bin/bash
    #
    # Debian 12/13 TCP/BBR/FQ auto-tune script
    # Author: ChatGPT
    # Date: 2025-09-22
    #
    # 变更点(相对原版):
    # - 显式 modprobe tcp_bbr / sch_fq,避免算法/队列不可用
    # - 修复 /etc/sysctl.d/*.conf 在空目录时的通配符陷阱(nullglob)
    # - Root/虚拟化环境/命令存在性检查,失败时温和降级
    # - RTT 解析更稳健(兼容不同 ping 输出)
    # - 更清晰的错误处理与结果核验
    
    set -euo pipefail
    
    #---- 基础检查 ----#
    if [[ $EUID -ne 0 ]]; then
      echo "请以 root 运行。"; exit 1
    fi
    
    # 某些极简镜像可能没这些命令
    need_cmd() { command -v "$1" >/dev/null 2>&1 || { echo "缺少依赖命令: $1"; exit 1; }; }
    need_cmd sysctl
    need_cmd awk
    need_cmd sed
    need_cmd ip
    need_cmd grep
    need_cmd uname
    
    # tc/ping 可能在容器里不可用,后面做降级处理
    has_tc=1; command -v tc >/dev/null 2>&1 || has_tc=0
    has_ping=1; command -v ping >/dev/null 2>&1 || has_ping=0
    
    # Debian 版本信息(仅展示用,不做强依赖)
    debian_ver="$(. /etc/os-release && echo "${VERSION_CODENAME:-unknown}")"
    echo "检测到 Debian: ${debian_ver}"
    
    #---- 小工具 ----#
    backup_conflict_file() {
      local file="$1"
      if [[ -f "$file" ]]; then
        local timestamp
        timestamp=$(date +%Y%m%d%H%M%S)
        mv "$file" "${file}.bak.${timestamp}"
        echo "已备份冲突文件: $file -> ${file}.bak.${timestamp}"
      fi
    }
    
    #---- 内存/网卡/RTT ----#
    total_mem=$(free -m | awk '/Mem:/ {print $2}')
    echo "检测到内存: ${total_mem} MB"
    if [[ "${total_mem:-0}" -lt 1024 ]]; then
      echo "⚠️ 内存小于 1G,可能不适合大幅增大缓冲区"
    fi
    
    default_iface=$(ip route show default 2>/dev/null | awk '{print $5}' | head -n1)
    if [[ -z "${default_iface:-}" ]]; then
      # 无默认路由时(容器常见),尝试首个 UP 的非 lo 网卡
      default_iface=$(ip -o link show | awk -F': ' '$2!="lo"{print $2; exit}')
    fi
    echo "默认网卡: ${default_iface:-<未知>}"
    
    # RTT 估计(优先 SSH 对端,否则 1.1.1.1;无 ping 时给默认 50ms)
    client_ip=$(echo "${SSH_CLIENT:-}" | awk '{print $1}')
    client_ip=${client_ip:-1.1.1.1}
    if [[ $has_ping -eq 1 ]]; then
      # 兼容 busybox/iputils:抽 avg 字段
      rtt=$(
        ping -c 5 -q "$client_ip" 2>/dev/null \
          | awk -F'[=/]' '/(rtt|round-trip)/{printf("%.0f\n",$6)}'
      )
    fi
    rtt=${rtt:-50}
    echo "检测到 RTT: ${rtt} ms"
    
    #---- BDP & 缓冲区计算 ----#
    bandwidth_mbps=1000
    echo "默认带宽: ${bandwidth_mbps} Mbps"
    # 注意:这里用 Bytes/s 计算 BDP(Mbps -> MB/s)
    bandwidth_bytes_per_sec=$((bandwidth_mbps * 1000000 / 8))
    bdp_bytes=$((bandwidth_bytes_per_sec * rtt / 1000))
    echo "计算 BDP: ${bdp_bytes} bytes"
    
    # 离散桶(4MB ~ 64MB)
    bucket=
    for candidate in 4194304 8388608 16777216 33554432 67108864; do
      if [[ $bdp_bytes -le $candidate ]]; then
        bucket=$candidate; break
      fi
    done
    bucket=${bucket:-67108864}
    echo "使用桶值: $bucket ($((bucket/1024/1024)) MB)"
    
    #---- 内核模块(Debian 12/13 通用)----#
    # BBR 在大多数内核里名为 tcp_bbr,FQ 为 sch_fq;显式加载更稳妥
    modprobe_if_available() {
      if command -v modprobe >/dev/null 2>&1; then
        modprobe "$1" 2>/dev/null || true
      fi
    }
    modprobe_if_available tcp_bbr
    modprobe_if_available sch_fq
    
    #---- 清理冲突 sysctl 配置 ----#
    echo "清理冲突 sysctl 配置..."
    # 主配置上删掉冲突项
    sed -i.bak \
      -e '/^net\.core\.rmem_max/d' \
      -e '/^net\.core\.wmem_max/d' \
      -e '/^net\.ipv4\.tcp_rmem/d' \
      -e '/^net\.ipv4\.tcp_wmem/d' \
      -e '/^net\.ipv4\.tcp_congestion_control/d' \
      -e '/^net\.core\.default_qdisc/d' \
      /etc/sysctl.conf || true
    
    # 处理 /etc/sysctl.d 下潜在冲突文件(空匹配要小心)
    shopt -s nullglob
    for f in /etc/sysctl.d/*.conf; do
      if [[ -f "$f" ]] && grep -Eq '^(net\.core\.rmem_max|net\.core\.wmem_max|net\.ipv4\.tcp_rmem|net\.ipv4\.tcp_wmem|net\.ipv4\.tcp_congestion_control|net\.core\.default_qdisc)\b' "$f"; then
        backup_conflict_file "$f"
      fi
    done
    shopt -u nullglob
    
    #---- 写入新配置 ----#
    cat >/etc/sysctl.d/999-net-bbr-fq.conf <<EOF
    # Auto tuned by script on $(date -Is)
    net.core.rmem_max = $bucket
    net.core.wmem_max = $bucket
    net.ipv4.tcp_rmem = 4096 87380 $bucket
    net.ipv4.tcp_wmem = 4096 65536 $bucket
    net.ipv4.tcp_congestion_control = bbr
    net.core.default_qdisc = fq
    EOF
    
    sysctl --system >/dev/null
    
    #---- 应用 qdisc(容器或无 tc 时跳过) ----#
    if [[ -n "${default_iface:-}" && $has_tc -eq 1 ]]; then
      tc qdisc replace dev "$default_iface" root fq 2>/dev/null || true
    fi
    
    #---- 结果核验 ----#
    echo "==== RESULT ===="
    echo "最终使用值 -> 内存: ${total_mem} MB, 带宽: ${bandwidth_mbps} Mbps, RTT: ${rtt} ms"
    echo "桶值: $bucket ($((bucket/1024/1024)) MB)"
    
    sysctl net.ipv4.tcp_available_congestion_control 2>/dev/null | sed 's/^/可用算法: /'
    sysctl net.ipv4.tcp_congestion_control           2>/dev/null | sed 's/^/当前算法: /'
    sysctl net.core.default_qdisc                    2>/dev/null | sed 's/^/默认队列: /'
    sysctl net.core.rmem_max                         2>/dev/null | sed 's/^/rmem_max: /'
    sysctl net.core.wmem_max                         2>/dev/null | sed 's/^/wmem_max: /'
    sysctl net.ipv4.tcp_rmem                         2>/dev/null | sed 's/^/tcp_rmem: /'
    sysctl net.ipv4.tcp_wmem                         2>/dev/null | sed 's/^/tcp_wmem: /'
    
    if [[ -n "${default_iface:-}" && $has_tc -eq 1 ]]; then
      tc qdisc show dev "$default_iface" 2>/dev/null | head -n1
    else
      echo "qdisc: 未应用(缺少 tc 或未识别到网卡,忽略)"
    fi
    echo "================"
    
    # 友好提示:如果未看到 bbr/fq,可能是内核未启用或在容器中受限
    
  • @东风谷小伞 #17
    脚本里,检测 RTT 的逻辑大概是这样的:

    RTT 检测逻辑

    优先用 SSH 客户端的 IP

    脚本会从环境变量 $SSH_CONNECTION 里提取你连接服务器的客户端 IP(就是你电脑或跳板机的出口 IP)。

    然后执行 ping -c 4 -W 2 <客户端IP> 测试平均延迟。

    如果没有 SSH 变量

    会提示你手动输入一个 IP(通常填客户端公网 IP)。

    如果你没输入

    就会默认去 ping 1.1.1.1(Cloudflare 公共 DNS)。

    为什么你看到 RTT=1ms?

    本地机房 / 内网情况
    如果你的 客户端 IP 和服务器在同一个局域网 / 同一个机房,那么 ping 结果可能非常低,1ms 属于正常值。

    你使用了跳板机 / 中转
    如果你是通过另一个 VPS 或跳板机 ssh 到服务器,那脚本会 ping 那个跳板机的 IP。很多机房之间走内网互通,也可能只有 1ms。

    服务器和客户端在同一个地区
    比如你在香港用本地电脑 SSH 香港 VPS,RTT 可能就是 1ms~3ms。

  • @ef #21 我没测试,所以不清楚,你可以让gpt帮你优化一个13的脚本出来

  • 最近 dd 完 发现,压根不需要bbr 开了更慢

  • 插眼

  • 等个效果图,效果好的话再换

  • ubuntu系统有没有

  • 挺明显
    image

    都是单线程测速

1234

你好啊,陌生人!

我的朋友,看起来你是新来的,如果想参与到讨论中,点击下面的按钮!

📈用户数目📈

目前论坛共有72033位seeker

🎉欢迎新用户🎉