@ユメイ8 月前

12/17
00:54
internet

Linux tuning

#!/bin/bash
set -u

# ============================================================
# Debian 13 / Ubuntu 26.04
# Realm / Shadowsocks Rust Network Optimization
# Universal One-Click Installer
#
# Features:
# - BBR + FQ
# - Automatic TCP buffer tuning based on RAM
# - Automatic CPU / RX / TX queue detection
# - Automatic RPS strategy
# - Automatic XPS strategy
# - VirtIO optimized
# - Realm / Shadowsocks Rust detection
# - NOFILE 1,000,000
# - Automatic backup
# - Automatic restore
# - Safe to run repeatedly
#
# Intentionally NOT modifying:
# - IRQ affinity
# - RSS
# - GRO / GSO / TSO
# - txqueuelen
#
# Designed for:
# Debian 13
# Ubuntu 26.04
# 1 / 2 / 4 / 8+ CPU VPS
# VirtIO VPS
# Realm
# Shadowsocks Rust
# ============================================================

set -e

RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
BLUE='\033[0;34m'
PLAIN='\033[0m'

log_info() { echo -e "${GREEN}[INFO]${PLAIN} $1"; }
log_warn() { echo -e "${YELLOW}[WARN]${PLAIN} $1"; }
log_err()  { echo -e "${RED}[ERROR]${PLAIN} $1"; }
log_task() { echo -e "${BLUE}[TASK]${PLAIN} $1"; }

# ============================================================
# Root
# ============================================================

if [ "$EUID" -ne 0 ]; then
    log_err "请使用 root 权限运行。"
    exit 1
fi

# ============================================================
# Required commands
# ============================================================

for CMD in ip sysctl systemctl awk grep sed find free nproc uname; do
    if ! command -v "$CMD" >/dev/null 2>&1; then
        log_err "缺少必要命令:$CMD"
        exit 1
    fi
done

# ============================================================
# OS Detection
# ============================================================

if [ -f /etc/os-release ]; then
    . /etc/os-release
else
    log_err "无法检测操作系统。"
    exit 1
fi

OS_NAME="${PRETTY_NAME:-Unknown}"
OS_ID="${ID:-unknown}"
OS_VERSION="${VERSION_ID:-Unknown}"

# ============================================================
# System Detection
# ============================================================

clear 2>/dev/null || true

echo "============================================================"
echo " Debian / Ubuntu Universal Network Optimization"
echo " Realm + Shadowsocks Rust"
echo " BBR + FQ + TCP + RPS + XPS"
echo "============================================================"
echo

log_task "检测系统环境..."

CPU_COUNT=$(nproc 2>/dev/null || echo 1)
RAM_MB=$(free -m 2>/dev/null | awk '/^Mem:/ {print $2}')
RAM_MB="${RAM_MB:-1024}"

KERNEL_VERSION=$(uname -r)
ARCH=$(uname -m)

MAIN_IFACE=$(ip route get 1.1.1.1 2>/dev/null | awk 'NR==1 {print $5}')

if [ -z "$MAIN_IFACE" ]; then
    MAIN_IFACE=$(ip route 2>/dev/null | awk '/default/ {print $5; exit}')
fi

NIC_DRIVER="Unknown"

if [ -n "${MAIN_IFACE:-}" ] && \
   command -v ethtool >/dev/null 2>&1; then

    NIC_DRIVER=$(ethtool -i "$MAIN_IFACE" 2>/dev/null |
        awk '/^driver:/ {print $2}')

fi

NIC_DRIVER="${NIC_DRIVER:-Unknown}"

echo "Operating System : $OS_NAME"
echo "OS ID            : $OS_ID"
echo "OS Version       : $OS_VERSION"
echo "Kernel           : $KERNEL_VERSION"
echo "Architecture     : $ARCH"
echo "CPU              : $CPU_COUNT"
echo "RAM              : ${RAM_MB}MB"
echo "Main Interface   : ${MAIN_IFACE:-Unknown}"
echo "NIC Driver       : $NIC_DRIVER"

echo

# ============================================================
# Paths
# ============================================================

TIMESTAMP=$(date +%Y%m%d-%H%M%S)

BACKUP_DIR="/root/ss-network-backup-${TIMESTAMP}"

SYSCTL_FILE="/etc/sysctl.d/99-ss-optimization.conf"

NETWORK_SCRIPT="/usr/local/bin/ss-network-tuning"

