网卡出问题时的困惑
服务器网卡有时候会出现一种很奇怪的现象:明明网线插着,灯也在闪,网络也能通信,但速度就是上不去。运维同学重启了服务、检查了防火墙、查了路由表,都没发现问题。最后发现,千兆网卡(1000Mbps)不知道什么时候降速到了百兆(100Mbps)甚至十兆(10Mbps)模式。
这种降速的原因可能是网线质量不好、水晶头接触不良、或者对端设备端口协商失败了。但这些在操作系统层面看不出来,因为 ifconfig 和 ip addr 只显示接口状态,不会告诉你当前的实际协商速率。
这时候 ethtool 就出场了。ethtool 是 Linux 下最强大的网卡诊断工具,它能查看和修改网卡的驱动参数、速率、双工模式(半双工/全双工,即数据能不能同时收发)、自动协商状态、网卡统计计数等。我敢说,任何做运维或者网络管理的人,都离不开 ethtool。
我第一次被 ethtool 拯救是在一个数据中心。当时新上架的几台服务器连接到交换机后总是不稳定,时断时续。运维同事换了网线、换了端口都不行。我用 ethtool 一看,发现网卡的自动协商(Auto-negotiation,两端设备自动协商最佳连接参数的过程)结果是 10baseT/Half,而且 CRC(循环冗余校验)错误计数在飞速增长。最终确认是那批网线质量不过关,替换掉之后速率恢复正常,协商到了 1000baseT/Full。
查看网卡基本状态
使用 ethtool 的第一步就是查看网卡当前的工作状态。网卡名称一般是 eth0、ens33、eno1 等,用 ip addr 或 nmcli 可以查到。
# 查看 eth0 网卡的基本状态(速率、双工、自动协商)
sudo ethtool eth0
输出类似这样:
Settings for eth0:
Supported ports: [ TP MII ]
Supported link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Half 1000baseT/Full
Supported pause frame use: No
Supports auto-negotiation: Yes
Advertised link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Half 1000baseT/Full
Advertised pause frame use: No
Advertised auto-negotiation: Yes
Speed: 1000Mb/s
Duplex: Full
Auto-negotiation: on
Port: Twisted Pair
PHYAD: 0
Transceiver: internal
Auto-negotiation: on
Link detected: yes
看这个输出,最关键的是以下几行:
- ·Speed:当前的协商速率。看到是
1000Mb/s 说明千兆正常工作。 - ·Duplex:双工模式。
Full 全双工表示可以同时收发数据,Half 半双工则不行。 - ·Link detected:链路是否检测到。
yes 表示物理连接正常。 - ·Auto-negotiation:自动协商是否开启。正常情况下应该是
on。
如果 Speed 显示 100Mb/s 而你的网卡和交换机都支持千兆,那就是有问题了。不过也要注意,有些时候降速是有意为之,比如为了节能或者兼容老旧设备。但如果是莫名其妙降的速,就得好好查一查了。
查看网卡驱动和固件信息
ethool 还能查看网卡使用的驱动程序、固件版本和PCI总线信息。这对排查驱动兼容性问题很有帮助。
# 查看网卡驱动信息(驱动名、版本、固件版本、总线信息)
sudo ethtool -i eth0
输出示例:
driver: e1000e
version: 3.2.6-k
firmware-version: 1.8-0
expansion-rom-version:
bus-info: 0000:00:19.0
supports-statistics: yes
supports-test: yes
supports-eeprom-access: yes
supports-register-dump: yes
supports-priv-flags: yes
这里的 driver 是驱动模块名,firmware-version 是网卡固件版本。如果你的网卡频繁出现掉线或性能问题,检查驱动版本和固件版本是否过旧,往往是排查方向之一。
遇到过一次网卡在压力测试下经常丢包的情况。查了驱动版本后发现是比较老的内核模块,升级内核并更新驱动后问题不再出现。如果你遇到了类似的问题,先 ethtool -i 看一眼驱动信息再决定是否需要升级,不要盲目重装系统。
检查网卡统计信息
当系统网络出现异常,比如丢包、错包,最直接的手段就是查看网卡的硬件统计计数。
# 查看网卡的详细统计计数
sudo ethtool -S eth0
这个输出可能很长,不同的网卡驱动会提供不同种类的计数器。常见的关键指标包括:
- ·rx_crc_errors:接收到的CRC(循环冗余校验,检测数据是否在传输中被破坏)错误包数。这个数字如果持续增长,说明物理链路有问题,可能是网线干扰、光模块故障等。
- ·rx_frame_errors:接收到的帧错误数量,通常和CRC错误一起出现。
- ·tx_errors / rx_errors:发送/接收的错误包总数。
- ·tx_dropped / rx_dropped:被丢弃的数据包,可能是因为缓冲区满了。
- ·collisions:冲突次数。半双工模式下比较多见,全双工模式下的冲突通常意味着物理层问题。
# 只看特定几个关键计数器,通过 grep 过滤出来
sudo ethtool -S eth0 | grep -E "crc|error|drop|collision"
观察这些计数器要结合时间段来看。如果网卡刚启动时统计为零,运行一小时后就出现了几千个CRC错误,那就要重视了。如果运行了几个月才有几十个错误,那基本在正常范围内。
我曾经帮一个游戏公司排查线上服务器频繁断流的故障。用 ethtool -S eth0 一看,rx_missed_errors 高达数百万。这个计数器表示网卡硬件缓冲区满了以后被迫丢弃的数据包。最终定位到是网卡的中断合并参数设置不当,调整 ethtool -C 的 Rx 和 Tx 合并参数后问题解决。
修改网卡工作参数
ethool 不只是查看工具,它还可以修改网卡的运行参数。但这里要特别说明:在生产环境修改网卡参数要非常谨慎,一旦改错可能导致网络断开。
修改速率与双工模式
# 强制设置网卡为千兆全双工模式(慎用,建议先测试)
sudo ethtool -s eth0 speed 1000 duplex full autoneg on
# 强制百兆全双工(当千兆协商不上时的降级方案)
sudo ethtool -s eth0 speed 100 duplex full autoneg on
这些修改是立即生效的,但重启网络服务或重启系统后就会恢复默认值。要让参数持久化,需要配置到网络接口配置文件里。
在Debian/Ubuntu系统中,在 /etc/network/interfaces 里加一行:
# 编辑网络接口配置文件
sudo nano /etc/network/interfaces
# 在 iface eth0 inet 段内加入 ethtool 选项
# 内容示例:
# iface eth0 inet static
# address 192.168.1.100
# netmask 255.255.255.0
# up ethtool -s eth0 speed 1000 duplex full autoneg on
在CentOS/RHEL系统中(使用systemd-networkd或NetworkManager),可以创建 systemd 服务或者加 ethtool 命令到网络脚本的 post-up 钩子里。
设置网卡缓冲区和合并参数
# 查看当前网卡的合并参数(中断节流设置)
sudo ethtool -c eth0
# 修改接收和发送合并帧数(减少中断频率,降低CPU使用率)
sudo ethtool -C eth0 rx-usecs 100 tx-usecs 100
这些参数对网络性能有直接影响。如果网卡中断太多,CPU会花大量时间处理中断,影响应用性能。如果合并太多,延迟会增加。这是一个需要根据业务场景权衡的参数,没有绝对的最佳值。
诊断网线和光模块问题
查看网口光模块信息
如果你的服务器使用的是光口(SFP/SFP+模块),ethool 也能读出光模块的信息。
# 查看光模块的信息(需要支持 SFP 的网卡)
sudo ethtool -m eth0
这个命令会读出光模块的EEPROM(电可擦除可编程只读存储器)数据,包括光模块类型、传输距离、波长、温度、电压、光功率等。其中最重要的是光功率参数。
# 查看光模块的关键参数
sudo ethtool -m eth0 | grep -iE "power|temp|voltage|wavelength"
光模块的接收光功率(RX Power)如果在接收灵敏度临界值以下,就会出现大量CRC错误甚至断连。这可能是光纤接口脏了、光纤弯曲半径过大、或者光模块寿命到了。用棉签和无水酒精清洁光纤端面,是最常用的修复手段。
测试网卡硬件
某些网卡驱动支持内置的自检功能:
# 对网卡执行离线硬件测试(测试期间网络会中断)
sudo ethtool -t eth0
离线测试会让网卡脱离网络进行自检,测试过程中网络会中断几秒到几十秒。线上服务器不建议在生产高峰期做这个操作。
安全提醒
第一,使用 ethtool -s 修改网卡参数时,如果不小心把速率设成了对端不支持的参数,或者关闭了自动协商,网卡可能直接断连。如果你是通过SSH(安全外壳协议,远程管理连接)操作远程服务器,断连后你可能就回不去了。建议通过带外管理(如IPMI、iDRAC、BMC等远程管理卡)或者本地控制台操作。
第二,ethtool -t 硬件测试会导致短暂断网,不要在业务高峰期执行。
第三,ethtool -E 命令可以修改网卡的EEPROM(存储固件参数的芯片)内容,这是非常危险的操作。改错可能导致网卡变砖,无法恢复。不要随意执行这个操作。
第四,修改 /etc/network/interfaces 或 /etc/sysconfig/network-scripts/ifcfg-* 文件前一定要备份。
# 修改网络配置文件前先备份
sudo cp /etc/network/interfaces /etc/network/interfaces.bak.$(date +%Y%m%d)
第五,网卡参数修改重启后失效这一点其实是个双保险。如果你改错了导致断网,重启服务器就能恢复。所以在不确定的时候,可以先临时修改测试,验证没问题了再写入配置文件。
总结
ethtool 是 Linux 网络排查工具箱中的必备利器。它不像 ping 或 traceroute 那样直接告诉你"通不通",而是告诉你网卡本身"好不好"。当网络出现奇怪的性能问题时,不要只盯着上层协议分析,先从 ethtool 看一下物理层是不是正常的。很多时候问题就出在最底层,而最高级的排查手段往往也是从底层开始。
相关阅读
- ·
man ethtool:完整的参数手册 - ·
man 5 interfaces:Debian/Ubuntu网络接口配置文件格式 - ·
ip link 和 ip addr:现代网络配置工具,和 ethtool 配合使用