@ユメイ8 月前
12/17
00:54
#!/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