NETWORK_SERVICE="/etc/systemd/system/ss-network-tuning.service"

RESTORE_SCRIPT="/usr/local/bin/ss-network-restore"

SYSTEMD_LIMIT_FILE="/etc/systemd/system.conf.d/limit-nofile.conf"

RPS_BACKUP_FILE="$BACKUP_DIR/rps-xps-backup.txt"

mkdir -p "$BACKUP_DIR"

log_info "备份目录:$BACKUP_DIR"

# ============================================================
# Backup existing configuration
# ============================================================

log_task "备份现有配置..."

[ -f "$SYSCTL_FILE" ] &&
    cp -a "$SYSCTL_FILE" "$BACKUP_DIR/" 2>/dev/null || true

[ -f "$SYSTEMD_LIMIT_FILE" ] &&
    cp -a "$SYSTEMD_LIMIT_FILE" "$BACKUP_DIR/" 2>/dev/null || true

[ -f "$NETWORK_SCRIPT" ] &&
    cp -a "$NETWORK_SCRIPT" "$BACKUP_DIR/" 2>/dev/null || true

[ -f "$NETWORK_SERVICE" ] &&
    cp -a "$NETWORK_SERVICE" "$BACKUP_DIR/" 2>/dev/null || true

# ============================================================
# Backup RPS / XPS current state
# ============================================================

if [ -n "${MAIN_IFACE:-}" ]; then

    {
        echo "# Interface=$MAIN_IFACE"

        for file in \
            /sys/class/net/"$MAIN_IFACE"/queues/rx-*/rps_cpus
        do
            [ -f "$file" ] || continue
            echo "RPS|$file|$(cat "$file" 2>/dev/null || echo 0)"
        done

        for file in \
            /sys/class/net/"$MAIN_IFACE"/queues/rx-*/rps_flow_cnt
        do
            [ -f "$file" ] || continue
            echo "RPS_FLOW|$file|$(cat "$file" 2>/dev/null || echo 0)"
        done

        for file in \
            /sys/class/net/"$MAIN_IFACE"/queues/tx-*/xps_cpus
        do
            [ -f "$file" ] || continue
            echo "XPS|$file|$(cat "$file" 2>/dev/null || echo 0)"
        done

    } > "$RPS_BACKUP_FILE"

fi

# ============================================================
# BBR Detection
# ============================================================

log_task "检测 BBR..."

BBR_AVAILABLE=0

AVAILABLE_CC=$(sysctl -n \
    net.ipv4.tcp_available_congestion_control \
    2>/dev/null || true)

if echo "$AVAILABLE_CC" | grep -qw bbr; then

    BBR_AVAILABLE=1

elif command -v modprobe >/dev/null 2>&1; then

    if modprobe tcp_bbr 2>/dev/null; then
        BBR_AVAILABLE=1

        # Re-read after module loading
        AVAILABLE_CC=$(sysctl -n \
            net.ipv4.tcp_available_congestion_control \
            2>/dev/null || true)
    fi

fi

if [ "$BBR_AVAILABLE" -eq 1 ]; then

    log_info "BBR 可用。"

    mkdir -p /etc/modules-load.d

    echo "tcp_bbr" > /etc/modules-load.d/bbr.conf

else

    log_warn "当前内核无法使用 BBR。"

fi

# ============================================================
# Automatic TCP Buffer Tuning
# ============================================================

log_task "根据内存自动调整 TCP Buffer..."

if [ "$RAM_MB" -le 1024 ]; then

    RBUF_MAX=67108864
    WBUF_MAX=67108864

    TCP_RBUF_MAX=33554432
    TCP_WBUF_MAX=33554432

elif [ "$RAM_MB" -le 2048 ]; then

    RBUF_MAX=134217728
    WBUF_MAX=134217728

    TCP_RBUF_MAX=67108864
    TCP_WBUF_MAX=67108864

else

    RBUF_MAX=268435456
    WBUF_MAX=268435456

    TCP_RBUF_MAX=134217728
    TCP_WBUF_MAX=134217728

fi

echo "TCP rmem max : $TCP_RBUF_MAX"
echo "TCP wmem max : $TCP_WBUF_MAX"

# ============================================================
# Sysctl Configuration
# ============================================================

log_task "写入 Sysctl 网络优化配置..."

cat > "$SYSCTL_FILE" <<EOF

