CentOS 7 XG-C100C 传输文件丢包问题

驱动更新

问题分析

拿到手的 10G 网卡让我感到非常激动, 但在上机测试后, 我发现内网两台电脑传输文件时, 只能传输约 48MB, 之后就出现了报错并停止传输。然而, 换回之前的网卡后, 这个问题就不再出现。经过多次测试后, 我怀疑问题可能出在网卡驱动上, 并且在亚马逊的用户评价中, 发现有类似的情况。

通过进一步查找, 了解到在亚马逊上看到了几条评价也遇到了丢包问题, 紧接着网卡就停止工作了, 这与我遇到的情况非常相似。

Snipaste_2019-08-25_12-05-05.png

Snipaste_2019-08-25_12-08-03.png

亚马逊用户评论
Red Hat Bugzilla – Bug 1499321

驱动更新

CentOS 7 系统默认的驱动版本是 v2.0.4.0, 网卡芯片组为 Aquantia AQC107

确认网卡信息

lspci 可以看到网卡的芯片组是 AQC107 这个也是我们要去下载的驱动的信息

lspci -s 09:00.0 -vv

09:00.0 Ethernet controller: Aquantia Corp. AQC107 NBase-T/IEEE 802.3bz Ethernet Controller [AQtion] (rev 02)
        Subsystem: ASUSTeK Computer Inc. Device 8741

使用 ethtool 可以查看当前网卡使用的驱动版本

ethtool -i enp2s0

driver: atlantic
version: 2.0.4.0-kern
firmware-version: 3.0.33
expansion-rom-version:
bus-info: 0000:09:00.0
supports-statistics: yes
supports-test: no
supports-eeprom-access: no
supports-register-dump: yes
supports-priv-flags: no

在上一步的信息里面找到了 驱动名称 atlantic 接下来就可以查看驱动详细信息

modinfo atlantic

filename:       /lib/modules/4.20.11-1.el7.elrepo.x86_64/kernel/drivers/net/ethernet/aquantia/atlantic/atlantic.ko
description:    aQuantia Corporation(R) Network Driver
author:         aQuantia
version:        2.0.4.0-kern
license:        GPL v2
srcversion:     65B2095FA0FFCABF9686A7B
alias:          pci:v00001D6Ad000052B1sv*sd*bc*sc*i*
alias:          pci:v00001D6Ad000051B1sv*sd*bc*sc*i*
alias:          pci:v00001D6Ad000092B1sv*sd*bc*sc*i*
alias:          pci:v00001D6Ad000091B1sv*sd*bc*sc*i*
alias:          pci:v00001D6Ad000089B1sv*sd*bc*sc*i*
alias:          pci:v00001D6Ad000088B1sv*sd*bc*sc*i*
alias:          pci:v00001D6Ad000087B1sv*sd*bc*sc*i*
alias:          pci:v00001D6Ad000080B1sv*sd*bc*sc*i*
alias:          pci:v00001D6Ad000012B1sv*sd*bc*sc*i*
alias:          pci:v00001D6Ad000011B1sv*sd*bc*sc*i*
alias:          pci:v00001D6Ad000009B1sv*sd*bc*sc*i*
alias:          pci:v00001D6Ad000008B1sv*sd*bc*sc*i*
alias:          pci:v00001D6Ad000007B1sv*sd*bc*sc*i*
alias:          pci:v00001D6Ad000000B1sv*sd*bc*sc*i*
alias:          pci:v00001D6Ad0000D109sv*sd*bc*sc*i*
alias:          pci:v00001D6Ad0000D108sv*sd*bc*sc*i*
alias:          pci:v00001D6Ad0000D107sv*sd*bc*sc*i*
alias:          pci:v00001D6Ad0000D100sv*sd*bc*sc*i*
alias:          pci:v00001D6Ad00000001sv*sd*bc*sc*i*
depends:
retpoline:      Y
intree:         Y
name:           atlantic
vermagic:       4.20.11-1.el7.elrepo.x86_64 SMP mod_unload modversions
parm:           aq_itr:Interrupt throttling mode (uint)
parm:           aq_itr_tx:TX interrupt throttle rate (uint)
parm:           aq_itr_rx:RX interrupt throttle rate (uint)

这一步可以看到我的内核是自己升级过的 4.20.11 还有就是网卡的驱动版本是 2.0.4.0-kern

下载驱动

华硕自家的支持 (XG-C100C Support) 里面也有驱动工具, 但是里面的版本非常低是 v2.0.15.0 截止本文发布的时候 AQC107 驱动版本是 v2.2.6.0.178

Snipaste_2019-08-25_12-17-11.png

华硕的 XG-C100C 使用的芯片组是 Aquantia AQC107 所以可以直接安装 Aquantia 的驱动 (Aquantia Driver Downloads)

Snipaste_2019-08-25_12-23-17.png

安装基础工具

安装步骤在 README.txt 写的很详细. 这里只讲一种方法

如果是自己升级内核就需要同时安装内核的 kernel-devel 我这个则需要修改安装脚本在 kernel-devel 中间加上 -ml 才可以正常安装

这个可以查看当前安装的内核

rpm -qa | grep kernel-ml

安装前需要安装必要依赖工具

yum install kernel-devel-`uname -r` gcc gcc-c++ make dkms

解压并安装驱动

安装好基础工具之后解压驱动程序

tar zxf Aquantia-AQtion-x.y.z.tar.gz
cd ~/aquantia

执行安装脚本

./dkms.sh install

驱动安装位置在

/lib/modules/`uname -r`/extra/atlantic.ko

在使用 modinfo 查看版本就是新的了

