sysctl 是 Linux 内核参数调优的核心工具,通过修改 /proc/sys/ 下的参数,可在不重新编译内核的情况下调整网络栈、文件句柄、内存分配等关键行为。对于搬瓦工 VPS 上运行 Web 服务、数据库或高并发应用的用户,合理的 sysctl 调优能显著提升并发能力、降低连接超时。本文给出实用的参数清单与持久化方法,并提醒需要谨慎对待的参数。
本文要点
- 了解常用网络、文件句柄与内存相关的 sysctl 参数含义
- 用
/etc/sysctl.conf或/etc/sysctl.d/持久化配置 - 每次修改只改一两个参数,测试后再继续
- 避免盲目照搬"万能调优脚本"
sysctl 基本用法
# 查看某个参数当前值
sysctl net.ipv4.tcp_fin_timeout
# 临时设置(重启后失效)
sysctl -w net.ipv4.tcp_fin_timeout=30
# 应用配置文件(永久生效)
sysctl -p /etc/sysctl.conf
# 查看所有参数
sysctl -a | less网络相关参数
以下参数对运行 Web 服务的 VPS 效果明显:
| 参数 | 推荐值 | 说明 |
|---|---|---|
| net.ipv4.tcp_fin_timeout | 30 | 缩短 TIME_WAIT 回收时间(默认 60s) |
| net.ipv4.tcp_tw_reuse | 1 | 允许重用 TIME_WAIT 连接(仅出站) |
| net.ipv4.tcp_max_syn_backlog | 8192 | SYN 队列长度,高并发时防丢包 |
| net.core.somaxconn | 65535 | listen() 最大连接队列 |
| net.core.netdev_max_backlog | 5000 | 网卡接收队列长度 |
| net.ipv4.ip_local_port_range | 1024 65535 | 可用本地端口范围 |
# 推荐追加到 /etc/sysctl.conf 的网络参数
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_max_syn_backlog = 8192
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 5000
net.ipv4.ip_local_port_range = 1024 65535文件句柄参数
Linux 默认每进程最多打开 1024 个文件描述符,高并发时很快耗尽。Nginx、MySQL 等应用都需要调大:
# 系统级最大文件句柄数
fs.file-max = 1000000
# 应用后,还需在 /etc/security/limits.conf 设置进程级限制
# 或在 systemd 服务单元中设置 LimitNOFILE=65535limits.conf 配合设置
# /etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535
root soft nofile 65535
root hard nofile 65535内存相关参数
| 参数 | 推荐值 | 说明 |
|---|---|---|
| vm.swappiness | 10 | 服务器减少换出(默认 60) |
| vm.dirty_ratio | 20 | 脏数据占内存比例上限 |
| vm.dirty_background_ratio | 5 | 后台刷盘触发阈值 |
持久化配置的最佳实践
推荐把自定义参数放在独立文件而非直接修改 /etc/sysctl.conf,便于管理和版本追踪:
# 创建专属配置文件
nano /etc/sysctl.d/99-custom.conf
# 填入所需参数后保存,应用:
sysctl --system
# 或
sysctl -p /etc/sysctl.d/99-custom.conf谨慎调整的参数
以下参数容易误用,建议只在理解清楚后再动:
net.ipv4.tcp_tw_recycle:Linux 4.12 起已移除,强行设置会报错net.ipv4.tcp_syncookies:防 SYN Flood,不建议关闭net.ipv4.ip_forward:除非你明确需要路由转发,否则保持默认
每次只改一两个参数
sysctl 调优不是"背模板",不同应用场景需求不同。建议每次只修改一两个参数,用实际负载测试效果,确认有改善再继续,避免盲目套用网上的"万能调优"脚本造成负面影响。
验证参数生效
# 检查指定参数是否为期望值
sysctl net.core.somaxconn
sysctl net.ipv4.tcp_fin_timeout
# 查看当前文件句柄使用情况
cat /proc/sys/fs/file-nr
# 输出三列:已用 / 空闲 / 最大值小结
- sysctl 允许在线调整内核参数,无需重启
- 网络参数关注 backlog、TIME_WAIT、端口范围;文件句柄需要 sysctl + limits.conf 双管齐下
- 写入
/etc/sysctl.d/99-custom.conf比直接修改sysctl.conf更规范 - 逐步测试,不要照搬"万能脚本"
常见问题
sysctl -p 没有报错,但参数没有变化?
部分参数在容器(OpenVZ)环境中受宿主限制无法修改,会被静默忽略。可用 sysctl 参数名 查询实际值,与期望值对比确认是否生效。
修改了 limits.conf 但进程的 nofile 还是 1024?
PAM 的 limits 只对新建会话生效,需要重新登录 SSH。对于 systemd 管理的服务,还需在服务单元文件中设置 LimitNOFILE。
重启后参数恢复默认值,怎么回事?
临时用 sysctl -w 设置的参数不会持久。需写入 /etc/sysctl.conf 或 /etc/sysctl.d/ 目录下的文件才能重启后保留。
怎么确认某个参数是否在容器里可修改?
直接用 sysctl -w 参数=值 测试,若提示 "Read-only file system" 或 "Permission denied" 则说明受宿主限制,无法修改。