# ============================================================
# File / Memory
# ============================================================

fs.file-max = 2000000

fs.inotify.max_user_instances = 524288
fs.inotify.max_user_watches = 524288

vm.swappiness = 10
vm.vfs_cache_pressure = 50

# ============================================================
# Queue / Congestion Control
# ============================================================

net.core.default_qdisc = fq

EOF

if [ "$BBR_AVAILABLE" -eq 1 ]; then

cat >> "$SYSCTL_FILE" <<EOF
net.ipv4.tcp_congestion_control = bbr
EOF

fi

cat >> "$SYSCTL_FILE" <<EOF

# ============================================================
# Socket Buffers
# ============================================================

net.core.rmem_max = $RBUF_MAX
net.core.wmem_max = $WBUF_MAX

net.ipv4.tcp_rmem = 4096 87380 $TCP_RBUF_MAX
net.ipv4.tcp_wmem = 4096 65536 $TCP_WBUF_MAX

# ============================================================
# TCP
# ============================================================

# TCP Auto Receive Buffer
net.ipv4.tcp_moderate_rcvbuf = 1

# TCP Window Scaling
net.ipv4.tcp_window_scaling = 1

# TCP SACK
net.ipv4.tcp_sack = 1
net.ipv4.tcp_dsack = 1

# TCP Fast Open: Client + Server
net.ipv4.tcp_fastopen = 3

# Do not reduce congestion window after idle
net.ipv4.tcp_slow_start_after_idle = 0

# ============================================================
# Connection / Backlog
# ============================================================

net.core.somaxconn = 65535

net.ipv4.tcp_max_syn_backlog = 32768

net.core.netdev_max_backlog = 16384

net.ipv4.tcp_max_orphans = 65536

# ============================================================
# UDP
# ============================================================

net.ipv4.udp_rmem_min = 16384
net.ipv4.udp_wmem_min = 16384

# ============================================================
# Forwarding
# ============================================================

net.ipv4.ip_forward = 1

net.ipv4.conf.all.forwarding = 1
net.ipv4.conf.default.forwarding = 1

net.ipv6.conf.all.forwarding = 1
net.ipv6.conf.default.forwarding = 1

EOF

# ============================================================
# Apply Sysctl
# ============================================================

log_task "应用 Sysctl 配置..."

if ! sysctl --system >/dev/null 2>&1; then
    log_warn "sysctl --system 出现警告,请检查系统日志。"
fi

# ============================================================
# Create Network Tuning Script
# ============================================================

log_task "创建智能 RPS / XPS 网络调优脚本..."

cat > "$NETWORK_SCRIPT" <<'EOF'
#!/bin/bash

set -u

# ============================================================
# Automatic Network Tuning
# ============================================================

MAIN_IFACE=$(ip route get 1.1.1.1 2>/dev/null |
    awk 'NR==1 {print $5}')

if [ -z "$MAIN_IFACE" ]; then
    MAIN_IFACE=$(ip route 2>/dev/null |
        awk '/default/ {print $5; exit}')
fi

if [ -z "$MAIN_IFACE" ]; then
    echo "[WARN] Cannot detect default network interface."
    exit 0
fi

CPU_COUNT=$(nproc 2>/dev/null || echo 1)

DRIVER="Unknown"

if command -v ethtool >/dev/null 2>&1; then
    DRIVER=$(ethtool -i "$MAIN_IFACE" 2>/dev/null |
        awk '/^driver:/ {print $2}')
fi

DRIVER="${DRIVER:-Unknown}"

# ============================================================
# Queue Detection
# ============================================================

RX_QUEUE_COUNT=$(
    find "/sys/class/net/$MAIN_IFACE/queues" \
        -maxdepth 1 \
        -type d \
        -name 'rx-*' \
        2>/dev/null | wc -l
)

TX_QUEUE_COUNT=$(
    find "/sys/class/net/$MAIN_IFACE/queues" \
        -maxdepth 1 \
        -type d \
        -name 'tx-*' \
        2>/dev/null | wc -l
)

echo "============================================================"
echo " Automatic Network Tuning"
echo "============================================================"

echo "Interface : $MAIN_IFACE"
echo "Driver    : $DRIVER"
echo "CPU       : $CPU_COUNT"
echo "RX Queues : $RX_QUEUE_COUNT"
echo "TX Queues : $TX_QUEUE_COUNT"

# ============================================================
# CPU Mask
# ============================================================

