用 ethtool -k 接口名查看TSO、GSO、LRO等卸载特性当前开关状态,on/off表示是否启用;需结合驱动、固件和硬件能力验证实际生效情况,不能仅依赖配置文件。

如何确认网卡是否支持高级特性(如TSO、GSO、LRO)
CentOS 7 默认启用部分硬件卸载特性,但具体是否生效取决于驱动、固件和物理网卡能力。不能只看配置项,必须验证实际状态。
用 ethtool 查看当前启用情况:
ethtool -k ens33
输出中每行末尾的 on/off 表示当前开关状态。重点关注这几项:
-
tcp-segmentation-offload(TSO):影响大包发送性能,需网卡硬件支持 -
generic-segmentation-offload(GSO):内核软件实现,通常默认开启 -
large-receive-offload(LRO):可能与某些防火墙或抓包工具冲突(如tcpdump丢包) -
generic-receive-offload(GRO):LRO 的更安全替代,推荐保留开启
临时关闭某项特性(调试/兼容性修复)
某些场景下(比如抓包异常、虚拟化环境丢包、DPDK 应用启动失败),需要禁用特定卸载。这是运行时操作,重启后失效:
ethtool -K ens33 tso off gso off lro off
注意:ethtool -K 必须用 root 权限;ens33 替换为你的真实接口名(可用 ip link show 确认);不能单独关 GRO 而留 LRO —— 两者互斥,内核会自动禁用 LRO 当 GRO 开启时。
常见触发条件:
-
tcpdump抓不到完整 TCP 流 → 关lro或gro - KVM 虚拟机内 guest 网络延迟抖动 → 关
tso和gso - 使用
netmap或PF_RING时初始化失败 → 全部关掉卸载
永久禁用高级特性(写入 udev 规则)
直接改 /etc/sysconfig/network-scripts/ifcfg-ens33 不起作用 —— 这些开关不在 network-scripts 控制范围内。正确做法是通过 udev 规则在网卡加载后自动执行 ethtool 命令:
新建规则文件:
/etc/udev/rules.d/80-disable-offload.rules
内容为:
CentOS Linux 7.9.2009是传统CentOS Linux 7的最后主要版本,也是很多企业历史服务器中仍可能遇到的系统版本。它以稳定、兼容RHEL 7生态、文档丰富和软件支持广泛著称,曾长期用于Web服务、数据库、虚拟化节点和企业内部业务系统。不过CentOS Linux 7已于2024年6月30日停止维护,现在继续使用会面临安全补丁缺失风险。该版本更适合旧业务迁移、历史环境恢复或离
SUBSYSTEM=="net", ACTION=="add", KERNEL=="ens33", RUN+="/sbin/ethtool -K %k tso off gso off lro off gro off"
然后重载规则:
udevadm control --reload-rules && udevadm trigger --subsystem-match=net
⚠️ 容易踩的坑:
- 规则中
%k是内核设备名,不是配置文件里的DEVICE=值 - 如果网卡名是动态生成(如
enp0s3),建议用ATTR{address}匹配 MAC 地址,避免规则失效 - NetworkManager 服务可能覆盖 udev 设置 —— 若启用了 NM,需额外在 connection 配置里加
ethtool.features参数(见下条)
NetworkManager 下统一管理 ethtool 特性
若系统启用了 NetworkManager(CentOS 7 默认启用),推荐用 NM 的方式管理,比 udev 更可靠:
编辑连接配置(例如名为 "System ens33"):
nmcli con mod "System ens33" ethtool.feature-tso off ethtool.feature-gso off ethtool.feature-lro off
然后重新激活连接:
nmcli con down "System ens33" && nmcli con up "System ens33"
该方式优势明显:
- 自动适配热插拔、重命名网卡
- 与 DHCP / static IP 配置解耦,不依赖 ifcfg 文件
- 可通过
nmcli con show "System ens33"查看当前生效值
注意:NM 的 ethtool 参数名带 feature- 前缀,且只接受 on/off,不支持数值型参数(如 rx 缓冲区大小需另用 ethtool -G 单独设)。
真实环境中,多数问题出在「以为改了 ifcfg 就生效」或「没区分 NM 和传统 network.service 的控制域」——这两点最容易白忙活半天。

















