第十一部分:性能优化

36. 网络性能优化

36.1 TCP参数调优

36.1.1 基础TCP优化

优化sysctl参数:

#!/bin/bash
# optimize-tcp.sh

echo "=== TCP性能优化 ==="

SYSCTL_CONF="/etc/sysctl.d/99-wireguard-tcp.conf"

cat << 'EOF' | sudo tee $SYSCTL_CONF
# TCP性能优化

# TCP窗口缩放
net.ipv4.tcp_window_scaling = 1

# 时间戳
net.ipv4.tcp_timestamps = 1

# 选择性确认
net.ipv4.tcp_sack = 1

# TCP Fast Open
net.ipv4.tcp_fastopen = 3

# TCP缓冲区大小
# 格式: min default max
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216

# 核心缓冲区
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.rmem_default = 262144
net.core.wmem_default = 262144

# TCP拥塞控制
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr

# TCP保持连接
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_intvl = 60
net.ipv4.tcp_keepalive_probes = 3

# 重用TIME_WAIT状态的套接字
net.ipv4.tcp_tw_reuse = 1

# 减少FIN-WAIT-2超时
net.ipv4.tcp_fin_timeout = 30

# SYN重传次数
net.ipv4.tcp_syn_retries = 3
net.ipv4.tcp_synack_retries = 3

# 最大SYN队列
net.ipv4.tcp_max_syn_backlog = 8192

# 连接队列大小
net.core.somaxconn = 8192

# 网络设备队列
net.core.netdev_max_backlog = 5000

# 禁用TCP慢启动(谨慎使用)
# net.ipv4.tcp_slow_start_after_idle = 0

# MTU探测
net.ipv4.tcp_mtu_probing = 1
EOF

# 应用配置
sudo sysctl -p $SYSCTL_CONF

echo "✓ TCP参数已优化"

# 验证关键参数
echo ""
echo "验证关键参数:"
echo "BBR拥塞控制: $(sysctl net.ipv4.tcp_congestion_control)"
echo "TCP Fast Open: $(sysctl net.ipv4.tcp_fastopen)"
echo "默认qdisc: $(sysctl net.core.default_qdisc)"

36.1.2 BBR拥塞控制

启用和验证BBR:

#!/bin/bash
# enable-bbr.sh

echo "=== 启用BBR拥塞控制 ==="

# 1. 检查内核版本(需要4.9+)
echo "[1] 检查内核版本..."
KERNEL_VERSION=$(uname -r | cut -d. -f1,2)
REQUIRED_VERSION="4.9"

if [ "$(printf '%s\n' "$REQUIRED_VERSION" "$KERNEL_VERSION" | sort -V | head -n1)" != "$REQUIRED_VERSION" ]; then
    echo "✗ 内核版本过低,需要4.9或更高"
    echo "当前版本: $(uname -r)"
    exit 1
fi

echo "✓ 内核版本满足要求: $(uname -r)"

# 2. 加载BBR模块
echo ""
echo "[2] 加载BBR模块..."
sudo modprobe tcp_bbr

# 永久加载
if ! grep -q "tcp_bbr" /etc/modules; then
    echo "tcp_bbr" | sudo tee -a /etc/modules
fi

echo "✓ BBR模块已加载"

# 3. 配置sysctl
echo ""
echo "[3] 配置sysctl..."

cat << 'EOF' | sudo tee /etc/sysctl.d/99-bbr.conf
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
EOF

sudo sysctl -p /etc/sysctl.d/99-bbr.conf

# 4. 验证BBR
echo ""
echo "[4] 验证BBR..."

if sysctl net.ipv4.tcp_congestion_control | grep -q bbr; then
    echo "✓ BBR已启用"
else
    echo "✗ BBR未启用"
    exit 1
fi

# 5. 检查可用的拥塞控制算法
echo ""
echo "[5] 可用的拥塞控制算法:"
sysctl net.ipv4.tcp_available_congestion_control