if [ "$CPU_COUNT" -le 32 ]; then

    CPU_MASK=$(( (1 << CPU_COUNT) - 1 ))

    CPU_MASK_HEX=$(printf '%x' "$CPU_MASK")

else

    CPU_MASK_HEX="ffffffff"

fi

echo "CPU Mask  : $CPU_MASK_HEX"

# ============================================================
# RPS
#
# Strategy:
#
# 1 CPU:
#   RPS disabled
#
# 2+ CPU + 1 RX queue:
#   RPS enabled on all CPUs
#
# RX queues >= CPU count:
#   Hardware RSS preferred
#   RPS disabled
#
# RX queues < CPU count:
#   RPS enabled
# ============================================================

echo
echo "===== RPS Configuration ====="

RPS_MODE="disabled"

if [ "$RX_QUEUE_COUNT" -le 1 ]; then

    if [ "$CPU_COUNT" -ge 2 ]; then

        RPS_MODE="enabled"

        echo "[INFO] Single RX queue + multi CPU."
        echo "[INFO] Enabling RPS on all CPUs."

        for file in \
            /sys/class/net/"$MAIN_IFACE"/queues/rx-*/rps_cpus
        do

            [ -f "$file" ] || continue

            if printf '%s\n' "$CPU_MASK_HEX" > "$file" 2>/dev/null; then
                echo "RPS: $file -> CPU0-$((CPU_COUNT - 1))"
            fi

        done

        for file in \
            /sys/class/net/"$MAIN_IFACE"/queues/rx-*/rps_flow_cnt
        do

            [ -f "$file" ] || continue

            if [ "$CPU_COUNT" -le 2 ]; then
                echo 2048 > "$file" 2>/dev/null || true
            else
                echo 4096 > "$file" 2>/dev/null || true
            fi

        done

    else

        echo "[INFO] Single CPU detected."
        echo "[INFO] RPS disabled."

        for file in \
            /sys/class/net/"$MAIN_IFACE"/queues/rx-*/rps_cpus
        do

            [ -f "$file" ] || continue

            echo 0 > "$file" 2>/dev/null || true

        done

    fi

elif [ "$RX_QUEUE_COUNT" -ge "$CPU_COUNT" ]; then

    RPS_MODE="hardware-rss"

    echo "[INFO] RX queues >= CPU count."
    echo "[INFO] Hardware RSS preferred."
    echo "[INFO] Disabling RPS."

    for file in \
        /sys/class/net/"$MAIN_IFACE"/queues/rx-*/rps_cpus
    do

        [ -f "$file" ] || continue

        echo 0 > "$file" 2>/dev/null || true

    done

    for file in \
        /sys/class/net/"$MAIN_IFACE"/queues/rx-*/rps_flow_cnt
    do

        [ -f "$file" ] || continue

        echo 0 > "$file" 2>/dev/null || true

    done

else

    RPS_MODE="enabled"

    echo "[INFO] RX queues < CPU count."
    echo "[INFO] Enabling RPS."

    for file in \
        /sys/class/net/"$MAIN_IFACE"/queues/rx-*/rps_cpus
    do

        [ -f "$file" ] || continue

        printf '%s\n' "$CPU_MASK_HEX" > "$file" \
            2>/dev/null || true

    done

fi

# ============================================================
# XPS
#
# Multiple TX queues:
#   TX0 -> CPU0
#   TX1 -> CPU1
#   TX2 -> CPU2
#
# Single TX queue:
#   Keep kernel default
# ============================================================

echo
echo "===== XPS Configuration ====="

XPS_MODE="kernel-default"

if [ "$TX_QUEUE_COUNT" -gt 1 ]; then

    TX_INDEX=0
    XPS_CONFIGURED=0

    for file in \
        /sys/class/net/"$MAIN_IFACE"/queues/tx-*/xps_cpus
    do

        [ -f "$file" ] || continue

        CPU_INDEX=$((TX_INDEX % CPU_COUNT))

        if [ "$CPU_INDEX" -lt 32 ]; then

            MASK=$((1 << CPU_INDEX))

            MASK_HEX=$(printf '%x' "$MASK")

            if printf '%s\n' "$MASK_HEX" > "$file" 2>/dev/null; then

                echo "XPS: $(basename "$(dirname "$file")") -> CPU$CPU_INDEX"

                XPS_CONFIGURED=1

            fi

        fi

        TX_INDEX=$((TX_INDEX + 1))

    done

    if [ "$XPS_CONFIGURED" -eq 1 ]; then
        XPS_MODE="enabled"
    else
        XPS_MODE="unsupported"
    fi

