Linux服务器网卡性能调优教程
为什么要关心Linux网卡性能调优
网卡性能直接影响服务器的响应速度和并发能力。
很多新手以为只要硬件够好,网络就一定快,但实际上操作系统默认的网卡参数偏向保守,不做调优的话,万兆网卡可能只跑出千兆的水平。
本文就从零开始,手把手教你完成Linux服务器网卡性能调优,每一步都带命令和结果验证,你只需在SSH终端里照着敲就行。
第一步:摸清你网卡的“底细”
操作前必须先知道当前网卡型号、驱动、支持的功能和当前速率。
使用下面两条命令:
# 查看所有网卡及IP信息
ip addr show
# 查看网卡详细参数(以eth0为例,换成你自己的网卡名)
ethtool eth0
重点关注 Speed、Duplex、Auto-negotiation 这几项。
如果 Speed 不是预期值(比如明明是万兆卡却显示1000Mb/s),先检查网线、交换机端口或协商模式。务必先确保物理链路正常,再谈调优。
第二步:用ethtool做基础调优
关闭网卡节能和减少中断延迟能明显提升小包处理性能。
执行以下命令(临时生效,重启后失效):
# 关闭TCP校验和卸载(部分虚拟机环境可能不支持)
ethtool -K eth0 tx off rx off
# 关闭通用接收卸载(GRO)和通用分段卸载(GSO)
ethtool -K eth0 gro off gso off
# 调整环形缓冲区大小(先看当前值:ethtool -g eth0)
ethtool -G eth0 rx 4096 tx 4096
注意: 有些云服务器或虚拟化环境不允许修改部分参数,会报错,此时跳过对应选项即可。
修改后建议用 ethtool -k eth0 确认。
第三步:中断亲和性与CPU绑定
把网卡中断分配到不同的CPU核心,避免单个核心被中断风暴打满,这对多队列网卡特别有效。
# 查看网卡中断号
cat /proc/interrupts | grep eth0
# 假设irq号为78-85,将它们平均绑定到CPU0-3(以78为例)
echo "1" > /proc/irq/78/smp_affinity # 只允许CPU0处理(二进制0001)
echo "2" > /proc/irq/79/smp_affinity # CPU1(0010)
echo "4" > /proc/irq/80/smp_affinity # CPU2(0100)
echo "8" > /proc/irq/81/smp_affinity # CPU3(1000)
重要提示: smp_affinity 使用的是十六进制掩码,但直接用十进制数字等效。
如果你有4个CPU,就按上面示例分配。
修改后执行 cat /proc/interrupts 观察中断分布是否均衡。
第四步:修改内核网络参数(永久生效)
调整TCP缓冲区、最大连接数、快速回收等参数,有利于高并发场景。
编辑 /etc/sysctl.conf,添加以下内容:
# 增大TCP读写缓冲区(单位字节)
net.core.rmem_default = 262144
net.core.rmem_max = 16777216
net.core.wmem_default = 262144
net.core.wmem_max = 16777216
# 开启TCP窗口缩放和选择性确认
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_sack = 1
# 提高处理积压连接的能力
net.core.netdev_max_backlog = 5000
net.core.somaxconn = 1024
保存后执行 sysctl -p 使生效。如果你在云环境或容器里,某些参数可能不允许修改,请根据系统日志跳过。
第五步:验证调优效果
使用 iperf3 分别在调优前后测速,对比吞吐量变化。
在服务器上:
# 服务端(假设IP为192.168.1.100)
iperf3 -s
在另一台客户端:
iperf3 -c 192.168.1.100 -t 30 -P 4
观察输出中的 sender 和 receiver 速率。
如果调优后吞吐显著提升,说明操作有效。
若变化不大,检查是否还有其他瓶颈(磁盘IO、CPU负载等)。
高频问题与避坑
- 问题: 修改
ethtool -K时报错Operation not supported。
解决: 说明网卡驱动或虚拟化环境不支持该特性,跳过即可,不影响基本功能。
- 问题: 调整
smp_affinity后中断分配不均衡。
解决: 确保每个中断号写对了掩码,并且CPU核心存在。
可以先用 nproc 查看CPU数。
- 问题: 重启后所有修改都丢失了。
解决: 将 ethtool 命令写入 /etc/rc.local(记得赋予执行权限),
或使用 systemd service 实现开机自启。sysctl 参数已写在 /etc/sysctl.conf 中,
重启后自动生效。
- 避坑: 不要同时开启
tcp_tw_recycle(内核已废弃),在NAT环境下会导致问题。永远不要在生产环境开启该参数。
按照以上步骤操作,你的Linux服务器网卡性能调优任务就基本完成了。
先在测试环境跑一遍,确认无误再应用到线上机器。
遇到异常时,优先回看避坑和高频问题部分,通常能快速定位原因。