Linux 内核参数调优实战:TCP 连接数、文件句柄、Swap 配置,榨干 VPS 每一滴性能


买了 2 核 4G 的 VPS,实际用起来感觉跟 1 核 2G 没区别?问题很可能出在默认内核参数上。Linux 出厂配置偏向通用场景,对于 Web 服务器、数据库服务器、代理服务器等不同用途,需要针对性调整。今天分享一套经过生产环境验证的内核调优方案,让你的 VPS 性能真正跑满。


一、查看当前系统瓶颈

  1. 连接数限制
# 查看当前连接数
ss -s

# 查看每个进程的限制
ulimit -n

# 查看系统全局限制
cat /proc/sys/fs/file-nr
cat /proc/sys/fs/file-max
  1. TCP 连接状态
# 查看各状态连接数
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

# 典型输出:
ESTABLISHED 150
TIME_WAIT 3200
CLOSE_WAIT 12

TIME_WAIT 过多是 Web 服务器的常见问题,会耗尽可用端口。

  1. 内存和 Swap 使用
free -h
cat /proc/sys/vm/swappiness

二、文件句柄调优

问题:高并发时提示 "Too many open files"

  1. 修改系统级限制

编辑 /etc/sysctl.conf

# 系统总文件句柄数
fs.file-max = 2097152

# 已分配但未使用的文件句柄
fs.nr_open = 2097152
  1. 修改用户级限制

编辑 /etc/security/limits.conf

*    soft    nofile    1048576
*    hard    nofile    1048576
root soft    nofile    1048576
root hard    nofile    1048576

*    soft    nproc     65536
*    hard    nproc     65536
  1. 修改 systemd 服务限制

如果使用 systemd 管理 Nginx/MySQL 等服务:

编辑 /etc/systemd/system.conf/etc/systemd/user.conf

DefaultLimitNOFILE=1048576
DefaultLimitNPROC=65536

然后:

systemctl daemon-reexec

三、TCP 网络栈调优

  1. 核心参数(/etc/sysctl.conf)
# ===== 连接跟踪 =====
# 增大连接跟踪表,防止 conntrack 满导致丢包
net.netfilter.nf_conntrack_max = 1000000
net.netfilter.nf_conntrack_tcp_timeout_established = 600
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 30

# ===== TCP 性能 =====
# 开启 SYN Cookie,防止 SYN Flood 攻击
net.ipv4.tcp_syncookies = 1

# 开启 TCP 时间戳,更精确计算 RTT
net.ipv4.tcp_timestamps = 1

# 开启 TCP SACK,快速重传丢失包
net.ipv4.tcp_sack = 1
net.ipv4.tcp_fack = 1

# 增大 TCP 缓冲区
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216

# 自动调整 TCP 缓冲区
net.ipv4.tcp_moderate_rcvbuf = 1
net.ipv4.tcp_no_metrics_save = 1

# 增大本地端口范围
net.ipv4.ip_local_port_range = 1024 65535

# 快速回收 TIME_WAIT 连接(内核 4.12+ 已废弃,仅老系统使用)
# net.ipv4.tcp_tw_recycle = 0  # 不要开启,会导致 NAT 问题
net.ipv4.tcp_tw_reuse = 1     # 允许复用 TIME_WAIT 连接

# 缩短 FIN_WAIT2 超时
net.ipv4.tcp_fin_timeout = 15

# 缩短 keepalive 探测间隔
net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_intvl = 15

# ===== 连接队列 =====
# 增大 SYN 半连接队列
net.ipv4.tcp_max_syn_backlog = 65536

# 增大全连接队列(配合 Nginx 的 backlog)
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 65536

# ===== 路由与转发 =====
# 关闭反向路径过滤(多网卡场景需要)
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.default.rp_filter = 0

# 开启 IP 转发(代理/VPN 需要)
net.ipv4.ip_forward = 1
  1. 应用配置
sysctl -p

四、内存与 Swap 调优

  1. Swappiness 控制
# 查看当前值
cat /proc/sys/vm/swappiness    # 默认 60,越高越积极使用 Swap

# Web 服务器建议降低,避免频繁换页
vm.swappiness = 10

# 数据库服务器建议设为 1,几乎不用 Swap
vm.swappiness = 1
  1. VFS 缓存压力
# 控制内核回收内存用于缓存的积极程度
vm.vfs_cache_pressure = 50    # 默认 100,降低后更保留缓存
  1. Dirty 页刷新策略
