Featured image of post VPS 内核参数调优:sysctl TCP 网络优化实战指南

VPS 内核参数调优:sysctl TCP 网络优化实战指南

通过调整 Linux 内核参数(sysctl)提升 VPS 网络吞吐、降低延迟、改善高并发场景性能。涵盖 TCP 优化、内存管理、文件描述符等核心参数详解与一键脚本。

引言

默认内核参数是为通用场景设计的,不是为你那台跑在高负载下的 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.somaxconn4096高并发连接队列不足
net.ipv4.tcp_max_syn_backlog128~1024SYN 队列太小,丢包率高
net.ipv4.ip_local_port_range32768~60999可用端口不足
net.core.netdev_max_backlog1000网卡数据包处理跟不上
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

连接追踪问题:

运行 iptablesnftables 的 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 注意事项

  1. 备份原配置:修改前先备份 /etc/sysctl.conf/etc/sysctl.d/ 下的文件
  2. 渐进式调整:不要一次性修改所有参数,逐步调整并观察效果
  3. 内核版本兼容性:部分参数在较老内核(< 4.x)可能不支持
  4. 云厂商限制:部分云厂商(如 AWS、阿里云)可能在宿主机层面限制了某些参数
  5. 安全优先:不要在生产环境盲目启用所有参数,优先启用安全加固参数

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,提升整体响应速度

核心原则:先备份、后调整、逐步验证、随时可回滚。


参考资源

📺 看视频版教程 → DuckDB Lab YouTube

Subscribe for more DuckDB & AI automation tutorials