diff --git a/bbr.sh b/bbr.sh index 553083b..7772ec3 100644 --- a/bbr.sh +++ b/bbr.sh @@ -1,202 +1,196 @@ #!/bin/bash -# VPS 网络极限优化脚本 - 自动检测配置,发挥最大速度 -# https://github.com/xmg0828888/tcp-bbr +# BBR Blast Smooth v2 - 自动识别系统/内存智能调优版 +# 支持 Debian 11/12/13, Ubuntu 20.04/22.04/24.04 +# 根据内存大小自动调整缓冲区参数 🚀 -RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[0;33m'; CYAN='\033[0;36m'; NC='\033[0m' -[ "$(id -u)" != "0" ] && echo -e "${RED}请使用 root 运行${NC}" && exit 1 +set -e -CORES=$(nproc) -MEM_MB=$(free -m | awk '/Mem:/{print $2}') -MEM_BYTES=$((MEM_MB * 1024 * 1024)) -IFACE=$(ip route | awk '/default/{print $5}' | head -1) +# 颜色输出 +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' -show_info() { - echo -e "${CYAN}╔══════════════════════════════════╗${NC}" - echo -e "${CYAN}║ VPS 网络极限优化脚本 v1.0 ║${NC}" - echo -e "${CYAN}╚══════════════════════════════════╝${NC}" - echo -e "CPU: ${YELLOW}${CORES} 核${NC} 内存: ${YELLOW}${MEM_MB}MB${NC} 内核: ${YELLOW}$(uname -r)${NC}" - echo -e "网卡: ${YELLOW}${IFACE}${NC}" - local algo=$(sysctl -n net.ipv4.tcp_congestion_control 2>/dev/null) - local qdisc=$(sysctl -n net.core.default_qdisc 2>/dev/null) - echo -e "拥塞算法: ${YELLOW}${algo}${NC} 队列: ${YELLOW}${qdisc}${NC}" - if [ "$algo" = "bbr" ]; then - echo -e "BBR: ${GREEN}✓ 已开启${NC}" +echo -e "${BLUE}========================================${NC}" +echo -e "${BLUE} BBR Blast Smooth v2 智能调优版${NC}" +echo -e "${BLUE}========================================${NC}" +echo "" + +# 检测系统 +detect_os() { + if [ -f /etc/os-release ]; then + . /etc/os-release + OS=$ID + VER=$VERSION_ID else - echo -e "BBR: ${RED}✗ 未开启${NC}" + echo -e "${RED}❌ 无法识别系统${NC}" + exit 1 fi - echo "" -} - -# 根据内存自动计算缓冲区大小 -calc_buffers() { - if [ $MEM_MB -le 512 ]; then - RMEM_MAX=8388608; WMEM_MAX=8388608; NETDEV_BUDGET=300 - TCP_MEM="65536 131072 262144"; TCP_RMEM="4096 87380 4194304"; TCP_WMEM="4096 65536 4194304" - BACKLOG=1000; SOMAXCONN=1024; CONNTRACK=16384 - elif [ $MEM_MB -le 2048 ]; then - RMEM_MAX=16777216; WMEM_MAX=16777216; NETDEV_BUDGET=600 - TCP_MEM="131072 262144 524288"; TCP_RMEM="4096 87380 8388608"; TCP_WMEM="4096 65536 8388608" - BACKLOG=2000; SOMAXCONN=2048; CONNTRACK=65536 - elif [ $MEM_MB -le 8192 ]; then - RMEM_MAX=33554432; WMEM_MAX=33554432; NETDEV_BUDGET=1200 - TCP_MEM="262144 524288 1048576"; TCP_RMEM="4096 87380 16777216"; TCP_WMEM="4096 65536 16777216" - BACKLOG=5000; SOMAXCONN=4096; CONNTRACK=131072 - else - RMEM_MAX=67108864; WMEM_MAX=67108864; NETDEV_BUDGET=2400 - TCP_MEM="524288 1048576 2097152"; TCP_RMEM="4096 87380 33554432"; TCP_WMEM="4096 65536 33554432" - BACKLOG=10000; SOMAXCONN=8192; CONNTRACK=262144 - fi - FILE_MAX=$((MEM_MB * 256)) - [ $FILE_MAX -lt 65535 ] && FILE_MAX=65535 -} - -do_optimize() { - calc_buffers - echo -e "${GREEN}正在优化... (${MEM_MB}MB 内存方案)${NC}" - - local CONF="/etc/sysctl.d/99-network-optimize.conf" - cat > "$CONF" << EOF -# === BBR 拥塞控制 === -net.core.default_qdisc = fq -net.ipv4.tcp_congestion_control = bbr - -# === 缓冲区 (基于 ${MEM_MB}MB 内存) === -net.core.rmem_max = ${RMEM_MAX} -net.core.wmem_max = ${WMEM_MAX} -net.core.rmem_default = 262144 -net.core.wmem_default = 262144 -net.ipv4.tcp_rmem = ${TCP_RMEM} -net.ipv4.tcp_wmem = ${TCP_WMEM} -net.ipv4.tcp_mem = ${TCP_MEM} -net.ipv4.udp_mem = ${TCP_MEM} - -# === 连接队列 === -net.core.netdev_max_backlog = ${BACKLOG} -net.core.somaxconn = ${SOMAXCONN} -net.ipv4.tcp_max_syn_backlog = ${SOMAXCONN} - -# === TCP 快速回收 === -net.ipv4.tcp_tw_reuse = 1 -net.ipv4.tcp_fin_timeout = 15 -net.ipv4.tcp_keepalive_time = 300 -net.ipv4.tcp_keepalive_intvl = 30 -net.ipv4.tcp_keepalive_probes = 5 -net.ipv4.tcp_max_tw_buckets = 65535 -net.ipv4.tcp_max_orphans = 32768 - -# === TCP 性能 === -net.ipv4.tcp_fastopen = 3 -net.ipv4.tcp_mtu_probing = 1 -net.ipv4.tcp_slow_start_after_idle = 0 -net.ipv4.tcp_no_metrics_save = 1 -net.ipv4.tcp_window_scaling = 1 -net.ipv4.tcp_sack = 1 -net.ipv4.tcp_timestamps = 1 -net.ipv4.tcp_ecn = 0 -net.ipv4.tcp_syncookies = 1 -net.ipv4.tcp_adv_win_scale = 2 -net.core.netdev_budget = ${NETDEV_BUDGET} -net.core.netdev_budget_usecs = 8000 - -# === 文件描述符 === -fs.file-max = ${FILE_MAX} -fs.nr_open = ${FILE_MAX} - -# === 连接跟踪 === -net.netfilter.nf_conntrack_max = ${CONNTRACK} - -# === 其他 === -net.ipv4.ip_local_port_range = 1024 65535 -net.ipv4.ip_forward = 1 -net.ipv6.conf.all.forwarding = 1 -EOF - - sysctl --system >/dev/null 2>&1 - - # 设置文件描述符限制 - if ! grep -q "# network-optimize" /etc/security/limits.conf 2>/dev/null; then - cat >> /etc/security/limits.conf << EOF -# network-optimize -* soft nofile ${FILE_MAX} -* hard nofile ${FILE_MAX} -root soft nofile ${FILE_MAX} -root hard nofile ${FILE_MAX} -EOF - fi - - # 网卡队列优化 - if command -v ethtool &>/dev/null && [ -n "$IFACE" ]; then - ethtool -G "$IFACE" rx 4096 tx 4096 2>/dev/null - ethtool -K "$IFACE" tso on gso on gro on 2>/dev/null - fi - - echo -e "${GREEN}✓ 优化完成!${NC}" - echo "" - show_result -} - -show_result() { - echo -e "${CYAN}=== 优化结果 ===${NC}" - echo "" - echo -e "${GREEN}[ BBR 加速 ]${NC}" - echo -e " 拥塞算法: $(sysctl -n net.ipv4.tcp_congestion_control)" - echo -e " 队列调度: $(sysctl -n net.core.default_qdisc)" - echo "" - echo -e "${GREEN}[ TCP 调优 ]${NC}" - echo -e " FastOpen: $(sysctl -n net.ipv4.tcp_fastopen)" - echo -e " MTU探测: $(sysctl -n net.ipv4.tcp_mtu_probing)" - echo -e " 窗口缩放: $(sysctl -n net.ipv4.tcp_window_scaling)" - echo -e " SACK: $(sysctl -n net.ipv4.tcp_sack)" - echo -e " Timestamps: $(sysctl -n net.ipv4.tcp_timestamps)" - echo -e " tw_reuse: $(sysctl -n net.ipv4.tcp_tw_reuse)" - echo -e " fin_timeout: $(sysctl -n net.ipv4.tcp_fin_timeout)s" - echo -e " keepalive: $(sysctl -n net.ipv4.tcp_keepalive_time)s" - echo -e " 慢启动: $(sysctl -n net.ipv4.tcp_slow_start_after_idle) (0=关闭)" - echo "" - echo -e "${GREEN}[ 缓冲区 ]${NC}" - echo -e " rmem_max: $(( $(sysctl -n net.core.rmem_max) /1024/1024 ))MB" - echo -e " wmem_max: $(( $(sysctl -n net.core.wmem_max) /1024/1024 ))MB" - echo -e " tcp_rmem: $(sysctl -n net.ipv4.tcp_rmem)" - echo -e " tcp_wmem: $(sysctl -n net.ipv4.tcp_wmem)" - echo "" - echo -e "${GREEN}[ 连接 ]${NC}" - echo -e " backlog: $(sysctl -n net.core.netdev_max_backlog)" - echo -e " somaxconn: $(sysctl -n net.core.somaxconn)" - echo -e " 端口范围: $(sysctl -n net.ipv4.ip_local_port_range)" - echo -e " 文件描述符: $(sysctl -n fs.file-max)" - echo "" - echo -e "${YELLOW}✓ 重启后永久生效,无需额外操作${NC}" -} - -do_restore() { - echo -e "${YELLOW}正在恢复默认...${NC}" - rm -f /etc/sysctl.d/99-network-optimize.conf - sysctl --system >/dev/null 2>&1 - echo -e "${GREEN}✓ 已恢复默认配置${NC}" -} - -show_menu() { - clear - show_info - echo "1. 一键优化 (BBR + 内核参数 + 缓冲区)" - echo "2. 查看当前状态" - echo "3. 恢复默认配置" - echo "0. 退出" - echo "" - read -p "请选择 [0-3]: " choice - case "$choice" in - 1) do_optimize ;; - 2) show_result ;; - 3) do_restore ;; - 0) exit 0 ;; - *) echo -e "${RED}无效选择${NC}" ;; + + case "$OS" in + debian) + if [[ "$VER" =~ ^(11|12|13)$ ]]; then + echo -e "${GREEN}✓ 检测到 Debian $VER${NC}" + else + echo -e "${RED}❌ 仅支持 Debian 11/12/13${NC}" + exit 1 + fi + ;; + ubuntu) + if [[ "$VER" =~ ^(20.04|22.04|24.04)$ ]]; then + echo -e "${GREEN}✓ 检测到 Ubuntu $VER${NC}" + else + echo -e "${RED}❌ 仅支持 Ubuntu 20.04/22.04/24.04${NC}" + exit 1 + fi + ;; + *) + echo -e "${RED}❌ 不支持的系统: $OS${NC}" + exit 1 + ;; esac - echo ""; read -p "按回车继续..." && show_menu } -case "${1:-}" in - restore|disable) do_restore ;; - status) show_info; show_result ;; - menu) show_menu ;; - *) show_info; do_optimize ;; -esac +# 检测内存并设置参数 +detect_memory() { + # 获取总内存 (MB) + TOTAL_MEM=$(free -m | awk '/^Mem:/{print $2}') + echo -e "${GREEN}✓ 检测到内存: ${TOTAL_MEM}MB${NC}" + + # 缓冲区 = 内存的 1/8,最小 8MB,最大 256MB + BUF_MB=$(( TOTAL_MEM / 8 )) + [ "$BUF_MB" -lt 8 ] && BUF_MB=8 + [ "$BUF_MB" -gt 256 ] && BUF_MB=256 + BUF_BYTES=$(( BUF_MB * 1024 * 1024 )) + + if [ "$TOTAL_MEM" -lt 512 ]; then + PROFILE="micro" + echo -e "${YELLOW}→ 使用 Micro 配置 (极小内存优化)${NC}" + elif [ "$TOTAL_MEM" -lt 1024 ]; then + PROFILE="small" + echo -e "${YELLOW}→ 使用 Small 配置 (小内存优化)${NC}" + elif [ "$TOTAL_MEM" -lt 2048 ]; then + PROFILE="medium" + echo -e "${YELLOW}→ 使用 Medium 配置 (中等内存)${NC}" + elif [ "$TOTAL_MEM" -lt 4096 ]; then + PROFILE="large" + echo -e "${YELLOW}→ 使用 Large 配置 (大内存)${NC}" + else + PROFILE="xlarge" + echo -e "${YELLOW}→ 使用 XLarge 配置 (超大内存)${NC}" + fi + + RMEM_MAX=$BUF_BYTES + WMEM_MAX=$BUF_BYTES + TCP_RMEM="4096 87380 $BUF_BYTES" + TCP_WMEM="4096 65536 $BUF_BYTES" + echo -e "${YELLOW}→ 缓冲区: ${BUF_MB}MB${NC}" +} + +# 启用 BBR +enable_bbr() { + echo "" + echo -e "${BLUE}==> 启用 BBR${NC}" + modprobe tcp_bbr 2>/dev/null || true + echo "tcp_bbr" > /etc/modules-load.d/bbr.conf + echo -e "${GREEN}✓ BBR 模块已加载${NC}" +} + +# 备份原配置 +backup_config() { + if [ -f /etc/sysctl.conf ]; then + cp /etc/sysctl.conf /etc/sysctl.conf.bak.$(date +%Y%m%d%H%M%S) + echo -e "${GREEN}✓ 已备份原配置${NC}" + fi +} + +# 写入优化参数 +apply_config() { + echo "" + echo -e "${BLUE}==> 写入优化参数 (Profile: $PROFILE)${NC}" + + # 移除旧的 BBR 配置 + sed -i '/# === BBR Blast Smooth/,/# === END BBR/d' /etc/sysctl.conf 2>/dev/null || true + + cat >> /etc/sysctl.conf < 应用配置${NC}" + sysctl -p >/dev/null 2>&1 + echo -e "${GREEN}✓ 配置已生效${NC}" +} + +# 验证结果 +verify() { + echo "" + echo -e "${BLUE}==> 验证配置${NC}" + + CC=$(sysctl -n net.ipv4.tcp_congestion_control 2>/dev/null) + QDISC=$(sysctl -n net.core.default_qdisc 2>/dev/null) + + if [ "$CC" = "bbr" ] && [ "$QDISC" = "fq" ]; then + echo -e "${GREEN}✓ 拥塞控制: $CC${NC}" + echo -e "${GREEN}✓ 队列算法: $QDISC${NC}" + else + echo -e "${RED}⚠ 配置可能未完全生效,建议重启${NC}" + fi +} + +# 显示摘要 +summary() { + echo "" + echo -e "${BLUE}========================================${NC}" + echo -e "${GREEN}✅ BBR Blast Smooth v2 配置完成!${NC}" + echo -e "${BLUE}========================================${NC}" + echo -e "系统: $OS $VER" + echo -e "内存: ${TOTAL_MEM}MB" + echo -e "配置: $PROFILE" + echo -e "缓冲: $(($RMEM_MAX/1024/1024))MB" + echo "" +} + +# 主流程 +main() { + detect_os + detect_memory + enable_bbr + backup_config + apply_config + reload_config + verify + summary +} + +main