else

    echo "[INFO] Single TX queue."
    echo "[INFO] XPS remains kernel default."

fi

# ============================================================
# Process Affinity
# ============================================================

echo
echo "===== Process CPU Affinity ====="

for PROC in realm ssserver; do

    PIDS=$(pidof "$PROC" 2>/dev/null || true)

    if [ -n "$PIDS" ]; then

        for PID in $PIDS; do

            AFFINITY=$(taskset -pc "$PID" 2>/dev/null |
                awk -F': ' '{print $2}')

            echo "$PROC PID=$PID CPU=$AFFINITY"

        done

    fi

done

# ============================================================
# Result
# ============================================================

echo
echo "============================================================"
echo " Network Tuning Result"
echo "============================================================"

echo "Interface : $MAIN_IFACE"
echo "Driver    : $DRIVER"
echo "CPU       : $CPU_COUNT"
echo "RX Queues : $RX_QUEUE_COUNT"
echo "TX Queues : $TX_QUEUE_COUNT"
echo "RPS Mode  : $RPS_MODE"
echo "XPS Mode  : $XPS_MODE"

echo
echo "===== RPS ====="

for file in \
    /sys/class/net/"$MAIN_IFACE"/queues/rx-*/rps_cpus
do

    [ -f "$file" ] || continue

    echo "$file = $(cat "$file" 2>/dev/null || echo unknown)"

done

echo
echo "===== XPS ====="

for file in \
    /sys/class/net/"$MAIN_IFACE"/queues/tx-*/xps_cpus
do

    [ -f "$file" ] || continue

    echo "$file = $(cat "$file" 2>/dev/null || echo unknown)"

done

echo
echo "[INFO] Network tuning completed."

EOF

chmod +x "$NETWORK_SCRIPT"

# ============================================================
# Systemd Network Tuning Service
# ============================================================

log_task "创建 Systemd Network Tuning 服务..."

cat > "$NETWORK_SERVICE" <<EOF
[Unit]
Description=Realm Shadowsocks Network Auto Tuning
After=network-online.target
Wants=network-online.target

[Service]
Type=oneshot
ExecStart=$NETWORK_SCRIPT
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload

systemctl enable ss-network-tuning.service \
    >/dev/null 2>&1 || true

systemctl restart ss-network-tuning.service \
    >/dev/null 2>&1 || true

# ============================================================
# Global NOFILE
# ============================================================

log_task "配置 Systemd 全局 NOFILE..."

mkdir -p /etc/systemd/system.conf.d

cat > "$SYSTEMD_LIMIT_FILE" <<EOF
[Manager]
DefaultLimitNOFILE=1000000
EOF

# ============================================================
# Detect Shadowsocks / Realm
# ============================================================

systemctl daemon-reload

SS_SERVICE=""

for SERVICE in \
    shadowsocks-rust.service \
    shadowsocks.service \
    ssserver.service
do

    if systemctl list-unit-files "$SERVICE" \
        2>/dev/null | grep -q "^$SERVICE"
    then

        SS_SERVICE="$SERVICE"

        break

    fi

done

if [ -z "$SS_SERVICE" ]; then

    SS_SERVICE=$(
        systemctl list-units \
            --type=service \
            --all \
            --no-legend \
            2>/dev/null |
        grep -Ei 'shadowsocks|ssserver' |
        awk '{print $1}' |
        head -1
    )

fi

# ============================================================
# Shadowsocks NOFILE
# ============================================================

if [ -n "$SS_SERVICE" ]; then

    log_info "检测到 Shadowsocks 服务:$SS_SERVICE"

    mkdir -p \
        "/etc/systemd/system/${SS_SERVICE}.d"

    cat > \
        "/etc/systemd/system/${SS_SERVICE}.d/limits.conf" \
        <<EOF
[Service]
LimitNOFILE=1000000
EOF

fi

# ============================================================
# Realm Detection
# ============================================================

REALM_SERVICE=""

for SERVICE in \
    realm.service \
    realm-server.service
do

    if systemctl list-unit-files "$SERVICE" \
        2>/dev/null | grep -q "^$SERVICE"
    then

        REALM_SERVICE="$SERVICE"

        break

    fi