echo ""
echo "=== BBR配置完成 ==="

BBR性能测试:

#!/bin/bash
# test-bbr-performance.sh

echo "=== BBR性能测试 ==="

SERVER="10.8.0.1"
TEST_DURATION=30

# 测试函数
test_throughput() {
    local cc_algo=$1
    
    echo ""
    echo "测试 $cc_algo..."
    
    # 临时切换拥塞控制算法
    sudo sysctl -w net.ipv4.tcp_congestion_control=$cc_algo > /dev/null
    
    # 使用iperf3测试
    result=$(iperf3 -c $SERVER -t $TEST_DURATION -J 2>/dev/null)
    
    if [ $? -eq 0 ]; then
        # 提取结果
        throughput=$(echo $result | jq -r '.end.sum_received.bits_per_second' | awk '{printf "%.2f", $1/1000000}')
        echo "  吞吐量: ${throughput} Mbps"
    else
        echo "  测试失败"
    fi
}

# 测试不同的拥塞控制算法
for algo in cubic bbr; do
    test_throughput $algo
done

# 恢复BBR
sudo sysctl -w net.ipv4.tcp_congestion_control=bbr > /dev/null

echo ""
echo "=== 测试完成 ==="

36.2 MTU优化

36.2.1 查找最优MTU

MTU探测脚本:

#!/bin/bash
# find-optimal-mtu.sh

TARGET=${1:-10.8.0.1}

echo "=== 查找最优MTU ==="
echo "目标: $TARGET"
echo ""

# 从大到小测试
for mtu in 1500 1400 1380 1360 1340 1320 1300 1280 1260 1240 1220 1200; do
    # 计算数据大小(MTU - 28字节头部)
    data_size=$((mtu - 28))
    
    # 测试(禁止分片)
    if ping -M do -s $data_size -c 3 -W 2 $TARGET > /dev/null 2>&1; then
        echo "✓ MTU $mtu: 成功"
        
        # 找到第一个成功的,就是最优MTU
        echo ""
        echo "推荐MTU: $mtu"
        echo ""
        echo "配置方法:"
        echo "1. 修改WireGuard配置:"
        echo "   [Interface]"
        echo "   MTU = $mtu"
        echo ""
        echo "2. 或修改接口MTU:"
        echo "   sudo ip link set wg0 mtu $mtu"
        
        break
    else
        echo "✗ MTU $mtu: 失败(需要分片)"
    fi
done

36.2.2 动态MTU调整

自动MTU配置脚本:

#!/bin/bash
# auto-mtu.sh

INTERFACE="wg0"
TARGET="10.8.0.1"

echo "=== 自动MTU配置 ==="

# 查找最优MTU
optimal_mtu=1420  # WireGuard默认值

for test_mtu in 1500 1480 1460 1440 1420 1400 1380 1360 1340 1320 1300; do
    data_size=$((test_mtu - 28))
    
    if ping -M do -s $data_size -c 3 -W 2 $TARGET > /dev/null 2>&1; then
        optimal_mtu=$test_mtu
        break
    fi
done

echo "检测到最优MTU: $optimal_mtu"

# 获取当前MTU
current_mtu=$(ip link show $INTERFACE | grep -oP 'mtu \K\d+')
echo "当前MTU: $current_mtu"

# 如果不同,则更新
if [ "$current_mtu" != "$optimal_mtu" ]; then
    echo "更新MTU到 $optimal_mtu..."
    sudo ip link set $INTERFACE mtu $optimal_mtu
    
    # 更新配置文件
    CONFIG_FILE="/etc/wireguard/wg0.conf"
    if grep -q "^MTU" $CONFIG_FILE; then
        sudo sed -i "s/^MTU.*/MTU = $optimal_mtu/" $CONFIG_FILE
    else
        sudo sed -i "/^\[Interface\]/a MTU = $optimal_mtu" $CONFIG_FILE
    fi
    
    echo "✓ MTU已更新"
