Linux服务器网络协议调优实操指南
什么时候需要调优网络协议
当你的服务器同时处理大量连接(如Web服务、API网关、视频流),或者出现丢包率上升、延迟不稳定、传输速度上不去等问题时,Linux默认的网络协议参数往往成为瓶颈。
调优并非万能,但在多数场景下能明显提升吞吐量和降低连接超时概率。
开始前先确认这几点
- 系统版本:执行
cat /etc/os-release查看发行版,本文以CentOS 7/8和Ubuntu 20.04/22.04为例。不同版本的部分参数名可能有差异。 - 确认当前值:调优前先用
sysctl -a | grep -E "(net.core|net.ipv4.tcp)"备份当前参数,建议导出到文件留底:sysctl -a > /tmp/sysctl_backup_$(date +%Y%m%d).txt。 - 操作权限:所有修改需要root用户,普通用户请加
sudo。
修改核心参数的三个关键点
1. 提高系统最大连接与文件句柄
编辑 /etc/sysctl.conf 或在 /etc/sysctl.d/ 下新建 .conf 文件,例如 99-network-tuning.conf:
# 最大可打开文件数(影响 socket 数量)
fs.file-max = 1000000
# 系统级最大 socket 监听队列长度
net.core.somaxconn = 65535
# 每个端口 listen 的已完成连接队列
net.core.netdev_max_backlog = 5000
net.core.somaxconn 建议同步修改应用层(如Nginx的listen指令中的backlog),否则应用会受限于自身配置。
2. TCP 缓冲区与连接优化
# TCP 读/写缓冲区最小值、默认值、最大值(字节)
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
# 启用 TCP 窗口缩放(高延迟环境必备)
net.ipv4.tcp_window_scaling = 1
# 开启 TCP Fast Open(需服务端和客户端都支持)
net.ipv4.tcp_fastopen = 3
# 减少 TIME_WAIT 堆积(主动关闭方)
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 15
注意:内核4.12以后已移除tcp_tw_recycle参数,不要添加,否则启动会报错。当前推荐只使用tcp_tw_reuse。
3. 网卡中断与队列绑定
如果服务器使用多核CPU,可以通过调整网卡RSS(接收端缩放)让中断分散到不同核心。
操作步骤:
- 查看网卡名称:
ip link show(一般为eth0或ens3等)。 - 检查当前队列数:
ethtool -l eth0,如果显示Combined数值小于CPU核数,可尝试调大。 - 调整队列数(需网卡驱动支持):
ethtool -L eth0 combined 4
- 手动绑定IRQ到特定CPU:查看中断号
cat /proc/interrupts | grep eth0,然后修改/proc/irq/<数字>/smp_affinity(用16进制掩码),建议直接使用 irqbalance 服务(systemctl enable irqbalance --now)自动均衡。
这些坑新手经常踩
- 直接复制网上参数不验证:某些参数如
net.ipv4.tcp_congestion_control设置为 bbr 需要内核支持(4.9+),在旧内核上会报错。先用modprobe tcp_bbr确认模块存在。 - 修改后未重启网络或直接重启服务:执行
sysctl -p后最好重启对应服务(如nginx),或者观察几分钟再测试。 - overcommit 设置过高导致OOM:不要盲目改
vm.overcommit_memory,仅当内存确实充裕时才调大。 - 防火墙或安全组没放开:调优后丢包依然高,优先检查
iptables、firewalld或云平台的安全组规则。
如何验证调优效果
- 检查参数是否生效:
sysctl -a | grep net.core.somaxconn确认值已更新。 - 压力测试:用
ab或wrk模拟并发请求,对比调优前后的 Requests/sec 和延迟百分位。例如:
wrk -t12 -c400 -d30s http://你的服务器IP/test
- 监控丢包:
netstat -s | grep -E "(packet receive errors|segments retransmited)"重传率下降说明调优有效。 - 实时查看连接状态:
ss -s可看到各状态的连接数,TIME_WAIT 过多说明tcp_tw_reuse可能未生效或应用端活跃连接过多。
常见问题解答
Q:修改后重启服务器会丢失吗?
A:只要写入 /etc/sysctl.conf 或 /etc/sysctl.d/ 下的文件,重启后会自动加载。可以用 sysctl -p 立即生效并持久化。
Q:调优参数能用于生产环境吗?
A:可以,但建议先在测试环境压测确认无副作用。本文参数是业界通用推荐值,但具体数值需根据你的内存、带宽和业务场景微调。
Q:为什么修改后连接数没变化?
A:检查应用层配置是否也限制了最大连接。以Nginx为例,worker_connections 和 worker_rlimit_nofile 都需要同步调大。
如果你正在处理 Linux服务器网络协议调优,建议先按本文步骤完整执行,再根据自己的环境做微调;
遇到异常时优先回看避坑和高频问题部分。