13 10 月 2026

同样的机器,别人跑游戏服不卡、你跑就飘;别人的机器能扛住高并发,你的一上量就丢包。差别 often 藏在 /etc/sysctl.conf 里。

这篇讲 sysctl 内核参数调优:哪些参数值得调、调到多少、怎么持久化、怎么验证。针对游戏服务器和高并发 Web 两个场景给了成套参数。

需要云服务器可以看看财富云计算:NAT 型无独立公网 IP,价格比独立 IP 机型省一半以上,一键开服面板,主流游戏快速部署。

一、sysctl 是什么

内核参数是 Linux 内核运行时的行为开关:TCP 缓冲区多大、能开多少连接、内存怎么回收、端口范围……全部可调。

# 查看单个参数
sysctl net.core.somaxconn

# 查看所有(几千个)
sysctl -a

# 临时修改(重启失效)
sysctl -w net.core.somaxconn=1024

# 从配置文件加载(永久生效)
sysctl -p /etc/sysctl.d/99-custom.conf

注意:容器内(Docker)修改 sysctl 受限,部分参数只在宿主机生效。云服务器(KVM 虚拟化)大部分网络参数可调,少数和虚拟化相关的由宿主控制。

二、游戏服务器调优参数

游戏服的特点是:UDP 流量大、连接数中等、对延迟敏感。

# /etc/sysctl.d/99-gameserver.conf

# ===== 网络缓冲区(关键) =====
# UDP 接收缓冲区(游戏协议走 UDP,默认太小会丢包)
net.core.rmem_default = 262144
net.core.rmem_max = 8388608
net.core.wmem_default = 262144
net.core.wmem_max = 8388608

# TCP 自动调优范围
net.ipv4.tcp_rmem = 4096 262144 8388608
net.ipv4.tcp_wmem = 4096 262144 8388608

# ===== 连接队列(防高并发丢连接) =====
# 内核连接队列上限
net.core.somaxconn = 8192
# 半连接队列(SYN 攻击防护相关)
net.ipv4.tcp_max_syn_backlog = 8192

# ===== 端口范围(大量出站连接时用) =====
net.ipv4.ip_local_port_range = 10000 65000

# ===== TIME_WAIT 复用(游戏服频繁重连时) =====
net.ipv4.tcp_tw_reuse = 1
# tcp_tw_recycle 在新内核已移除,别用了

# ===== 降低延迟 =====
# 减少 SYN 重传次数(内网/低延迟场景)
net.ipv4.tcp_syn_retries = 2
net.ipv4.tcp_synack_retries = 2
# TCP 连接超时
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 3

# ===== 防洪水/扫描 =====
net.ipv4.tcp_syncookies = 1
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.conf.all.rp_filter = 1

# ===== 内存 =====
# 尽量用物理内存,少 swap(游戏服卡顿的主因之一)
vm.swappiness = 10
# 脏页回写策略
vm.dirty_ratio = 15
vm.dirty_background_ratio = 5
# 内存水位线
vm.watermark_scale_factor = 50
# 允许 overcommit(游戏服内存申请比较激进)
vm.overcommit_memory = 1
vm.overcommit_ratio = 50

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

# ===== 队列调度(低延迟) =====
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr

重点解释三个:

tcp_congestion_control = bbr:Google 出的拥塞控制算法,比默认的 cubic 在弱网/高延迟链路上快得多。游戏服、跨国访问提升明显。先确认内核支持:

sysctl net.ipv4.tcp_available_congestion_control
# 输出里有 bbr 才能用(内核 4.9+ 自带,主流云系统都支持)

vm.swappiness = 10:游戏最怕卡顿,swap 换页会引入几十毫秒的延迟。设 10 让系统尽量用物理内存。前提是内存别太紧张,详见Swap 分区与内存优化。

rmem_max = 8388608(8M):UDP 大流量时默认缓冲区(约 200KB)会丢包。调到 8M,游戏数据传输更稳。

三、高并发 Web 服务器参数

Web 服务的特点是:TCP 连接多(短连接为主)、文件句柄吃紧、内存给缓存。

# /etc/sysctl.d/99-webserver.conf

# ===== 文件句柄(Web 服务器头号瓶颈) =====
fs.file-max = 2097152
fs.nr_open = 2097152
# inotify(文件监控)
fs.inotify.max_user_watches = 524288

# ===== TCP 连接 =====
# 监听队列(必须和 nginx 的 backlog 配合)
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 65535
net.ipv4.tcp_max_syn_backlog = 65535

# TIME_WAIT 快速回收复用(高并发短连接关键)
net.ipv4.tcp_tw_reuse = 1
# 注意: tcp_tw_recycle 已废弃, NAT 环境下会出问题,别用

# 连接跟踪(有防火墙/NAT 时关键,默认值太小会丢包)
net.netfilter.nf_conntrack_max = 1048576
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 30
net.netfilter.nf_conntrack_tcp_timeout_established = 600

# ===== 缓冲区 =====
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
net.core.default_qdisc = fq

# ===== 安全基线 =====
net.ipv4.tcp_syncookies = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.all.log_martians = 1

# ===== 内存(Web 服务) =====
vm.swappiness = 30
vm.dirty_ratio = 20
vm.dirty_background_ratio = 10

# ===== 进程/线程 =====
kernel.pid_max = 4194304
kernel.threads-max = 4194304

Web 场景最容易踩的坑:nf_conntrack_max。默认 65536,高并发下连接跟踪表满,dmesg 报 nf_conntrack: table full, dropping packet,表现是随机丢包、连接超时。调大能解决。