else
    echo "✓ MTU已是最优值"
fi

36.3 缓冲区优化

36.3.1 网络缓冲区调整

优化网络缓冲区:

#!/bin/bash
# optimize-buffers.sh

echo "=== 网络缓冲区优化 ==="

SYSCTL_CONF="/etc/sysctl.d/99-network-buffers.conf"

cat << 'EOF' | sudo tee $SYSCTL_CONF
# 网络缓冲区优化

# 核心接收缓冲区
net.core.rmem_max = 134217728
net.core.rmem_default = 16777216

# 核心发送缓冲区
net.core.wmem_max = 134217728
net.core.wmem_default = 16777216

# TCP接收缓冲区 (min, default, max)
net.ipv4.tcp_rmem = 4096 87380 134217728

# TCP发送缓冲区 (min, default, max)
net.ipv4.tcp_wmem = 4096 65536 134217728

# UDP缓冲区
net.ipv4.udp_rmem_min = 16384
net.ipv4.udp_wmem_min = 16384

# 网络设备接收队列
net.core.netdev_max_backlog = 250000

# 接收包处理队列
net.core.netdev_budget = 600
net.core.netdev_budget_usecs = 8000
EOF

sudo sysctl -p $SYSCTL_CONF

echo "✓ 缓冲区参数已优化"

# 显示当前配置
echo ""
echo "当前缓冲区配置:"
sysctl net.core.rmem_max net.core.wmem_max
sysctl net.ipv4.tcp_rmem net.ipv4.tcp_wmem

36.3.2 接口队列长度

调整接口队列:

#!/bin/bash
# optimize-queue.sh

INTERFACE="wg0"

echo "=== 优化接口队列 ==="

# 当前队列长度
current_txqueuelen=$(ip link show $INTERFACE | grep -oP 'qlen \K\d+')
echo "当前队列长度: $current_txqueuelen"

# 推荐值:10000
recommended_txqueuelen=10000

if [ "$current_txqueuelen" != "$recommended_txqueuelen" ]; then
    echo "设置队列长度为 $recommended_txqueuelen..."
    sudo ip link set $INTERFACE txqueuelen $recommended_txqueuelen
    
    # 永久配置
    cat << EOF | sudo tee /etc/systemd/system/wg-queue-optimize.service
[Unit]
Description=Optimize WireGuard Queue Length
[email protected]
[email protected]

[Service]
Type=oneshot
ExecStart=/sbin/ip link set $INTERFACE txqueuelen $recommended_txqueuelen
RemainOnExit=yes

[Install]
WantedBy=multi-user.target
EOF
    
    sudo systemctl enable wg-queue-optimize
    
    echo "✓ 队列长度已优化"
else
    echo "✓ 队列长度已是最优值"
fi

37. 系统性能优化

37.1 CPU优化

37.1.1 CPU亲和性设置

绑定WireGuard到特定CPU核心:

#!/bin/bash
# set-cpu-affinity.sh

echo "=== 设置WireGuard CPU亲和性 ==="

# 1. 检查CPU核心数
CPU_CORES=$(nproc)
echo "系统CPU核心数: $CPU_CORES"

if [ $CPU_CORES -lt 2 ]; then
    echo "⚠ 警告: CPU核心数不足,不建议绑定"
    exit 0
fi

# 2. 查找WireGuard相关进程
echo ""
echo "查找WireGuard进程..."

# WireGuard是内核模块,查找相关的kworker
WIREGUARD_WORKERS=$(ps aux | grep -E '\[kworker.*wg\]' | awk '{print $2}')

if [ -z "$WIREGUARD_WORKERS" ]; then
    echo "未找到WireGuard工作进程"
else
    echo "找到WireGuard工作进程:"
    echo "$WIREGUARD_WORKERS"
fi

# 3. 绑定网络中断到特定CPU
echo ""
echo "优化网络中断分布..."