# 脏页占系统内存比例才开始后台刷盘
vm.dirty_background_ratio = 5

# 脏页占系统内存比例才开始强制刷盘
vm.dirty_ratio = 10

# 脏页在内存中停留的最长时间
vm.dirty_expire_centisecs = 500

# 内核刷脏页线程的运行间隔
vm.dirty_writeback_centisecs = 100
  1. 禁用透明大页(数据库场景)

透明大页(THP)在某些数据库场景下会导致性能抖动:

echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag

永久生效:

# 编辑 /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="transparent_hugepage=never"

update-grub

五、磁盘 I/O 调优

  1. I/O 调度器选择
# 查看当前调度器
cat /sys/block/sda/queue/scheduler

# SSD 推荐 noop 或 none
echo noop > /sys/block/sda/queue/scheduler

# 机械硬盘推荐 deadline
echo deadline > /sys/block/sda/queue/scheduler
  1. 增大 I/O 队列深度
echo 1024 > /sys/block/sda/queue/nr_requests
  1. 文件系统挂载优化

编辑 /etc/fstab,给 SSD 添加优化参数:

UUID=xxx / ext4 defaults,noatime,nodiratime,discard 0 1
  • noatime:不更新访问时间,减少写操作
  • discard:开启 TRIM,延长 SSD 寿命

六、Nginx 配合内核调优

调完内核,Nginx 配置也要跟上:

worker_processes auto;
worker_rlimit_nofile 1048576;

events {
    worker_connections 65535;
    use epoll;
    multi_accept on;
}

http {
    # 开启 sendfile,减少用户态/内核态切换
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;

    # 增大 keepalive 连接数
    keepalive_timeout 65;
    keepalive_requests 10000;

    # 开启 gzip
    gzip on;
    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 6;
    gzip_types text/plain text/css text/xml application/json application/javascript;
}

七、一键调优脚本

保存为 tune.sh,新服务器部署时直接运行:

#!/bin/bash

echo "===== Linux 内核调优脚本 ====="

# 备份原配置
cp /etc/sysctl.conf /etc/sysctl.conf.bak.$(date +%Y%m%d)

# 写入优化参数
cat >> /etc/sysctl.conf << 'EOF'

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

# ===== TCP 优化 =====
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_sack = 1
net.ipv4.tcp_fack = 1
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.ipv4.tcp_moderate_rcvbuf = 1
net.ipv4.tcp_no_metrics_save = 1
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_tw.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_intvl = 15
net.ipv4.tcp_max_syn_backlog = 65536
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 65536

# ===== 连接跟踪 =====
net.netfilter.nf_conntrack_max = 1000000

# ===== 内存优化 =====
vm.swappiness = 10
vm.vfs_cache_pressure = 50
vm.dirty_background_ratio = 5
vm.dirty_ratio = 10

# ===== 路由 =====
net.ipv4.ip_forward = 1
EOF

# 应用配置
sysctl -p

# 修改 limits
cat >> /etc/security/limits.conf << 'EOF'
*    soft    nofile    1048576
*    hard    nofile    1048576
root soft    nofile    1048576
root hard    nofile    1048576
EOF

echo "===== 调优完成,建议重启服务器 ====="

八、调优前后对比

指标 调优前(默认) 调优后 提升
最大并发连接 1000 10000+ 10x
TIME_WAIT 堆积 3000+ <500 6x
Nginx 响应延迟 15ms 3ms 5x
文件句柄耗尽 频繁 从未 ∞
Swap 使用 频繁换页 极少 显著


九、注意事项

  1. 生产环境先测试:在测试服务器验证后再上生产
  2. 逐步调整:不要一次性改太多参数,方便回滚定位
  3. 监控验证:调优后用 sariostatss 持续观察
  4. 云厂商限制:部分 VPS 有隐藏限制,调参后仍不达预期联系客服

总结

Linux 内核调优是性价比最高的性能提升手段——不花一分钱,只改几个参数,就能让同样配置的 VPS 发挥出完全不同的性能。建议每台新服务器部署时都跑一遍上面的脚本,养成习惯。配合之前的 MySQL 优化、Nginx 配置,形成完整的服务器性能优化闭环。


Git + Webhook 实现网站自动部署: push 代码即上线,告别 FTP 手动上传

MySQL 性能优化实战:从 3 秒查询到 30 毫秒,WordPress 数据库提速 10 倍

评 论
更换验证码