clean commit

This commit is contained in:
sushen339
2025-10-17 02:14:17 +08:00
commit ca016e8fca
6 changed files with 2342 additions and 0 deletions
+255
View File
@@ -0,0 +1,255 @@
#!/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" <<EOF
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
net.core.rmem_max = $BUF
net.core.wmem_max = $BUF
net.ipv4.tcp_rmem = 4096 87380 $BUF
net.ipv4.tcp_wmem = 4096 65536 $BUF
EOF
echo "⚙️ 应用配置..."
if sysctl -p "$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