四、怎么调:方法论

别照抄网上「终极优化参数」,按这个流程来:

1. 先测量

# 看当前值
sysctl net.core.somaxconn

# 看有没有相关报错
dmesg | grep -iE "drop|full|overflow|conntrack"

# 看瓶颈在哪(结合监控)
# - CPU 高 → 不是 sysctl 问题,查应用
# - 内存高 → 调 vm.* 参数
# - 丢包/延迟 → 调网络参数
# - 连接失败 → 调队列和句柄

2. 一次只改一类

网络、内存、文件系统分开调,改完全类重启服务验证效果,再改下一类。一次改 50 个参数,出了问题不知道是谁的锅。

3. 备份原值

# 导出当前所有参数
sysctl -a > /root/sysctl-backup-$(date +%F).conf

# 出问题恢复
sysctl -p /root/sysctl-backup-2026-10-13.conf

4. 验证生效

# 加载配置
sysctl -p /etc/sysctl.d/99-gameserver.conf

# 确认加载
sysctl net.ipv4.tcp_congestion_control

# 重启后依然生效?
reboot
sysctl net.core.somaxconn

配置文件加载顺序:/etc/sysctl.d/ 下的文件按文件名字典序加载,后者覆盖前者。用 99- 前缀保证你的配置最后加载,覆盖系统默认。

五、参数速查表

参数默认游戏服Web 高并发说明
net.core.somaxconn4096819265535监听队列上限
net.ipv4.tcp_max_syn_backlog1024819265535半连接队列
net.core.rmem_max2129928M16M接收缓冲区
net.core.wmem_max2129928M16M发送缓冲区
vm.swappiness601030swap 倾向
fs.file-max81921M2M文件句柄上限
net.ipv4.tcp_tw_reuse011TIME_WAIT 复用
net.netfilter.nf_conntrack_max65536默认1M连接跟踪表
net.ipv4.tcp_congestion_controlcubicbbrbbr拥塞算法
vm.overcommit_memory010内存超售策略

六、常见问题

Q:sysctl -p 报 permission denied 或 read-only?
容器内或只读文件系统。Docker 容器要用 --sysctl 启动参数;只读 rootfs 要挂载 writable 层。

Q:改了参数没生效?
三个原因:配置文件放错位置(要放 /etc/sysctl.d/ 或 /etc/sysctl.conf,且没被别的文件覆盖)、没执行 sysctl -p、参数名在新内核已废弃(查 sysctl -a | grep 参数名)。

Q:BBR 为什么没有效果?
内核不支持(老内核)、或者 default_qdisc 不是 fq(BBR 依赖 fq 调度)、或者瓶颈根本不在网络(是 CPU/磁盘/应用问题)。

Q:调大了缓冲区,内存占用飙升?
rmem_max 是上限不是预分配,实际用多少看流量。但如果确实内存紧张,回调一些。缓冲区不是越大越好。

Q:改错了机器起不来/网络不通?
控制台 VNC 进去,sysctl -p /root/sysctl-backup-xxx.conf 恢复。这就是为什么必须提前备份参数值。

Q:NAT 型服务器有什么特别注意的?
NAT 机型的流量经过服务商网关,网关的 NAT 表和会话数由服务商控制,你的内核参数管不到网关段。所以调 nf_conntrack_max 对 NAT 映射端口的效果有限——但本地进程的连接仍然受你的内核参数管,该调还是调。

七、直接可用的部署流程

# 1. 备份现有参数
sysctl -a > /root/sysctl-before.conf

# 2. 写配置(按场景选游戏服或 Web 版)
cat > /etc/sysctl.d/99-tuning.conf <<'EOF'
# 你的参数...
EOF

# 3. 加载
sysctl -p /etc/sysctl.d/99-tuning.conf

# 4. 抽查生效
sysctl net.core.somaxconn net.ipv4.tcp_congestion_control vm.swappiness

# 5. 观察 24 小时(监控 CPU/内存/丢包)

# 6. 确认稳定后,重启验证持久化
reboot

小结

内核调优记住三点:先测量再调、一次改一类、必须备份原值。游戏服重点调网络缓冲区和 swappiness,Web 服务重点调句柄和连接跟踪表。BBR + fq 是性价比最高的一项,几乎所有场景都值得开。

更多运维教程见财富云计算知识库:网络排查工具、Swap 优化、systemd 服务、监控体系全系列。需要云服务器可以看看财富云计算:一键开服面板,NAT 型无独立公网 IP,价格比独立 IP 机型省一半以上。

延伸阅读
  1. 网站环境怎么选:LNMP 手动 / 宝塔面板 / Docker / 云开发
  2. 问卷表单系统搭建:SurveyKing / Formbricks,数据自己收
  3. 图床搭建:Lsky Pro / Lychee,自托管图片托管方案
  4. 邮件列表搭建:listmonk 自托管 Newsletter,把读者握在自己手里
  5. 文档站点搭建:MkDocs / VuePress / Docsify,产品文档与技术手册方案
  6. RSS 阅读器搭建:FreshRSS 自托管,把信息流拿回自己手里
  7. 短链接服务搭建:Shlink 自托管,链接数据自己掌握
  8. 网站状态监控页搭建:Uptime Kuma,服务器挂了第一时间知道
更多阅读
  1. 上一篇:日志集中管理与 journald 实战:查日志、防撑爆磁盘
  2. 下一篇:MySQL 备份与恢复实战:dump、binlog 时间点恢复、演练
发表评论 4