done

if [ -n "$REALM_SERVICE" ]; then

    log_info "检测到 Realm 服务:$REALM_SERVICE"

    mkdir -p \
        "/etc/systemd/system/${REALM_SERVICE}.d"

    cat > \
        "/etc/systemd/system/${REALM_SERVICE}.d/limits.conf" \
        <<EOF
[Service]
LimitNOFILE=1000000
EOF

fi

# ============================================================
# Reload Systemd
# ============================================================

systemctl daemon-reload

# ============================================================
# Restore Script
# ============================================================

log_task "创建恢复脚本..."

cat > "$RESTORE_SCRIPT" <<EOF
#!/bin/bash

set -u

BACKUP_DIR="$BACKUP_DIR"

SYSCTL_FILE="/etc/sysctl.d/99-ss-optimization.conf"

NETWORK_SCRIPT="/usr/local/bin/ss-network-tuning"

NETWORK_SERVICE="/etc/systemd/system/ss-network-tuning.service"

SYSTEMD_LIMIT_FILE="/etc/systemd/system.conf.d/limit-nofile.conf"

RPS_BACKUP_FILE="\$BACKUP_DIR/rps-xps-backup.txt"

echo "============================================================"
echo " Network Optimization Restore"
echo "============================================================"

if [ ! -d "\$BACKUP_DIR" ]; then

    echo "Backup directory not found:"
    echo "\$BACKUP_DIR"

    exit 1

fi

read -r -p "确定恢复吗?[y/N]: " CONFIRM

if [[ ! "\$CONFIRM" =~ ^[Yy]\$ ]]; then
    exit 0
fi

# Stop tuning service

systemctl disable --now \
    ss-network-tuning.service \
    2>/dev/null || true

# Restore Sysctl

if [ -f "\$BACKUP_DIR/99-ss-optimization.conf" ]; then

    cp -a \
        "\$BACKUP_DIR/99-ss-optimization.conf" \
        /etc/sysctl.d/

else

    rm -f "\$SYSCTL_FILE"

fi

# Restore Systemd NOFILE

if [ -f "\$BACKUP_DIR/limit-nofile.conf" ]; then

    mkdir -p /etc/systemd/system.conf.d

    cp -a \
        "\$BACKUP_DIR/limit-nofile.conf" \
        "\$SYSTEMD_LIMIT_FILE"

else

    rm -f "\$SYSTEMD_LIMIT_FILE"

fi

# Restore RPS / XPS

if [ -f "\$RPS_BACKUP_FILE" ]; then

    while IFS='|' read -r TYPE FILE VALUE
    do

        [ -n "\$FILE" ] || continue

        [ -f "\$FILE" ] || continue

        case "\$TYPE" in

            RPS|RPS_FLOW|XPS)

                echo "\$VALUE" > "\$FILE" \
                    2>/dev/null || true

            ;;

        esac

    done < "\$RPS_BACKUP_FILE"

fi

# Remove tuning files

rm -f /etc/modules-load.d/bbr.conf

rm -f /usr/local/bin/ss-network-tuning

rm -f /etc/systemd/system/ss-network-tuning.service

# Remove our service overrides

rm -f \
    /etc/systemd/system/shadowsocks-rust.service.d/limits.conf \
    /etc/systemd/system/shadowsocks.service.d/limits.conf \
    /etc/systemd/system/ssserver.service.d/limits.conf \
    /etc/systemd/system/realm.service.d/limits.conf \
    /etc/systemd/system/realm-server.service.d/limits.conf

systemctl daemon-reload

sysctl --system

echo
echo "Restore completed."

echo
echo "建议重启服务器以确保所有服务恢复原始状态:"

echo
echo "reboot"

EOF

chmod +x "$RESTORE_SCRIPT"

# ============================================================
# Final Verification
# ============================================================

echo

echo "============================================================"
echo "                Optimization Result"
echo "============================================================"

echo

CURRENT_CC=$(sysctl -n \
    net.ipv4.tcp_congestion_control \
    2>/dev/null || echo "unknown")

AVAILABLE_CC=$(sysctl -n \
    net.ipv4.tcp_available_congestion_control \
    2>/dev/null || echo "unknown")

CURRENT_QDISC=$(sysctl -n \
    net.core.default_qdisc \
    2>/dev/null || echo "unknown")

