Linux服务器在网络请求量持续增长时,默认的内核网络参数常常成为瓶颈。无论是对外提供API的网关,还是内部消息中间件,若不对TCP协议栈与网卡收发队列做针对性调整,就容易出现连接排队、重传率上升和软中断集中等问题。本文围绕实际可调的设置项,说明优化思路与操作步骤。

一、TCP协议栈层面的核心参数
Linux的TCP实现位于内核中,大量行为由sysctl可调控的变量控制。默认值偏向兼容性与低内存占用,在专有服务器上可以放宽限制。最常见的三个参数分别是tcp_tw_reuse、somaxconn与tcp_max_syn_backlog,它们分别影响端口复用、监听队列长度和半连接容量。
以tcp_tw_reuse为例,当客户端频繁短连接访问本机服务时,端口会停留在TIME_WAIT状态。默认不复用会让可用源端口迅速耗尽。开启后,内核在安全前提下复用处于该状态的套接字,缓解本地发起大量外连时的端口压力。需要注意,它只对 outbound 连接生效,不能解决被动方的TIME_WAIT堆积。
# 查看当前TCP相关参数 sysctl net.ipv4.tcp_tw_reuse sysctl net.core.somaxconn sysctl net.ipv4.tcp_max_syn_backlog # 临时调整(重启失效) sysctl -w net.ipv4.tcp_tw_reuse=1 sysctl -w net.core.somaxconn=4096 sysctl -w net.ipv4.tcp_max_syn_backlog=8192
若要使配置持久化,应将上述赋值写入/etc/sysctl.conf或/etc/sysctl.d/下的独立文件,再执行sysctl -p加载。生产环境建议先在测试机验证连接成功率与延迟分布,避免backlog过大引发内存占用异常。
1.1 缓冲区与窗口缩放
tcp_rmem与tcp_wmem定义了收发缓冲区的动态范围。高带宽延时积的网络(如跨地域专线)若缓冲区过小,单连接吞吐会被窗口限制。通过配合tcp_window_scaling=1,可以让窗口突破64KB传统上限。
下面给出一组适合千兆以上内网的大吞吐设定,其中最小值、默认值、最大值以字节为单位。调整时应结合服务器内存总量,防止多连接场景下缓冲占用过高。
sysctl -w net.ipv4.tcp_rmem='4096 87380 16777216' sysctl -w net.ipv4.tcp_wmem='4096 65536 16777216' sysctl -w net.ipv4.tcp_window_scaling=1
二、网卡与软中断的队列优化
多核服务器上,单一CPU处理所有网络软中断会造成瓶颈。现代网卡支持多队列(Multi-Queue),可将不同流分散到多个CPU核心。利用irqbalance服务或手动绑定中断亲和性,能显著降低单核负载。
首先通过ethtool查看网卡队列数。若队列数少于CPU核心数,高并发时必然出现收包软中断集中。对于支持RSS的网卡,应启用并设定合适哈希字段,让同一连接的双向包落入同队列,减少乱序。
# 查看网卡通道队列 ethtool -l eth0 # 设置合并队列数为8(依网卡支持而定) ethtool -L eth0 combined 8 # 查看中断号与CPU亲和性 cat /proc/interrupts | grep eth0
在虚拟化环境中,有时需要开启网卡的GRO与LRO,将小包合并以降低中断频率,但这可能对转发延迟敏感的业务不利。应结合业务画像选择,而非一律开启。
2.1 调整网卡的offload特性
offload把部分协议处理交给网卡硬件,如TSO、GSO可减轻CPU封装负担。使用ethtool -k可观察当前状态。对于高PPS(包每秒)场景,开启TSO常能提升吞吐;但若中间设备MTU不一致,可能引发分片问题。
ethtool -k eth0 | grep tcp-segmentation-offload ethtool -K eth0 tso on ethtool -K eth0 gso on
每次变更offload后,建议用iperf3做对比测试,记录CPU占用与带宽曲线,确认收益大于潜在兼容性成本。
三、连接跟踪与防火墙的开销控制
若服务器启用了iptables的NAT或filter表且连接数巨大,conntrack表可能成为隐性瓶颈。net.netfilter.nf_conntrack_max决定最大跟踪数,过小会丢包并记录table full错误。
对于纯后端服务且不依赖状态防火墙的机器,可考虑改用nftables的仅匹配无跟踪规则,或直接关闭无用链。下面的参数将跟踪表扩容并缩短失效时间,缓解瞬时高峰。
sysctl -w net.netfilter.nf_conntrack_max=262144 sysctl -w net.netfilter.nf_conntrack_tcp_timeout_established=1200
同时,在ulimit方面,运行网络服务的用户应提高nofile限制,否则epoll模型下句柄数到顶会拒绝新连接。该设置需在systemd service文件或/etc/security/limits.conf中一并调整。
四、验证与监控方法
优化不是一次性的,应建立指标观测。ss -tin可查看每条连接的RTT、重传与窗口;sar -n DEV 1能实时输出网卡流量与错误包。对比调参前后这些数据,才能确认改动有效。
建议写一个简单的巡检脚本,定时收集tcp重传率、软中断分布与队列丢弃计数,异常时告警。只有把调整纳入持续运维,网络性能才不会随业务增长再次劣化。
# 查看TCP重传与丢包概况 ss -tin | grep -E 'retrans|lost' | head # 观察网卡错误与丢弃 ethtool -S eth0 | grep -E 'rx_errors|tx_dropped'
综上,Linux网络性能优化是协议栈、网卡与监控三方协同的结果。逐项调整、量化验证,才能在复杂生产环境中稳妥提升吞吐与稳定性。