买了 2 核 4G 的 VPS,实际用起来感觉跟 1 核 2G 没区别?问题很可能出在默认内核参数上。Linux 出厂配置偏向通用场景,对于 Web 服务器、数据库服务器、代理服务器等不同用途,需要针对性调整。今天分享一套经过生产环境验证的内核调优方案,让你的 VPS 性能真正跑满。
一、查看当前系统瓶颈
- 连接数限制
# 查看当前连接数
ss -s
# 查看每个进程的限制
ulimit -n
# 查看系统全局限制
cat /proc/sys/fs/file-nr
cat /proc/sys/fs/file-max
- 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 服务器的常见问题,会耗尽可用端口。
- 内存和 Swap 使用
free -h
cat /proc/sys/vm/swappiness
二、文件句柄调优
问题:高并发时提示 "Too many open files"
- 修改系统级限制
编辑 /etc/sysctl.conf:
# 系统总文件句柄数
fs.file-max = 2097152
# 已分配但未使用的文件句柄
fs.nr_open = 2097152
- 修改用户级限制
编辑 /etc/security/limits.conf:
* soft nofile 1048576
* hard nofile 1048576
root soft nofile 1048576
root hard nofile 1048576
* soft nproc 65536
* hard nproc 65536
- 修改 systemd 服务限制
如果使用 systemd 管理 Nginx/MySQL 等服务:
编辑 /etc/systemd/system.conf 和 /etc/systemd/user.conf:
DefaultLimitNOFILE=1048576
DefaultLimitNPROC=65536
然后:
systemctl daemon-reexec
三、TCP 网络栈调优
- 核心参数(/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
- 应用配置
sysctl -p
四、内存与 Swap 调优
- Swappiness 控制
# 查看当前值
cat /proc/sys/vm/swappiness # 默认 60,越高越积极使用 Swap
# Web 服务器建议降低,避免频繁换页
vm.swappiness = 10
# 数据库服务器建议设为 1,几乎不用 Swap
vm.swappiness = 1
- VFS 缓存压力
# 控制内核回收内存用于缓存的积极程度
vm.vfs_cache_pressure = 50 # 默认 100,降低后更保留缓存
- Dirty 页刷新策略
# 脏页占系统内存比例才开始后台刷盘
vm.dirty_background_ratio = 5
# 脏页占系统内存比例才开始强制刷盘
vm.dirty_ratio = 10
# 脏页在内存中停留的最长时间
vm.dirty_expire_centisecs = 500
# 内核刷脏页线程的运行间隔
vm.dirty_writeback_centisecs = 100
- 禁用透明大页(数据库场景)
透明大页(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 调优
- 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
- 增大 I/O 队列深度
echo 1024 > /sys/block/sda/queue/nr_requests
- 文件系统挂载优化
编辑 /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 使用 频繁换页 极少 显著
九、注意事项
- 生产环境先测试:在测试服务器验证后再上生产
- 逐步调整:不要一次性改太多参数,方便回滚定位
- 监控验证:调优后用
sar、iostat、ss持续观察 - 云厂商限制:部分 VPS 有隐藏限制,调参后仍不达预期联系客服
总结
Linux 内核调优是性价比最高的性能提升手段——不花一分钱,只改几个参数,就能让同样配置的 VPS 发挥出完全不同的性能。建议每台新服务器部署时都跑一遍上面的脚本,养成习惯。配合之前的 MySQL 优化、Nginx 配置,形成完整的服务器性能优化闭环。