# 查找网卡中断
NIC_INTERFACE="pnet0"  # 根据实际情况修改

if [ -d "/sys/class/net/$NIC_INTERFACE" ]; then
    # 获取IRQ号
    IRQ_NUMBERS=$(grep $NIC_INTERFACE /proc/interrupts | awk -F: '{print $1}' | tr -d ' ')
    
    # 分配到不同CPU(轮询)
    cpu_index=0
    for irq in $IRQ_NUMBERS; do
        # 计算CPU掩码
        cpu_mask=$((1 << cpu_index))
        cpu_mask_hex=$(printf '%x' $cpu_mask)
        
        echo "  IRQ $irq -> CPU $cpu_index (掩码: $cpu_mask_hex)"
        echo $cpu_mask_hex | sudo tee /proc/irq/$irq/smp_affinity > /dev/null
        
        cpu_index=$(((cpu_index + 1) % CPU_CORES))
    done
    
    echo "✓ 网络中断已优化分布"
else
    echo "⚠ 网卡接口 $NIC_INTERFACE 不存在"
fi

# 4. 配置RPS/RPS(接收包控制)
echo ""
echo "配置RPS(接收包控制)..."

# 为wg0配置RPS
WG_INTERFACE="wg0"

if [ -d "/sys/class/net/$WG_INTERFACE" ]; then
    # 启用所有CPU参与处理
    rps_cpus=$(printf '%x' $((2**CPU_CORES - 1)))
    
    for queue in /sys/class/net/$WG_INTERFACE/queues/rx-*/rps_cpus; do
        echo $rps_cpus | sudo tee $queue > /dev/null
    done
    
    # 配置RPS流限制
    for queue in /sys/class/net/$WG_INTERFACE/queues/rx-*/rps_flow_cnt; do
        echo 32768 | sudo tee $queue > /dev/null
    done
    
    echo "✓ RPS已配置"
else
    echo "⚠ WireGuard接口未运行"
fi

echo ""
echo "=== CPU亲和性配置完成 ==="

持久化CPU优化配置:

#!/bin/bash
# persistent-cpu-optimization.sh

# 创建systemd服务
cat << 'EOF' | sudo tee /etc/systemd/system/wireguard-cpu-optimize.service
[Unit]
Description=WireGuard CPU Optimization
[email protected]
[email protected]

[Service]
Type=oneshot
RemainOnExit=yes
ExecStart=/usr/local/bin/set-cpu-affinity.sh

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl enable wireguard-cpu-optimize
sudo systemctl start wireguard-cpu-optimize

echo "✓ CPU优化已持久化"

37.1.2 中断合并

优化网卡中断合并:

#!/bin/bash
# optimize-interrupt-coalescing.sh

NIC_INTERFACE="pnet0"

echo "=== 优化网卡中断合并 ==="

# 1. 查看当前设置
echo "当前中断合并设置:"
sudo ethtool -c $NIC_INTERFACE 2>/dev/null

# 2. 优化设置
echo ""
echo "应用优化设置..."

# 接收中断合并(微秒)
sudo ethtool -C $NIC_INTERFACE rx-usecs 50 2>/dev/null

# 发送中断合并
sudo ethtool -C $NIC_INTERFACE tx-usecs 50 2>/dev/null

# 接收帧数
sudo ethtool -C $NIC_INTERFACE rx-frames 32 2>/dev/null

# 发送帧数
sudo ethtool -C $NIC_INTERFACE tx-frames 32 2>/dev/null

if [ $? -eq 0 ]; then
    echo "✓ 中断合并已优化"
else
    echo "⚠ 此网卡可能不支持中断合并"
fi

# 3. 验证设置
echo ""
echo "验证新设置:"
sudo ethtool -c $NIC_INTERFACE 2>/dev/null

37.2 内存优化

37.2.1 内存参数调优

优化内存管理:

#!/bin/bash
# optimize-memory.sh

echo "=== 内存优化 ==="

SYSCTL_CONF="/etc/sysctl.d/99-memory-optimize.conf"

cat << 'EOF' | sudo tee $SYSCTL_CONF
# 内存优化参数

# 虚拟内存
vm.swappiness = 10
vm.vfs_cache_pressure = 50

# 脏页管理
vm.dirty_ratio = 15
vm.dirty_background_ratio = 5

# 内存overcommit
vm.overcommit_memory = 1
vm.overcommit_ratio = 50

# 透明大页
vm.nr_hugepages = 128

# 内存压缩
vm.page-cluster = 3
EOF

sudo sysctl -p $SYSCTL_CONF

echo "✓ 内存参数已优化"

# 显示当前内存使用
echo ""
echo "当前内存使用:"
free -h

37.2.2 大页内存

配置大页内存:

#!/bin/bash
# setup-hugepages.sh

echo "=== 配置大页内存 ==="

# 1. 检查大页支持
echo "检查大页支持:"
grep -i hugepage /proc/meminfo

# 2. 计算推荐的大页数量
TOTAL_MEM_KB=$(grep MemTotal /proc/meminfo | awk '{print $2}')
TOTAL_MEM_GB=$((TOTAL_MEM_KB / 1048576))

# 分配1GB给大页(2MB页面)
HUGEPAGES_COUNT=512

echo ""
echo "总内存: ${TOTAL_MEM_GB}GB"
echo "推荐大页数: $HUGEPAGES_COUNT (1GB)"

# 3. 配置大页
echo $HUGEPAGES_COUNT | sudo tee /proc/sys/vm/nr_hugepages

# 永久配置
if ! grep -q "vm.nr_hugepages" /etc/sysctl.conf; then
    echo "vm.nr_hugepages = $HUGEPAGES_COUNT" | sudo tee -a /etc/sysctl.conf
fi

# 4. 挂载hugepages
if ! mount | grep -q hugetlbfs; then
    sudo mkdir -p /mnt/huge
    echo "hugetlbfs /mnt/huge hugetlbfs defaults 0 0" | sudo tee -a /etc/fstab
    sudo mount /mnt/huge
    echo "✓ 大页文件系统已挂载"
fi

# 5. 验证
echo ""
echo "验证大页配置:"
grep -i hugepage /proc/meminfo

echo ""
echo "✓ 大页内存配置完成"

37.3 I/O优化

37.3.1 磁盘调度器

优化I/O调度器:

#!/bin/bash
# optimize-io-scheduler.sh

echo "=== I/O调度器优化 ==="

# 1. 检测磁盘类型和当前调度器
for disk in /sys/block/sd*; do
    disk_name=$(basename $disk)
    
    echo "磁盘: $disk_name"
    
    # 检查是否为SSD
    if [ "$(cat $disk/queue/rotational)" = "0" ]; then
        disk_type="SSD"
        recommended_scheduler="none"
    else
        disk_type="HDD"
        recommended_scheduler="mq-deadline"
    fi
    
    current_scheduler=$(cat $disk/queue/scheduler | grep -oP '\[\K[^\]]+')
    
    echo "  类型: $disk_type"
    echo "  当前调度器: $current_scheduler"
    echo "  推荐调度器: $recommended_scheduler"
    
    # 应用推荐调度器
    if [ "$current_scheduler" != "$recommended_scheduler" ]; then
        echo "  应用调度器: $recommended_scheduler"
        echo $recommended_scheduler | sudo tee $disk/queue/scheduler > /dev/null
    fi
    
    echo ""
done

# 2. 创建udev规则持久化配置
cat << 'EOF' | sudo tee /etc/udev/rules.d/60-scheduler.rules
# SSD使用none调度器
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="none"

# HDD使用mq-deadline调度器
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="1", ATTR{queue/scheduler}="mq-deadline"
EOF