modinfo atlantic

filename:       /lib/modules/4.20.11-1.el7.elrepo.x86_64/extra/atlantic.ko
description:    aQuantia Corporation(R) Network Driver
author:         aQuantia
version:        2.2.6.0
license:        GPL v2
firmware:       aquantia/91B1.fw
firmware:       aquantia/87B1.fw
firmware:       aquantia/80B1.fw
srcversion:     3BD2BA33B9C3E4A2B0556D9
alias:          pci:v00001D6Ad000092B1sv*sd*bc*sc*i*
alias:          pci:v00001D6Ad000091B1sv*sd*bc*sc*i*
alias:          pci:v00001D6Ad000089B1sv*sd*bc*sc*i*
alias:          pci:v00001D6Ad000088B1sv*sd*bc*sc*i*
alias:          pci:v00001D6Ad000087B1sv*sd*bc*sc*i*
alias:          pci:v00001D6Ad000080B1sv*sd*bc*sc*i*
alias:          pci:v00001D6Ad000012B1sv*sd*bc*sc*i*
alias:          pci:v00001D6Ad000011B1sv*sd*bc*sc*i*
alias:          pci:v00001D6Ad000009B1sv*sd*bc*sc*i*
alias:          pci:v00001D6Ad000008B1sv*sd*bc*sc*i*
alias:          pci:v00001D6Ad000007B1sv*sd*bc*sc*i*
alias:          pci:v00001D6Ad000000B1sv*sd*bc*sc*i*
alias:          pci:v00001D6Ad0000D109sv*sd*bc*sc*i*
alias:          pci:v00001D6Ad0000D108sv*sd*bc*sc*i*
alias:          pci:v00001D6Ad0000D107sv*sd*bc*sc*i*
alias:          pci:v00001D6Ad0000D100sv*sd*bc*sc*i*
alias:          pci:v00001D6Ad00000001sv*sd*bc*sc*i*
depends:        crc-itu-t,ptp
retpoline:      Y
name:           atlantic
vermagic:       4.20.11-1.el7.elrepo.x86_64 SMP mod_unload modversions
parm:           aq_ptp_offset_forced:Force to use the driver parameters (uint)
parm:           aq_ptp_offset_100:PTP offset for 100M (uint)
parm:           aq_ptp_offset_1000:PTP offset for 1G (uint)
parm:           aq_ptp_offset_2500:PTP offset for 2,5G (uint)
parm:           aq_ptp_offset_5000:PTP offset for 5G (uint)
parm:           aq_ptp_offset_10000:PTP offset for 10G (uint)
parm:           aq_itr:Interrupt throttling mode (uint)
parm:           aq_itr_tx:TX interrupt throttle rate (uint)
parm:           aq_itr_rx:RX interrupt throttle rate (uint)
parm:           aq_rxpageorder:RX page order override (uint)
parm:           aq_rx_refill_thres:RX refill threshold (uint)
parm:           aq_fw_did:Use FW image for this DID (array of uint)
parm:           aq_fw_sid:Use provisioning data for this SID (array of uint)
parm:           aq_force_host_boot:Force host boot (array of uint)

这里结束后还需要使用 ethtool 查看一下当前使用的版本. 发现正在使用的版本没有变化

ethtool -i enp2s0

driver: atlantic
version: 2.0.4.0-kern
firmware-version: 3.0.33
expansion-rom-version:
bus-info: 0000:09:00.0
supports-statistics: yes
supports-test: no
supports-eeprom-access: no
supports-register-dump: yes

加载新驱动模块

首先移除旧模块

rmmod atlantic

加载新模块

# 推荐使用绝对路径
insmod /lib/modules/4.20.11-1.el7.elrepo.x86_64/extra/atlantic.ko

# 或者
insmod /lib/modules/`uname -r`/extra/atlantic.ko

分析模块依赖

depmod -a

重启网络服务

service network restart

验证驱动更新

最后使用 ethtool 查看当前使用的版本. 现在版本已经变成 2.2.6.0 新的了, 成功!

ethtool -i enp2s0

driver: atlantic
version: 2.2.6.0
firmware-version: 3.0.33
expansion-rom-version:
bus-info: 0000:09:00.0
supports-statistics: yes
supports-test: no
supports-eeprom-access: no
supports-register-dump: yes
supports-priv-flags: yes

命令解释

modprobe atlantic

这个命令用于加载指定的内核模块 (这里是 atlantic 模块)。modprobe 会自动处理模块的依赖关系, 如果该模块依赖其他模块, modprobe 会自动加载它们。它是一个高级命令, 适合大多数情况。

modprobe atlantic 可以替代 insmod atlantic

insmod

insmod 命令用于手动加载指定的内核模块。与 modprobe 不同, insmod 只会加载指定的模块, 而不会自动处理依赖关系。所以如果该模块有其他依赖模块, 你需要手动加载这些依赖模块, 否则加载会失败。

depmod -a

这个命令用于更新内核模块的依赖数据库。它扫描系统中的模块并生成或更新 /lib/modules/$(uname -r)/modules.dep 文件, 该文件记录了模块之间的依赖关系。通常在安装新模块后执行, 确保系统知道所有模块的依赖关系。

rmmod atlantic

rmmod 用于卸载指定的内核模块。它会将已加载的模块从内核中移除。如果有其他模块依赖这个模块, 卸载操作会失败, 除非依赖的模块也被卸载。


原文

linux更新网卡驱动
检查Linux服务器网卡驱动版本并更新

最后更新于 2019-08-25
使用 Hugo 构建
主题 StackJimmy 设计