NETDEV_BACKLOG=$(sysctl -n \
    net.core.netdev_max_backlog \
    2>/dev/null || echo "unknown")

TCP_RMEM=$(sysctl -n \
    net.ipv4.tcp_rmem \
    2>/dev/null || echo "unknown")

TCP_WMEM=$(sysctl -n \
    net.ipv4.tcp_wmem \
    2>/dev/null || echo "unknown")

SOMAXCONN=$(sysctl -n \
    net.core.somaxconn \
    2>/dev/null || echo "unknown")

echo "OS               : $OS_NAME"

echo "Kernel           : $KERNEL_VERSION"

echo "CPU              : $CPU_COUNT Core"

echo "RAM              : $RAM_MB MB"

echo "Main NIC         : ${MAIN_IFACE:-Unknown}"

echo "NIC Driver       : $NIC_DRIVER"

echo

echo "TCP CC           : $CURRENT_CC"

echo "Available CC     : $AVAILABLE_CC"

echo "Default Qdisc    : $CURRENT_QDISC"

echo "netdev backlog   : $NETDEV_BACKLOG"

echo "somaxconn        : $SOMAXCONN"

echo "tcp_rmem         : $TCP_RMEM"

echo "tcp_wmem         : $TCP_WMEM"

echo

# ============================================================
# BBR Result
# ============================================================

if [ "$CURRENT_CC" = "bbr" ]; then

    echo -e "✅ ${GREEN}BBR 已启用${PLAIN}"

elif echo "$AVAILABLE_CC" | grep -qw bbr; then

    echo -e "⚠️ ${YELLOW}内核支持 BBR,但当前尚未启用${PLAIN}"

else

    echo -e "❌ ${RED}BBR 不可用${PLAIN}"

fi

# ============================================================
# Network Service
# ============================================================

echo

if systemctl is-enabled \
    ss-network-tuning.service \
    >/dev/null 2>&1
then

    echo -e \
        "✅ ${GREEN}Network Tuning 已设置开机启动${PLAIN}"

else

    echo -e \
        "⚠️ ${YELLOW}Network Tuning 未设置开机启动${PLAIN}"

fi

# ============================================================
# Realm
# ============================================================

echo

if [ -n "$REALM_SERVICE" ]; then

    echo "Realm Service:"
    echo "  $REALM_SERVICE"

    REALM_LIMIT=$(systemctl show \
        "$REALM_SERVICE" \
        -p LimitNOFILE \
        2>/dev/null || true)

    echo "  $REALM_LIMIT"

else

    if pidof realm >/dev/null 2>&1; then

        echo "Realm Process: detected"

        for PID in $(pidof realm); do

            AFFINITY=$(taskset -pc "$PID" 2>/dev/null |
                awk -F': ' '{print $2}')

            echo "  PID=$PID CPU=$AFFINITY"

        done

    else

        echo "Realm: not detected"

    fi

fi

# ============================================================
# Shadowsocks
# ============================================================

echo

if [ -n "$SS_SERVICE" ]; then

    echo "Shadowsocks Service:"
    echo "  $SS_SERVICE"

    SS_LIMIT=$(systemctl show \
        "$SS_SERVICE" \
        -p LimitNOFILE \
        2>/dev/null || true)

    echo "  $SS_LIMIT"

else

    if pidof ssserver >/dev/null 2>&1; then

        echo "ssserver Process: detected"

        for PID in $(pidof ssserver); do

            AFFINITY=$(taskset -pc "$PID" 2>/dev/null |
                awk -F': ' '{print $2}')

            echo "  PID=$PID CPU=$AFFINITY"

        done

    else

        echo "Shadowsocks Rust: not detected"

    fi

fi

# ============================================================
# Final
# ============================================================

echo

echo "============================================================"
echo "                    优化完成!"
echo "============================================================"

echo "备份目录:"
echo "  $BACKUP_DIR"

echo

echo "恢复命令:"
echo "  $RESTORE_SCRIPT"

echo

echo "网络调优服务:"
echo "  systemctl status ss-network-tuning.service"

echo

echo "查看 RPS:"
echo "  cat /sys/class/net/$MAIN_IFACE/queues/rx-*/rps_cpus"

echo

echo "查看 XPS:"
echo "  cat /sys/class/net/$MAIN_IFACE/queues/tx-*/xps_cpus"

echo

echo "查看 CPU:"
echo "  htop"

echo

Linux tuning