sudo udevadm control --reload-rules

echo "✓ I/O调度器已优化"

37.3.2 读写缓存优化

优化文件系统缓存:

#!/bin/bash
# optimize-fs-cache.sh

echo "=== 文件系统缓存优化 ==="

SYSCTL_CONF="/etc/sysctl.d/99-fs-cache.conf"

cat << 'EOF' | sudo tee $SYSCTL_CONF
# 文件系统缓存优化

# inode和dentry缓存
vm.vfs_cache_pressure = 50

# 文件句柄限制
fs.file-max = 2097152

# 单个进程可打开的文件数
fs.nr_open = 1048576

# AIO最大请求数
fs.aio-max-nr = 1048576

# inotify限制
fs.inotify.max_user_watches = 524288
fs.inotify.max_user_instances = 512
EOF

sudo sysctl -p $SYSCTL_CONF

# 配置limits
cat << 'EOF' | sudo tee -a /etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535
* soft nproc 65535
* hard nproc 65535
EOF

echo "✓ 文件系统缓存已优化"

38. 协议优化

38.1 UDP优化

38.1.1 UDP缓冲区调整

优化UDP参数:

#!/bin/bash
# optimize-udp.sh

echo "=== UDP优化 ==="

SYSCTL_CONF="/etc/sysctl.d/99-udp-optimize.conf"

cat << 'EOF' | sudo tee $SYSCTL_CONF
# UDP优化参数

# UDP接收缓冲区
net.core.rmem_max = 134217728
net.core.rmem_default = 16777216

# UDP发送缓冲区
net.core.wmem_max = 134217728
net.core.wmem_default = 16777216

# UDP特定缓冲区
net.ipv4.udp_rmem_min = 16384
net.ipv4.udp_wmem_min = 16384

# UDP内存限制
net.ipv4.udp_mem = 262144 524288 1048576

# 增加接收队列
net.core.netdev_max_backlog = 250000

# 启用早期demux(提高性能)
net.ipv4.ip_early_demux = 1
net.ipv4.udp_early_demux = 1

# 允许重用本地端口
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.ip_local_reserved_ports = 51820
EOF

sudo sysctl -p $SYSCTL_CONF

echo "✓ UDP参数已优化"

# 验证关键参数
echo ""
echo "验证UDP配置:"
sysctl net.core.rmem_max net.core.wmem_max
sysctl net.ipv4.udp_rmem_min net.ipv4.udp_wmem_min

38.1.2 UDP校验和卸载

配置UDP校验和卸载:

#!/bin/bash
# configure-udp-offload.sh

NIC_INTERFACE="pnet0"

echo "=== 配置UDP校验和卸载 ==="

# 1. 查看当前offload设置
echo "当前offload设置:"
sudo ethtool -k $NIC_INTERFACE | grep udp

# 2. 启用UDP校验和卸载
echo ""
echo "启用UDP校验和卸载..."

# 接收校验和
sudo ethtool -K $NIC_INTERFACE rx-udp_tunnel-port-offload on 2>/dev/null

# 发送校验和
sudo ethtool -K $NIC_INTERFACE tx-udp_tnl-segmentation on 2>/dev/null
sudo ethtool -K $NIC_INTERFACE tx-udp_tnl-csum-segmentation on 2>/dev/null

if [ $? -eq 0 ]; then
    echo "✓ UDP offload已启用"
else
    echo "⚠ 网卡可能不支持某些offload特性"
fi

# 3. 验证
echo ""
echo "验证设置:"
sudo ethtool -k $NIC_INTERFACE | grep -E "udp|segmentation"

# 4. 持久化配置
cat << EOF | sudo tee /etc/systemd/system/udp-offload.service
[Unit]
Description=Configure UDP Offload
After=network.target

