#!/bin/bash # tcp调优脚本 v25.10.11 # 用法: # ./tcp.sh 1 启用调优 # ./tcp.sh 0 还原配置 # ./tcp.sh 2 对比优化前后的参数 BACKUP_FILE="/var/backups/tcp_backup_adaptive.conf" TUNE_FILE="/etc/sysctl.d/tcp_bbr_adaptive.conf" # 检查是否以 root 权限运行 check_root() { if [ "$EUID" -ne 0 ]; then echo "✗ 错误: 此脚本需要 root 权限运行" echo " 请使用: sudo $0" exit 1 fi } # 确保备份目录存在 ensure_backup_dir() { local backup_dir backup_dir=$(dirname "$BACKUP_FILE") if [ ! -d "$backup_dir" ]; then mkdir -p "$backup_dir" 2>/dev/null || { echo "✗ 无法创建备份目录: $backup_dir" exit 1 } fi } PARAMS=( "net.core.default_qdisc" "net.ipv4.tcp_congestion_control" "net.core.rmem_max" "net.core.wmem_max" "net.ipv4.tcp_rmem" "net.ipv4.tcp_wmem" ) get_sys_info() { MEM_KB=$(grep MemTotal /proc/meminfo | awk '{print $2}') MEM_BYTES=$((MEM_KB * 1024)) echo "内存: $((MEM_BYTES/1024/1024)) MB, CPU: $(nproc) 核" } ask_network_info() { # 读取并验证带宽输入 while true; do read -p "最大带宽 (Mbps): " BW if [[ "$BW" =~ ^[0-9]+(\.[0-9]+)?$ ]] && (( $(echo "$BW > 0" | bc -l) )); then break else echo "✗ 无效输入,请输入正数 (例如: 100 或 1000)" fi done # 读取并验证 RTT 输入 while true; do read -p "平均延迟 RTT (ms): " RTT if [[ "$RTT" =~ ^[0-9]+(\.[0-9]+)?$ ]] && (( $(echo "$RTT > 0" | bc -l) )); then break else echo "✗ 无效输入,请输入正数 (例如: 10 或 50)" fi done BW_BITS=$((BW * 1000000)) RTT_SEC=$(awk "BEGIN {print $RTT/1000}") BDP_BITS=$(awk "BEGIN {print $BW_BITS * $RTT_SEC}") BDP_BYTES=$(awk "BEGIN {print int($BDP_BITS/8)}") MIN_BUF=$((4*1024*1024)) MAX_BUF_LIMIT=$((MEM_BYTES/8)) if [ $BDP_BYTES -lt $MIN_BUF ]; then BUF=$MIN_BUF elif [ $BDP_BYTES -gt $MAX_BUF_LIMIT ]; then BUF=$MAX_BUF_LIMIT else BUF=$BDP_BYTES fi echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" echo "计算结果:" echo " 带宽延迟积 (BDP): $(numfmt --to=iec-i --suffix=B $BDP_BYTES)" echo " 缓冲区上限: $(numfmt --to=iec-i --suffix=B $BUF)" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" } check_bbr() { if ! sysctl net.ipv4.tcp_available_congestion_control 2>/dev/null | grep -qw bbr; then echo "⚠️ 未检测到 BBR 支持,尝试加载 tcp_bbr 模块..." if modprobe tcp_bbr 2>/dev/null; then echo "✓ tcp_bbr 模块加载成功" # 添加到开机自动加载 if [ ! -f /etc/modules-load.d/tcp_bbr.conf ]; then echo "tcp_bbr" > /etc/modules-load.d/tcp_bbr.conf echo "✓ 已设置 BBR 模块开机自动加载" fi else echo "✗ 内核不支持 BBR,无法加载模块" echo " 请确认内核版本 >= 4.9 或更新内核" exit 1 fi else echo "✓ BBR 支持已启用" fi } apply_tune() { check_root ensure_backup_dir echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" echo " 系统信息检测" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" get_sys_info echo "" check_bbr echo "" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" echo " 网络参数配置" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" ask_network_info echo "" if [ ! -f "$BACKUP_FILE" ]; then echo "📋 备份当前参数到 $BACKUP_FILE" for p in "${PARAMS[@]}"; do echo "$p = $(sysctl -n $p)" >> "$BACKUP_FILE" done echo "✓ 备份完成" else echo "ℹ️ 检测到已存在备份文件,跳过备份" fi echo "" echo "📝 生成配置文件: $TUNE_FILE" cat > "$TUNE_FILE" </dev/null 2>&1; then echo "✓ 配置应用成功" else echo "✗ 配置应用失败" exit 1 fi echo "" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" echo " 当前参数" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" for p in "${PARAMS[@]}"; do printf "%-35s %s\n" "$p" "$(sysctl -n $p)" done echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" } restore_tune() { check_root if [ ! -f "$BACKUP_FILE" ]; then echo "✗ 未找到备份文件: $BACKUP_FILE" echo " 无法还原配置" exit 1 fi echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" echo " 还原配置" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" [ -f "$TUNE_FILE" ] && rm -f "$TUNE_FILE" && echo "✓ 已删除调优配置文件" echo "⚙️ 还原系统参数..." while IFS= read -r line; do key=$(echo "$line" | awk -F= '{print $1}' | xargs) value=$(echo "$line" | awk -F= '{print $2}' | xargs) if [ -n "$key" ] && [ -n "$value" ]; then if sysctl -w "$key=$value" >/dev/null 2>&1; then echo " ✓ $key" else echo " ✗ $key (失败)" fi fi done < "$BACKUP_FILE" echo "" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" echo " 当前参数" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" for p in "${PARAMS[@]}"; do printf "%-35s %s\n" "$p" "$(sysctl -n $p)" done echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" read -p "是否删除备份文件? (y/N): " del_backup if [[ "$del_backup" =~ ^[Yy]$ ]]; then rm -f "$BACKUP_FILE" echo "✓ 已删除备份文件" else echo "ℹ️ 保留备份文件: $BACKUP_FILE" fi } compare_params() { if [ ! -f "$BACKUP_FILE" ]; then echo "✗ 未找到备份文件: $BACKUP_FILE" echo " 无法对比参数" exit 1 fi echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" printf "%-35s %-25s %-25s\n" "参数" "优化前" "优化后" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" for p in "${PARAMS[@]}"; do old=$(grep "^$p" "$BACKUP_FILE" | awk -F= '{print $2}' | xargs) new=$(sysctl -n $p 2>/dev/null || echo "N/A") printf "%-35s %-25s %-25s\n" "$p" "$old" "$new" done echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" } if [ -z "$1" ]; then echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" echo " TCP 调优脚本 v25.10.11" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" echo "请选择操作:" echo " 1 - 启用 BBR 调优" echo " 0 - 还原默认配置" echo " 2 - 对比优化前后参数" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" read -p "请输入选项 (1/0/2): " choice case "$choice" in 1) apply_tune ;; 0) restore_tune ;; 2) compare_params ;; *) echo "✗ 无效选项" ; exit 1 ;; esac else case "$1" in 1) apply_tune ;; 0) restore_tune ;; 2) compare_params ;; *) echo "用法: $0 {1|0|2} 1 = 启用调优 0 = 还原配置 2 = 对比优化前后的参数" ; exit 1 ;; esac fi