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_timeout30缩短 TIME_WAIT 回收时间(默认 60s)
net.ipv4.tcp_tw_reuse1允许重用 TIME_WAIT 连接(仅出站)
net.ipv4.tcp_max_syn_backlog8192SYN 队列长度,高并发时防丢包
net.core.somaxconn65535listen() 最大连接队列
net.core.netdev_max_backlog5000网卡接收队列长度
net.ipv4.ip_local_port_range1024 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=65535

limits.conf 配合设置

# /etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535
root soft nofile 65535
root hard nofile 65535

内存相关参数

参数推荐值说明
vm.swappiness10服务器减少换出(默认 60)
vm.dirty_ratio20脏数据占内存比例上限
vm.dirty_background_ratio5后台刷盘触发阈值

持久化配置的最佳实践

推荐把自定义参数放在独立文件而非直接修改 /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" 则说明受宿主限制,无法修改。