[Service]
Type=oneshot
ExecStart=/usr/sbin/ethtool -K $NIC_INTERFACE rx-udp_tunnel-port-offload on
ExecStart=/usr/sbin/ethtool -K $NIC_INTERFACE tx-udp_tnl-segmentation on
RemainOnExit=yes

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl enable udp-offload

echo "✓ UDP offload配置已持久化"

38.2 WireGuard特定优化

38.2.1 持久化保活优化

优化保活策略:

#!/bin/bash
# optimize-keepalive.sh

echo "=== 优化WireGuard保活配置 ==="

CONFIG_FILE="/etc/wireguard/wg0.conf"

# 备份配置
sudo cp $CONFIG_FILE ${CONFIG_FILE}.bak

# 分析网络环境
echo "分析网络环境..."

# 测试NAT超时
echo "测试NAT超时(需要客户端配合)..."
echo "建议根据网络环境设置保活间隔:"
echo ""
echo "环境类型              建议间隔"
echo "-----------------------------------"
echo "企业网络(稳定)      60秒"
echo "家庭网络(一般)      25秒"
echo "移动网络(不稳定)    15秒"
echo "严格NAT环境           10秒"
echo ""

read -p "选择环境类型 (1=企业/2=家庭/3=移动/4=严格NAT): " env_type

case $env_type in
    1)
        KEEPALIVE=60
        ;;
    2)
        KEEPALIVE=25
        ;;
    3)
        KEEPALIVE=15
        ;;
    4)
        KEEPALIVE=10
        ;;
    *)
        KEEPALIVE=25
        ;;
esac

echo "将设置保活间隔为: ${KEEPALIVE}秒"

# 更新所有peer的保活设置
echo ""
echo "更新配置文件..."

# 删除现有PersistentKeepalive设置
sudo sed -i '/PersistentKeepalive/d' $CONFIG_FILE

# 为每个Peer添加保活
sudo awk -v ka=$KEEPALIVE '
    /^\[Peer\]/ {
        print
        peer_found = 1
        next
    }
    peer_found && /^[A-Za-z]/ {
        print "PersistentKeepalive = " ka
        peer_found = 0
    }
    {print}
' $CONFIG_FILE > /tmp/wg0.conf.tmp

sudo mv /tmp/wg0.conf.tmp $CONFIG_FILE

# 重新加载配置
echo ""
echo "重新加载配置..."
sudo wg syncconf wg0 <(wg-quick strip wg0)

echo "✓ 保活配置已优化"

# 验证
echo ""
echo "验证保活设置:"
sudo wg show wg0 persistent-keepalive

38.2.2 多线程优化

WireGuard多线程配置:

#!/bin/bash
# configure-wireguard-threading.sh

echo "=== WireGuard多线程优化 ==="

# WireGuard使用内核线程,可以调整相关参数

# 1. 增加网络处理线程数
SYSCTL_CONF="/etc/sysctl.d/99-wireguard-threads.conf"

cat << 'EOF' | sudo tee $SYSCTL_CONF
# WireGuard多线程优化

# RPS(接收包控制)线程数
net.core.rps_sock_flow_entries = 32768

# 网络设备处理预算
net.core.netdev_budget = 600
net.core.netdev_budget_usecs = 8000

# 软中断处理
net.core.dev_weight = 64
EOF

sudo sysctl -p $SYSCTL_CONF

# 2. 配置接收流控制
WG_INTERFACE="wg0"

if [ -d "/sys/class/net/$WG_INTERFACE" ]; then
    # 设置RPS
    CPU_CORES=$(nproc)
    rps_cpus=$(printf '%x' $((2**CPU_CORES - 1)))
    
    for queue in /sys/class/net/$WG_INTERFACE/queues/rx-*/rps_cpus; do
        echo $rps_cpus | sudo tee $queue > /dev/null
    done
    
    for queue in /sys/class/net/$WG_INTERFACE/queues/rx-*/rps_flow_cnt; do
        echo 32768 | sudo tee $queue > /dev/null
    done
    
    echo "✓ RPS已配置到所有CPU核心"
