引言
默认内核参数是为通用场景设计的,不是为你那台跑在高负载下的 VPS 定制的。
你的 VPS 跑着 Nginx、MySQL、Redis,或者在做反向代理、CDN 节点、API 网关——默认的内核网络栈参数在这些场景下往往显得过于保守。调整 sysctl 参数,无需更换硬件,就能让 VPS 的网络吞吐量提升 30%~200%,连接数限制从数千飙升至数万。
本文提供一套经过生产验证的 sysctl 优化方案,涵盖 TCP 网络栈、内存管理、文件描述符、连接追踪等核心领域,并附一键应用脚本。所有参数适用于 Ubuntu 24.04 / Debian 12 / AlmaLinux 9。
一、为什么需要内核调优?
1.1 默认参数的保守设计
Linux 内核的默认 sysctl 参数由 kernel.org 维护,针对的是通用桌面和服务器场景,考虑的是兼容性和稳定性,而非性能极限。关键限制包括:
| 参数 | 默认值 | 问题 |
|---|---|---|
net.core.somaxconn | 4096 | 高并发连接队列不足 |
net.ipv4.tcp_max_syn_backlog | 128~1024 | SYN 队列太小,丢包率高 |
net.ipv4.ip_local_port_range | 32768~60999 | 可用端口不足 |
net.core.netdev_max_backlog | 1000 | 网卡数据包处理跟不上 |
fs.file-max | 约 65536~1048576 | 文件描述符限制 |
1.2 常见性能瓶颈场景
- 高并发 Web 服务:Nginx 反向代理处理数万并发时,TCP 连接队列溢出
- API 网关:大量短连接导致 TIME_WAIT 积压,端口耗尽
- 数据库代理:连接池耗尽,新连接被拒绝
- CDN/代理节点:网络吞吐受限,CPU idle 但流量上不去
二、核心网络参数调优
2.1 TCP 连接处理优化
# 最大监听队列长度(Nginx/Apache 需要)
net.core.somaxconn = 65535
# TCP SYN 队列最大长度
net.ipv4.tcp_max_syn_backlog = 65536
# 加快 SYN-ACK 超时时间,释放半开连接
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 5
# 允许 TIME_WAIT sockets 快速回收
net.ipv4.tcp_tw_reuse = 1
# 禁用严格源路由(安全加固)
net.ipv4.ip_strict_host_multicast = 0
net.ipv4.conf.all.secure_redirects = 0
参数说明:
somaxconn:控制listen()系统调用的 backlog 参数最大值,默认 4096 对高并发服务严重不足tcp_max_syn_backlog:SYN 队列长度,攻击或高负载时极易被打满tcp_tw_reuse:允许在 TIME_WAIT 状态下复用连接,对短连接服务(如 API 网关)效果显著
2.2 端口范围优化
# 扩展临时端口范围(默认 32768-60999,共 28232 个)
net.ipv4.ip_local_port_range = 1024 65535
# 允许绑定到非本地地址(需要谨慎使用)
net.ipv4.ip_nonlocal_bind = 1
为什么需要扩展端口范围?
当你的 VPS 作为反向代理时,每个客户端连接会建立多个后端连接,后端连接使用临时端口。如果临时端口不足,新连接会被拒绝,表现为 Cannot assign requested address 错误。
扩展端口范围后,可用端口从 28K 增加到 64K,对于单机数万并发场景绰绰有余。
2.3 数据包处理优化
# 网卡接收队列长度
net.core.netdev_max_backlog = 65536
# TCP 接收窗口缩放(提升大带宽延迟积产品性能)
net.ipv4.tcp_window_scaling = 1
# TCP 接收缓冲区最大值
net.ipv4.tcp_rmem = 4096 87380 16777216
# TCP 发送缓冲区最大值
net.ipv4.tcp_wmem = 4096 65536 16777216
# 接收缓冲区自动调优
net.core.rmem_auto_max = 16777216
net.core.wmem_auto_max = 16777216
关键参数解读:
netdev_max_backlog:网卡驱动入队但未被内核处理的最大数据包数,默认 1000 太低tcp_window_scaling:启用 TCP 窗口缩放选项,支持 > 64KB 的传输窗口tcp_rmem/tcp_wmem:接收/发送缓冲区的最小、默认、最大值,自动调优可大幅提升吞吐
2.4 连接追踪优化(NAT/防火墙场景)
# 连接追踪表最大条目数
net.netfilter.nf_conntrack_max = 1048576
# 连接追踪哈希表大小(必须是 2 的幂)
net.netfilter.nf_conntrack_buckets = 65536
# 禁用 ICMP 重定向(安全加固)
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
# 禁用源路由
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
连接追踪问题:
运行 iptables 或 nftables 的 VPS,每个连接都需要在 conntrack 表中记录一条。默认 nf_conntrack_max 通常为 65536 或更低,高并发场景下容易耗尽,导致新连接被丢弃。
三、内存与文件描述符调优
3.1 内存管理优化
# 虚拟内存刷新频率(秒)
vm.vfs_cache_pressure = 50
# 允许过 commits 次数
vm.overcommit_memory = 1
vm.overcommit_ratio = 90
# 减少换出(降低磁盘 I/O)
vm.swappiness = 10
vm.dirty_ratio = 10
vm.dirty_background_ratio = 5
参数说明:
vfs_cache_pressure:控制内核回收 inode/dentry 缓存的倾向,默认 100 太高,调低可减少文件系统元数据操作overcommit_memory=1:允许过度提交内存,对数据库和 Java 应用尤为重要swappiness=10:减少 swapping 倾向,保持更多数据在内存中
3.2 文件描述符限制
# 系统级文件描述符最大值
fs.file-max = 2097152
# 单用户文件描述符限制(在 /etc/security/limits.conf 中设置)
# * soft nofile 65535
# * hard nofile 65535
# root soft nofile 65535
# root hard nofile 65535
四、安全加固参数
内核调优的同时,应当同步加固:
# 禁用 ICMP 重定向接收
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
# 禁用 ICMP 重定向发送
net.ipv4.conf.all.send_redirects = 0
# 禁用源路由
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
# 启用 SYN Cookies(防御 SYN Flood 攻击)
net.ipv4.tcp_syncookies = 1
# 日志记录可疑包
net.ipv4.conf.all.log_martians = 1
net.ipv4.conf.default.log_martians = 1
# 禁用 IPv6(如果不需要)
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
五、一键应用脚本
5.1 优化脚本
#!/bin/bash
# vps-kernel-tuning.sh - VPS 内核参数优化脚本
# 适用于 Ubuntu 24.04 / Debian 12 / AlmaLinux 9
set -euo pipefail
echo "=== VPS 内核参数优化 ==="
echo "当前内核版本: $(uname -r)"
echo "开始时间: $(date)"
# 备份当前配置
BACKUP_FILE="/etc/sysctl.d/99-vps-tuning-backup-$(date +%Y%m%d-%H%M%S).conf"
if [ -f /etc/sysctl.d/99-vps-tuning.conf ]; then
cp /etc/sysctl.d/99-vps-tuning.conf "$BACKUP_FILE"
echo "已备份当前配置到: $BACKUP_FILE"
fi
# 写入优化参数
cat > /etc/sysctl.d/99-vps-tuning.conf << 'EOF'
# ===========================================
# VPS 内核网络性能优化参数
# 适用: Ubuntu 24.04 / Debian 12 / AlmaLinux 9
# ===========================================
# --- TCP 连接优化 ---
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65536
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 5
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 15
# --- 端口范围优化 ---
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.ip_nonlocal_bind = 1
# --- 数据包处理优化 ---
net.core.netdev_max_backlog = 65536
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.core.rmem_auto_max = 16777216
net.core.wmem_auto_max = 16777216
net.core.rmem_default = 262144
net.core.wmem_default = 262144
# --- 连接追踪优化 ---
net.netfilter.nf_conntrack_max = 1048576
net.netfilter.nf_conntrack_buckets = 65536
# --- 内存管理优化 ---
vm.vfs_cache_pressure = 50
vm.overcommit_memory = 1
vm.overcommit_ratio = 90
vm.swappiness = 10
vm.dirty_ratio = 10
vm.dirty_background_ratio = 5
# --- 安全加固 ---
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.tcp_syncookies = 1
net.ipv4.conf.all.log_martians = 1
net.ipv4.conf.default.log_martians = 1
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1
# --- 禁用 IPv6(如不需要)---
# net.ipv6.conf.all.disable_ipv6 = 1
# net.ipv6.conf.default.disable_ipv6 = 1
EOF
echo "参数已写入 /etc/sysctl.d/99-vps-tuning.conf"
# 应用配置
sysctl -p /etc/sysctl.d/99-vps-tuning.conf
echo "内核参数已应用"
# 设置文件描述符限制
cat > /etc/security/limits.d/99-vps-tuning.conf << 'EOF'
* soft nofile 65535
* hard nofile 65535
root soft nofile 65535
root hard nofile 65535
EOF
echo "文件描述符限制已设置"
# 验证关键参数
echo ""
echo "=== 关键参数验证 ==="
echo "somaxconn: $(sysctl -n net.core.somaxconn)"
echo "tcp_max_syn_backlog: $(sysctl -n net.ipv4.tcp_max_syn_backlog)"
echo "ip_local_port_range: $(sysctl -n net.ipv4.ip_local_port_range)"
echo "nf_conntrack_max: $(sysctl -n net.netfilter.nf_conntrack_max)"
echo "tcp_tw_reuse: $(sysctl -n net.ipv4.tcp_tw_reuse)"
echo "swappiness: $(sysctl -n vm.swappiness)"
echo ""
echo "完成时间: $(date)"
echo "优化完成!请重启服务或重新加载配置使部分参数生效。"
5.2 应用方式
# 下载并执行
wget -O /tmp/vps-kernel-tuning.sh https://raw.githubusercontent.com/.../vps-kernel-tuning.sh
chmod +x /tmp/vps-kernel-tuning.sh
sudo /tmp/vps-kernel-tuning.sh
# 或直接使用 echo 方式逐条应用
sudo sysctl -w net.core.somaxconn=65535
sudo sysctl -w net.ipv4.tcp_max_syn_backlog=65536
sudo sysctl -w net.ipv4.tcp_tw_reuse=1
5.3 验证优化效果
# 查看当前所有网络相关参数
sysctl -a | grep -E 'net\.(ipv4|core)' | sort
# 检查连接追踪表使用率
cat /proc/sys/net/netfilter/nf_conntrack_count
cat /proc/sys/net/netfilter/nf_conntrack_max
# 查看 TIME_WAIT 连接数
netstat -an | grep TIME_WAIT | wc -l
# 查看当前监听 backlog
ss -ltn | head -10
六、典型场景调优建议
6.1 Nginx 反向代理场景
# 重点参数
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65536
net.ipv4.tcp_tw_reuse = 1
net.ipv4.ip_local_port_range = 1024 65535
# Nginx 配置配合
# worker_connections 10240;
# keepalive_timeout 65;
# keepalive_requests 10000;
6.2 API 网关 / 高并发短连接场景
# 重点参数
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 15
net.ipv4.ip_local_port_range = 1024 65535
net.core.netdev_max_backlog = 65536
6.3 数据库代理 / 连接池场景
# 重点参数
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65536
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
vm.overcommit_memory = 1
6.4 CDN / 大吞吐场景
# 重点参数
net.core.rmem_default = 16777216
net.core.wmem_default = 16777216
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.ipv4.tcp_congestion_control = bbr
BBR 拥塞控制: Google 开发的拥塞控制算法,在高带宽延迟积(BDP)场景下表现优异,建议所有高吞吐 VPS 启用。
# 启用 BBR
echo "net.ipv4.tcp_congestion_control = bbr" | sudo tee -a /etc/sysctl.d/99-vps-tuning.conf
sudo sysctl -p /etc/sysctl.d/99-vps-tuning.conf
# 验证
sysctl net.ipv4.tcp_congestion_control
# 输出: net.ipv4.tcp_congestion_control = bbr
七、注意事项与回滚
7.1 注意事项
- 备份原配置:修改前先备份
/etc/sysctl.conf和/etc/sysctl.d/下的文件 - 渐进式调整:不要一次性修改所有参数,逐步调整并观察效果
- 内核版本兼容性:部分参数在较老内核(< 4.x)可能不支持
- 云厂商限制:部分云厂商(如 AWS、阿里云)可能在宿主机层面限制了某些参数
- 安全优先:不要在生产环境盲目启用所有参数,优先启用安全加固参数
7.2 回滚方法
# 恢复默认值
sudo sysctl -r /etc/sysctl.d/99-vps-tuning.conf
# 或手动清除
sudo rm /etc/sysctl.d/99-vps-tuning.conf
sudo sysctl -p # 恢复 /etc/sysctl.conf 默认值
# 恢复文件描述符限制
sudo rm /etc/security/limits.d/99-vps-tuning.conf
7.3 性能基准测试
# 使用 iperf3 测试网络吞吐
# 服务端
iperf3 -s -p 5001
# 客户端
iperf3 -c <VPS_IP> -p 5001 -t 10 -P 4
# 使用 ab 或 wrk 测试 HTTP 性能
wrk -t4 -c100 -d10s http://<VPS_IP>/
八、总结
通过合理调整 sysctl 内核参数,可以显著提升 VPS 的网络性能:
| 优化方向 | 预期提升 |
|---|---|
| TCP 连接队列 | 减少连接拒绝,提升并发能力 |
| 端口范围扩展 | 避免端口耗尽,支持更多连接 |
| 缓冲区调优 | 提升大文件传输和大数据包吞吐 |
| BBR 拥塞控制 | 提升高延迟链路吞吐 20%~50% |
| 连接追踪优化 | 支持更高并发连接数 |
| 内存管理 | 减少 swap,提升整体响应速度 |
核心原则:先备份、后调整、逐步验证、随时可回滚。