fi

echo ""
echo "=== 多线程优化完成 ==="

38.3 加密性能优化

38.3.1 硬件加速

检测和启用加密硬件加速:

#!/bin/bash
# enable-crypto-acceleration.sh

echo "=== 检测加密硬件加速 ==="

# 1. 检测CPU加密指令集
echo "检测CPU特性..."

if grep -q aes /proc/cpuinfo; then
    echo "✓ 支持AES-NI"
    AES_NI=true
else
    echo "✗ 不支持AES-NI"
    AES_NI=false
fi

if grep -q avx /proc/cpuinfo; then
    echo "✓ 支持AVX"
fi

if grep -q avx2 /proc/cpuinfo; then
    echo "✓ 支持AVX2"
fi

# 2. 检查加密模块
echo ""
echo "检查加密模块..."

CRYPTO_MODULES="aesni_intel cryptd"

for module in $CRYPTO_MODULES; do
    if lsmod | grep -q $module; then
        echo "✓ $module 已加载"
    else
        echo "  加载 $module..."
        sudo modprobe $module
        
        if [ $? -eq 0 ]; then
            echo "  ✓ $module 已加载"
            
            # 持久化
            if ! grep -q $module /etc/modules; then
                echo $module | sudo tee -a /etc/modules
            fi
        fi
    fi
done

# 3. 验证ChaCha20加速
echo ""
echo "验证ChaCha20性能..."

if [ -f /proc/crypto ]; then
    chacha_driver=$(grep -A 10 "name.*chacha20" /proc/crypto | grep "driver" | head -1)
    echo "ChaCha20驱动: $chacha_driver"
fi

# 4. 性能测试
echo ""
echo "加密性能测试..."

# 测试不同大小数据的加密性能
for size in 1024 4096 16384 65536; do
    speed=$(openssl speed -evp chacha20-poly1305 -bytes $size 2>&1 | \
            grep "^$size" | awk '{print $2}')
    
    echo "  ${size}字节: ${speed} KB/s"
done

echo ""
echo "=== 加密加速配置完成 ==="

38.3.2 加密算法优化

优化ChaCha20-Poly1305性能:

#!/bin/bash
# optimize-chacha20.sh

echo "=== ChaCha20-Poly1305优化 ==="

# 1. 检查当前配置
echo "当前加密配置:"
if [ -f /proc/crypto ]; then
    grep -A 15 "name.*chacha20" /proc/crypto | head -16
fi

# 2. 确保使用最优实现
echo ""
echo "检查可用的ChaCha20实现..."

available_impls=$(grep "name.*chacha20" /proc/crypto | awk '{print $3}')
echo "可用实现:"
echo "$available_impls"

# 3. 内核参数优化
SYSCTL_CONF="/etc/sysctl.d/99-crypto-optimize.conf"

cat << 'EOF' | sudo tee $SYSCTL_CONF
# 加密性能优化

# 禁用加密API节流(提高性能)
crypto.fips_enabled = 0
EOF

sudo sysctl -p $SYSCTL_CONF

# 4. 性能基准测试
echo ""
echo "ChaCha20-Poly1305性能基准:"

# 小数据包
echo "  小数据包 (1KB):"
openssl speed -evp chacha20-poly1305 -bytes 1024 2>&1 | \
    grep "^1024" | awk '{printf "    %s KB/s\n", $2}'

# 中等数据包
echo "  中等数据包 (16KB):"
openssl speed -evp chacha20-poly1305 -bytes 16384 2>&1 | \
    grep "^16384" | awk '{printf "    %s KB/s\n", $2}'

# 大数据包
echo "  大数据包 (64KB):"
openssl speed -evp chacha20-poly1305 -bytes 65536 2>&1 | \
    grep "^65536" | awk '{printf "    %s KB/s\n", $2}'

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

XBR

© 2026 XBR

bilibili bluesky discord