Intel(R) 以太网 800 系列 ice Linux 基础驱动

日期:2026 年 6 月 30 日


目录


概述

本驱动支持 Linux* 内核版本 3.10.0 及更新版本,但某些功能可能需要更新版本的内核。该驱动对应的虚拟功能(VF)驱动为 iavf,对应的 RDMA 驱动为 irdma。

可使用 ethtool、devlink、lspci 和 ip 获取驱动信息。更新 ethtool 的方法请参阅本文档后面的 附加配置 一节。

目前,本驱动仅支持以可加载模块的方式使用。Intel 不提供针对内核源码的补丁以支持驱动静态链接。

有关硬件要求的问题,请参阅随 Intel 网卡附带的文档。列出的所有硬件要求均适用于 Linux 环境。

  • 本驱动在内核 4.14 及更高版本上支持 XDP(Express Data Path)。
  • 本驱动在内核 4.18 及更高版本上支持 AF_XDP 零拷贝。
  • 注意:帧大小超过 3KB 时会阻止 XDP 使用。

相关文档

有关功能的更多信息,请参阅《Intel(R) 以太网适配器与设备用户指南》(Intel(R) Ethernet Adapters and Devices User Guide),可从 Intel 官网获取:
https://cdrdv2.intel.com/v1/dl/getContent/705831


识别您的网卡

本驱动兼容基于以下芯片的设备:

  • Intel(R) 以太网控制器 E810-C
  • Intel(R) 以太网控制器 E810-XXV
  • Intel(R) 以太网连接 E822-C
  • Intel(R) 以太网连接 E822-L
  • Intel(R) 以太网连接 E823-C
  • Intel(R) 以太网连接 E823-L
  • Intel(R) 以太网连接 E825-C
  • Intel(R) 以太网控制器 E830
  • Intel(R) 以太网控制器 E835

有关如何识别您的网卡以及获取最新 Intel 网络驱动程序的信息,请访问 Intel 支持网站:
https://www.intel.com/support


重要说明

为提高网络安全性而配置 SR-IOV

在虚拟化环境中,对于支持 SR-IOV 的 Intel(R) 以太网网络适配器,虚拟功能(VF)可能受到恶意行为的影响。软件生成的二层帧(如 IEEE 802.3x 链路流量控制、IEEE 802.1Qbb 基于优先级的流量控制等类似类型的帧)并非预期流量,可能会节流主机与虚拟交换机之间的流量,从而降低性能。

要解决此问题并确保与意外流量流隔离,请在 PF 的管理界面上为所有启用了 SR-IOV 的端口配置 VLAN 标记,以便丢弃意外的、可能恶意的帧。

配置说明请参阅后文的 在 SR-IOV 启用端口上配置 VLAN 标记 一节。

若 VF 绑定到正在运行的虚拟机,请勿卸载端口驱动

如果某个虚拟功能(VF)绑定了正在运行的虚拟机(VM),请勿卸载该端口的驱动。否则会导致端口看起来像是挂起(hang)状态。等虚拟机关闭或以其他方式释放 VF 后,该命令才会完成。

固件恢复模式(Firmware Recovery Mode)

当设备检测到需要重新编程固件的问题时,会进入固件恢复模式。设备处于固件恢复模式时,将不传输流量,也不允许任何配置;您只能尝试恢复设备的固件。有关固件恢复模式及其恢复方法的详细信息,请参阅《Intel(R) 以太网适配器与设备用户指南》。

SR-IOV、RDMA 和链路聚合的重要说明

  • VF 驱动不会阻止 teaming/bonding/链路聚合,但这不是受支持的功能。请勿期望 VF 接口上实现故障转移或负载均衡。

  • LAG 与 RDMA 仅在特定条件下兼容。更多信息请参阅后文的 链路聚合与 RDMA 一节。

  • 同样,LAG 与 SR-IOV 也仅在特定条件下兼容。请参阅后文的 链路聚合与 SR-IOV VF 一节。

  • 桥接(Bridging)和 MACVLAN 同样受此限制。如果要在使用 RDMA/SR-IOV 的同时使用桥接或 MACVLAN,必须先启用 RDMA 或 SR-IOV 之前设置桥接或 MACVLAN。如果在配合 SR-IOV 和/或 RDMA 使用桥接或 MACVLAN 时,想要将接口从桥接或 MACVLAN 中移除,必须按以下步骤操作:

    1. 如果 RDMA 处于活动状态,先移除 RDMA。
    2. 销毁已存在的 SR-IOV VF。
    3. 将接口从桥接或 MACVLAN 中移除。
    4. 根据需要重新启用 RDMA 并重建 SR-IOV VF。

编译与安装

ice 驱动需要 动态设备个性化(Dynamic Device Personalization,DDP)包文件 来启用高级功能(例如动态隧道、Intel(R) 以太网流量导向器(Intel(R) Ethernet Flow Director)、RSS、ADQ 等)。

驱动安装过程会安装默认的 DDP 包文件,并在固件根目录(通常为 /lib/firmware/ 或 /lib/firmware/updates/)中创建指向物理包 ice-x.x.x.x.pkg 的软链接 ice.pkg。驱动安装过程还会将驱动模块和 DDP 文件同时放入 initramfs/initrd 镜像中。

注意:

当驱动加载时,它会在固件根目录中查找 intel/ice/ddp/ice.pkg。如果该文件存在,驱动会将其下载到设备中。如果不存在,驱动将进入安全模式(Safe Mode),此时驱动将使用设备 NVM(非易失性存储器)中包含的配置。这不是受支持的配置,许多高级功能将无法使用。更多信息请参阅后文的 动态设备个性化(DDP) 一节。

手动编译驱动

  1. 将基础驱动的 tar 包移动到您选择的目录。例如使用 /home/username/ice 或 /usr/local/src/ice。

  2. 解压缩存档文件,其中 <x.x.x> 为驱动 tar 包的版本号:

    tar -zxf ice-<x.x.x>.tar.gz
    
  3. 进入驱动源码目录,其中 <x.x.x> 为驱动 tar 包的版本号:

    cd ice-<x.x.x>/src/
    
  4. 编译驱动模块:

    make install
    

    二进制文件将安装为:

    /lib/modules/<内核版本>/updates/drivers/net/ethernet/intel/ice/ice.ko
    

    上述安装位置为默认位置,不同的 Linux 发行版可能有所不同。

    注意:

    • 若要使用统一 ethtool 统计信息的 schema 构建驱动,请使用以下命令:

      make CFLAGS_EXTRA='-DUNIFIED_STATS' install
      
    • 若要以设置了 ADQ(应用设备队列)标志的方式编译驱动,请使用以下命令,其中 <nproc> 为逻辑核心数量:

      make -j<nproc> CFLAGS_EXTRA='-DADQ_PERF_COUNTERS' install
      

      (该命令同样会执行上述 make install。)

    • 在编译树外(out-of-tree)基础驱动时,您可能会看到 depmod 发出的与未知 RDMA 符号相关的警告。这些警告是正常的,出现的原因是内核自带的 RDMA 驱动无法与树外基础驱动配合使用。要解决此问题,您需要安装最新版本的树外基础驱动和树外 RDMA 驱动。

    • 某些 Linux 发行版要求在安装驱动后手动重新生成 initramfs/initrd,以便驱动在启动时能与固件正确加载。请参阅相应发行版的文档获取说明。

  5. 使用 modprobe 命令加载模块。

    先检查驱动版本,然后加载:

    modinfo ice
    modprobe ice
    

    或者,确保在加载新模块之前先从内核中移除所有旧版本的 ice 驱动:

    rmmod ice; modprobe ice
    

    注意:
    要在内核日志中启用详细的调试信息,请使用动态调试功能(dyndbg)。更多信息请参阅后文的 动态调试 一节。

  6. 为接口分配 IP 地址,其中 <ethX> 为 modprobe 后 dmesg 中显示的接口名称:

    ip address add <IP地址>/<掩码位数> dev <ethX>
    
  7. 验证接口是否正常工作。输入以下内容,其中 <IP地址> 为与正在测试的接口处于同一子网的另一台机器的 IP 地址:

    ping <IP地址>
    

构建本驱动的二进制 RPM 包

注意: RPM 功能仅在 Red Hat 发行版上做过测试。

  1. 运行以下命令,其中 <x.x.x> 为驱动 tar 包的版本号:

    rpmbuild -tb ice-<x.x.x>.tar.gz
    

    注意:
    为使构建正常工作,当前运行的内核版本和配置必须与已安装的内核源码完全匹配。如果您刚刚重新编译了内核,请在构建前重启系统。

  2. 构建 RPM 后,工具输出的最后几行包含所构建 RPM 文件的位置。使用以下命令之一安装 RPM,其中 <RPM> 为 RPM 文件的位置:

    rpm -Uvh <RPM>
    

    或:

    dnf/yum localinstall <RPM>
    
  3. 如果您的发行版或内核不包含对辅助总线(auxiliary bus)的内置支持,则还必须安装辅助 RPM:

    rpm -Uvh <ice RPM> <辅助 RPM>
    

    或:

    dnf/yum localinstall <ice RPM> <辅助 RPM>
    

    注意:
    在某些发行版上,由于缺少 kernel-devel 头文件,辅助 RPM 可能安装失败。要解决此问题,可在安装时指定 --excludepath。例如:

    rpm -Uvh auxiliary-1.0.0-1.x86_64.rpm --excludepath=/lib/modules/3.10.0-957.el7.x86_64/source/include/linux/auxiliary_bus.h
    

注意:

  • 在某些内核/架构组合上编译驱动时,您可能需要安装 libelf 的开发版软件包(例如 libelf-dev、libelf-devel、elfutils-libelf-devel)。
  • 编译树外驱动时,具体细节因发行版而异。但通常至少需要 kernel-devel RPM 或能提供内核头文件的 RPM。kernel-devel RPM 通常会填充 /lib/modules/$(uname -r)/build 链接。

命令行参数

ice 驱动唯一支持的命令行参数是 debug 参数,用于控制驱动默认的日志详细级别。(注意:dyndbg 同样提供动态调试信息。)

一般来说,驱动加载后请使用 ethtool 和其他特定于操作系统的命令来配置用户可更改的参数。


附加功能与配置

ethtool

驱动使用 ethtool 接口进行驱动配置和诊断,以及显示统计信息。此功能需要最新版本的 ethtool。请从以下地址下载:
https://kernel.org/pub/software/network/ethtool/

查看链路消息

如果发行版限制了系统消息,链路消息将不会显示在控制台上。要在控制台上查看网络驱动链路消息,请将 dmesg 设置为八,输入:

dmesg -n 8

注意: 该设置在重启后不会保留。

动态设备个性化(DDP)

动态设备个性化(DDP)允许您在运行时通过向设备应用配置文件包(profile package)来改变设备的数据包处理流水线。配置文件可用于例如:添加对新协议的支持、修改现有协议或更改默认设置。DDP 配置文件还可以在不重启系统的情况下回滚。

ice 驱动会在驱动安装过程中自动安装默认的 DDP 包文件。

注意:
在首次安装 ice 驱动时务必执行 make install,以便驱动自动加载 DDP 包。

DDP 包在设备初始化期间加载。驱动会在固件根目录(通常为 /lib/firmware/ 或 /lib/firmware/updates/)中查找 intel/ice/ddp/ice.pkg,并检查其中是否包含有效的 DDP 包文件。

如果驱动无法加载 DDP 包,设备将进入安全模式(Safe Mode)。安全模式会禁用高级和性能功能,仅支持基本流量和最小功能集,例如更新 NVM 或下载新驱动/DDP 包。安全模式仅影响受影响的物理功能(PF),不会影响其他 PF。有关 DDP 和安全模式的更多详细信息,请参阅《Intel(R) 以太网适配器与设备用户指南》。

注意:

  • 如果遇到 DDP 包文件问题,您可能需要下载更新版本的驱动或 DDP 包文件。更多信息请参阅日志消息。
  • ice.pkg 文件是指向 Linux-firmware 软件包或 ice 树外驱动安装程序所安装的默认 DDP 包文件的符号链接。
  • 如果任何 PF 驱动已加载,则无法更新 DDP 包。要覆盖某个包,需先卸载所有 PF,然后用新包重新加载驱动。
  • 每台设备上只有第一个加载的 PF 才能为该设备下载包。

您可以在同一系统中为不同的物理设备安装特定的 DDP 包文件。安装特定 DDP 包文件的步骤:

  1. 下载您设备所需的 DDP 包文件。

  2. 将文件重命名为 ice-xxxxxxxxxxxxxxxx.pkg,其中 xxxxxxxxxxxxxxxx 是您希望下载该包的设备的唯一 64 位 PCI Express 设备序列号(十六进制)。文件名必须包含完整序列号(包括前导零),且全部为小写。例如,若 64 位序列号为 b887a3ffffca0568,则文件名为 ice-b887a3ffffca0568.pkg。

    要从 PCI 总线地址查找序列号,可使用以下命令:

    lspci -vv -s af:00.0 | grep -i Serial
    

    输出示例:

    Capabilities: [150 v1] Device Serial Number b8-87-a3-ff-ff-ca-05-68
    

    可使用以下命令将序列号格式化为不带连字符的形式:

    lspci -vv -s af:00.0 | grep -i Serial | awk '{print $7}' | sed s/-//g
    # 输出: b887a3ffffca0568
    
  3. 将重命名后的 DDP 包文件复制到 /lib/firmware/updates/intel/ice/ddp/。如果该目录尚不存在,请在复制前创建。

  4. 卸载该设备上的所有 PF。

  5. 用新包重新加载驱动。

注意: 设备特定 DDP 包文件的存在会覆盖默认 DDP 包文件(ice.pkg)的加载。

RDMA(远程直接内存访问)

远程直接内存访问(RDMA)允许网络设备直接与另一系统上的应用程序内存进行数据传输,在某些网络环境中可以提高吞吐量并降低延迟。

ice 驱动支持以下 RDMA 协议:

  • iWARP(互联网广域 RDMA 协议)
  • RoCEv2(融合以太网上的 RDMA)

两者的主要区别在于:iWARP 基于 TCP 执行 RDMA,而 RoCEv2 使用 UDP。

RDMA 需要辅助总线(auxiliary bus)支持。更多信息请参阅后文的 辅助总线 一节。

基于 Intel(R) 以太网 800 系列的设备在多端口模式下运行且端口数超过 4 个时,不支持 RDMA。

有关 RDMA 的详细安装和配置信息,请参阅 irdma 驱动 tar 包中的 README 文件。

VF 中的 RDMA

基于 Intel(R) 以太网 800 系列的设备在受支持的 Windows 或 Linux 主机上,支持在 Linux VF 中使用 RDMA。

iavf 驱动在 VF 中支持以下 RDMA 协议:

  • iWARP
  • RoCEv2

有关在 VF 中配置 RDMA 的详细信息,请参阅 irdma 驱动 tar 包内的 README。

注意:

  • 要支持 VF RDMA,请在创建 VF 之前在主机上加载 irdma 驱动,否则 VF 与 PF 驱动之间可能不会协商 VF RDMA 支持。
  • 使用链路聚合时,VF 中不提供 RDMA——VIRTCHNL 能力 VIRTCHNL_VF_OFFLOAD_RDMA 会被禁用。

辅助总线

驱动间通信(IDC)是 LAN 驱动(如 ice)与对等驱动(如 irdma)之间通信的机制。从内核 5.11 开始,Intel LAN 和 RDMA 驱动使用辅助总线机制进行 IDC。

RDMA 功能必须使用辅助总线。

  • 如果您的内核支持辅助总线,LAN 和 RDMA 驱动将使用内核自带的辅助总线进行 IDC。
  • 对于低于 5.11 的内核,基础驱动将自动安装树外辅助总线模块。

源地址剪除(Source Pruning)

E800 系列设备默认会剪除源 MAC 地址与目的 MAC 地址相同的数据包。ice 驱动允许您启用或禁用对以太网数据包的源 MAC 地址剪除。您可以在未创建 bond,或配置了使用 ARP 监控的 active-backup 绑定时使用此功能。

使用 ethtool 私有标志 mac-source-pruning 启用或禁用接收数据包上的源 MAC 剪除:

# ethtool --set-priv-flags <ethX> mac-source-pruning on|off

其中:

  • on:丢弃源 MAC 地址与接口源 MAC 地址匹配的数据包(默认)。
  • off:接收源 MAC 地址与接口源 MAC 地址匹配的数据包。

注意: 当将 mac-source-pruning 设置为 off(即禁用剪除)时:

  • 驱动将禁用欺骗检查(spoof check)。
  • 网络接口将接收所有源 MAC 地址与网络接口 MAC 地址匹配的数据包。

ice 驱动还允许在指定 VF 上启用或禁用源剪除,方法是设置 PF 私有标志 vf-source-pruning,并在指定 VF 上设置正确的 spoofchk 和 trust 设置(见下面的示例):

# ethtool --set-priv-flags <ethX> vf-source-pruning on|off

其中:

  • on:丢弃源 MAC 地址与接口源 MAC 地址匹配的数据包(默认)。
  • off:接收源 MAC 地址与接口源 MAC 地址匹配的数据包。

注意: 启用 vf-source-pruning 不会自动设置反欺骗(anti-spoofing)和信任模式,您必须自行完成这些设置。这些步骤可以按任意顺序执行。例如:

# ip link set <ethX> vf <vf id> spoofchk off
# ip link set <ethX> vf <vf id> trust on
# ethtool --set-priv-flag <ethX> vf-source-pruning off

更多信息请参阅本 README 中的 macvlanantispoofing 和 trusted-vf 部分。

NVM Express*(NVMe)over TCP 与 Fabrics

RDMA 提供了一种高吞吐量、低延迟的方式,可直接访问远程服务器上的 NVM Express(NVMe)驱动器。

有关受支持操作系统的详细信息以及服务器和客户端系统的设置配置方法,请参阅以下配置指南:

  • 《Intel(R) 以太网产品 NVM Express over TCP 配置指南》
  • 《支持 RDMA 的 Intel(R) 以太网产品 NVM Express over Fabrics 配置指南》

两份指南均可在 Intel 技术库获取:
https://www.intel.com/content/www/us/en/design/products-and-solutions/networking-and-io/ethernet-controller-e810/technical-library.html


链路聚合(LAG)/bonding 允许将多个物理接口组合起来,以提供冗余,并在某些配置下提高总吞吐量。

链路聚合需要 LAG DDP 包。 驱动安装的默认 DDP 包不支持 LAG。如果您使用自定义 DDP 包,请确保它支持 LAG。

链路聚合与 RDMA

链路聚合(LAG)和 RDMA 仅在以下所有条件都满足时才兼容:

  • 使用的是 Intel 以太网 810 系列设备,且安装了最新的驱动和 NVM。
  • RDMA 技术设置为 RoCEv2。
  • LAG 配置为 active-backup 或 active-active 之一。
  • 绑定的是同一设备内的两个端口。
  • 绑定设备之前,两个端口的 QoS 配置一致。

如果上述条件未满足:

  • PF 驱动将不会启用 RDMA。
  • RDMA 对端将无法向 PF 注册。

注意:
添加到聚合(bond)的第一个接口会被指定为 RDMA 和 LAG 功能的"主"接口。如果 LAN 接口已分配给 bond,而您将主接口从 bond 中移除,RDMA 将无法在绑定接口上正常工作。要解决此问题,请将所有接口从 bond 中移除,然后重新添加。未分配给 bond 的接口将正常运行。

如果 ice 驱动配置为 active-backup 或 active-active LAG:

  • ice 驱动将阻止对绑定端口进行任何 DCB/硬件 QoS 配置更改。
  • 只有主端口可供 RDMA 驱动使用。
  • ice 驱动会通过创建适当的交换规则,将来自次端口的 RoCEv2 流量转发到主端口。

如果 ice 驱动配置为 active-active LAG:

  • ice 驱动将允许 RDMA 驱动为两个活动端口配置 QSet。
  • 活动端口发生故障时,会触发故障转移机制,将队列对(queue pairs)转移到当前活动端口。端口恢复后,RDMA 驱动会将 RDMA QSet 移回最初分配的端口。

注意:
使用链路聚合时,VF 中不提供 RDMA——VIRTCHNL 能力 VIRTCHNL_VF_OFFLOAD_RDMA 会被禁用。

链路聚合与 SR-IOV VF

LAG 与 SR-IOV 仅在以下所有条件都满足时才兼容:

  • bond 处于受支持的模式之一。其余模式与桥不兼容:

    • active-backup (1)
    • balance-xor (2)
    • broadcast (3)
    • 802.3ad (4)
  • bond 恰好由同一 NIC MAC 芯片的两个端口组成。

  • 主端口(第一个加入 bond 的端口)处于 switchdev 模式(见 Switchdev 模式)。

  • 两个 bond 端口的 DCB 配置一致。

  • 两个 bond 端口上的 FW LLDP 代理均已禁用(见 FW-LLDP(固件链路层发现协议))。

  • 已加载 ice_lag DDP 包。

  • 固件支持 LAN VF LAG 能力(最低版本要求):

    设备 active-backup 其他模式
    E810 4.30 4.80
    E83x 系列 1.00 1.20

在 active-backup (1) 以外的模式中,通过队列均衡(queue-balancing)实现流量拆分。每个 VF 的一半队列被配置为在次上行链路活动时使用次上行链路。检测到链路故障时,所有队列会重新配置为使用剩余上行链路。VF 队列与上行链路的关联是确定性的,因此在故障转移后恢复链路时,队列会回到原来的上行链路。

配置 SR-IOV LAG 的步骤:

  1. 在主端口上启用 switchdev 模式:

    devlink dev eswitch set <pci/0000:##:##.#> mode switchdev
    
  2. 创建 SR-IOV VF:

    echo 2 > /sys/class/net/$PF1/device/sriov_numvfs
    
  3. 创建 bond 接口并配置为受支持的模式之一(见上文):

    ip link add bond0 type bond
    ip link set bond0 type bond miimon 100 mode active-backup
    
  4. 将主端口和次端口加入 bond:

    ip link set $PF1 down
    ip link set $PF1 master bond0
    
    ip link set $PF2 down
    ip link set $PF2 master bond0
    
  5. 添加 Linux 网桥,将 bond 和端口 representor 加入网桥:

    ip link add $BR type bridge
    ip link set $BOND master $BR
    ip link set $VF1_PR master $BR
    ip link set $VF2_PR master $BR
    

注:在本例中,$PF1 为主端口,$PF2 为次端口。

同时使用 SR-IOV 和 RDMA 的链路聚合

可以同时使用 SR-IOV VF 和 RDMA。在这种配置下:

  • 不支持网桥(应配置 tc 过滤器以实现 VF 连通性——见 Switchdev 模式)。

  • 应在次上行链路上启用混杂模式(promiscuous mode):

    ip link set promisc on $PF2
    

应用设备队列(ADQ)

应用设备队列(ADQ)允许您将一个或多个队列专用于特定应用。这可以降低指定应用的延迟,并允许按应用限制 Tx 流量速率。

此处包含的 ADQ 信息特定于 ice 驱动。更多详情请参阅 E810 ADQ 配置指南:
https://cdrdv2.intel.com/v1/dl/getContent/609008

要求:

  • 内核版本:因功能而异。不同 ADQ 功能所需的内核版本请参阅 E810 ADQ 配置指南。

  • 操作系统:Red Hat* Enterprise Linux* 7.5+ 或 SUSE* Linux Enterprise Server* 12+

  • 最新的 ice 驱动和 NVM 映像(注意:您必须按编译与安装一节所示,使用 ADQ 标志编译 ice 驱动。)

  • 必须加载 sch_mqprio、act_mirred 和 cls_flower 模块。例如:

    modprobe sch_mqprio
    modprobe act_mirred
    modprobe cls_flower
    
  • 最新版本的 iproute2。推荐以下安装方法:

    cd iproute2
    ./configure
    make DESTDIR=/opt/iproute2 install
    ln -s /opt/iproute2/sbin/tc /usr/local/sbin/tc
    

启用 ADQ 时:

  • 您无法在 PF 或 VF 中更改 RSS 参数、队列数量或 MAC 地址。更改这些设置前请先删除 ADQ 配置。
  • 驱动支持 PF 和 VF 中 IP 地址的子网掩码。添加子网掩码过滤器后,驱动会将数据包转发到 ADQ VSI,而不是主 VSI。
  • 当 PF 为 VF 添加或删除端口 VLAN 过滤器时,它会延伸到该 VF 内的所有 VSI。
  • 驱动支持 PF 中的 ADQ 和 GTP 过滤器。注意:您必须拥有支持 GTP 的 DDP 包;默认操作系统包不支持。请从硬件供应商处下载适当的包并加载到设备上。
  • ADQ 允许包含任何目的 MAC 地址的 tc 入口过滤器。
  • 每个 PF 最多可配置 256 个队列对(256 个 MSI-X 中断)。

有关配置过滤器的更多信息(包括示例),请参阅本 README 中的 创建流量类过滤器 一节。详细说明请参阅 E810 ADQ 配置指南。

ADQ 已知问题:

  • 最新的 RHEL 和 SLES 发行版内核已回填(backport)ADQ 支持。对于所有其他 Linux 发行版,必须使用 LTS Linux 内核 v4.19.58 或更高版本才能使用 ADQ。所有操作系统上使用 ADQ 都需要最新的树外驱动。

  • 您必须按初始配置步骤的相反顺序清除 ADQ 配置。如果未按正确顺序执行清除 ADQ 配置的步骤,可能会导致问题。

  • 不支持在绑定(bonded)或组合(teamed)的 ice 接口上配置 ADQ。对绑定 ice 接口执行 ethtool 或 tc 命令将导致 ice 驱动报错,提示不支持该操作。

  • 如果应用程序停滞,特定于应用的队列可能会停滞长达两秒。每个流量类(TC)通道仅配置一个应用可能可以解决此问题。

  • DCB 和 ADQ 无法共存。 启用 DCB 的交换机可能会从设备中移除 ADQ 配置。要解决此问题,请勿在用于 ADQ 的交换机端口上启用 DCB。您必须禁用接口上的 LLDP,并使用以下命令停止固件 LLDP 代理:

    ethtool --set-priv-flags <ethX> fw-lldp-agent off
    
  • MACVLAN 卸载和 ADQ 互斥。如果先启用 l2-fwd-offload 再设置 ADQ,或先设置 ADQ 再启用 l2-fwd-offload,可能会导致系统不稳定。

  • 注意(与 Intel 驱动无关):Linux 内核 5.8.0 版本引入了一个 bug,破坏了中断亲和性设置机制,从而破坏了将中断固定到 ADQ 硬件队列的能力。请使用更早或更晚版本的内核。

  • 配置了 ADQ 的 PF 端口发生核心级复位(罕见事件,通常由设备或 ice 驱动中的其他故障触发)会导致 ADQ 配置丢失。要恢复,请重新将 ADQ 配置应用到 PF 接口。

  • tc qdisc add 和 ethtool -L 等命令会导致驱动关闭关联的 RDMA 接口并重新打开。这将中断 RDMA 流量 3-5 秒,直到 RDMA 接口再次可用于流量。

  • tc qdisc add 和 ethtool -L 等命令会清除其他调优设置,例如中断亲和性。这些调优设置需要重新应用。当使用 ethtool -L 增加队列数量时,新队列将具有与队列 0 相同的中断调节设置(即新 Tx 队列采用 Tx 队列 0 的设置,新 Rx 队列采用 Rx 队列 0 的设置)。您可以使用 ethtool 的 per-queue coalesce 命令更改此设置。

  • 如果在发出 tc qdisc add 命令后立即应用 TC 过滤器,TC 过滤器可能无法卸载到硬件。建议您在发出 tc qdisc add 后等待 5 秒再添加 TC 过滤器。如果 TC 过滤器添加失败,dmesg 会报告错误。

为 ADQ 设置适配器的步骤(其中 <ethX> 为正在使用的接口):

  1. 重新加载 ice 驱动以移除任何先前的 TC 配置:

    rmmod ice
    modprobe ice
    
  2. 在接口上启用硬件 TC 卸载:

    ethtool -K <ethX> hw-tc-offload on
    
  3. 如果尚未禁用,请禁用接口上的 LLDP:

    ethtool --set-priv-flags <ethX> fw-lldp-agent off
    
  4. 验证设置:

    ethtool -k <ethX> | grep "hw-tc"
    ethtool --show-priv-flags <ethX>
    

Intel 还提供了一个用于配置 ADQ 的脚本。该脚本允许您配置 ADQ 特有参数,例如流量类、优先级、过滤器和 ethtool 参数。

更多信息请参阅驱动 tar 包中 scripts/adqsetup 内的 README.md 文件。

该脚本和 README 也可在 Python 包索引(PyPI)获取:https://pypi.org/project/adqsetup

ice 驱动支持使用独立轮询器(independent pollers)进行 ADQ 加速。独立轮询器是由中断调用的内核线程,代表应用程序进行忙轮询(busy polling)。

您可以使用 devlink dev param 接口为每个 ADQ 流量类(TC)或队列组配置每个轮询器的队列数和轮询器超时时间。

设置每个轮询器的队列对数量:

devlink dev param set <pci/D:b:d.f> name tc<x>_qps_per_poller value <num> cmode runtime

其中:

  • <pci/D:b:d.f>:设备的 PCI 地址(pci/Domain🚌device.function)。
  • tc<x>:流量类编号。
  • <num>:每个轮询器轮询的对应流量类的队列数。

设置独立轮询器的超时时间:

devlink dev param set <pci/D:b:d.f> name tc<x>_poller_timeout value <num> cmode runtime

其中:

  • <pci/D:b:d.f>:设备的 PCI 地址。
  • tc<x>:流量类编号。
  • <num>:以 jiffies 为单位的非零整数值。

例如:

  • 配置 TC1 的 3 个队列由每个独立轮询器轮询:

    devlink dev param set pci/0000:3b:00.0 name tc1_qps_per_poller value 3 cmode runtime
    
  • 设置 TC1 在无流量时的超时值(jiffies):

    devlink dev param set pci/0000:3b:00.0 name tc1_poller_timeout value 1000 cmode runtime
    

ice 树外驱动允许您使用 devlink 接口为每个流量类(TC)配置内联 Intel(R) 以太网流量导向器(Intel(R) Ethernet FD)过滤器。内联 Intel 以太网 FD 允许在 TC 内的队列之间均匀分配流。

注意:

  • 此功能需要 Linux 内核 5.6 或更新版本,且仅支持树外 ice 驱动。
  • 您必须启用基于接收队列的传输数据包导向(XPS),此功能才能正常工作。
  • 通过 devlink 设置的 per-TC 过滤器与通过 ethtool 设置的 Intel 以太网 FD 过滤器不兼容。

配置内联 Intel 以太网 FD 过滤器的命令:

devlink dev param set <pci/D:b:d.f> name tc<x>_inline_fd value <setting> cmode runtime

其中:

  • <pci/D:b:d.f>:设备的 PCI 地址。
  • tc<x>:流量类编号。
  • <setting>:设置为 true 以启用内联 per-TC Intel 以太网 FD,或 false 以禁用它。

例如,为 TC1 启用内联 Intel 以太网 FD:

devlink dev param set pci/0000:af:00.0 name tc1_inline_fd value true cmode runtime

查看当前的内联 Intel 以太网 FD 设置:

devlink dev param show <pci/D:b:d.f> name tc<x>_inline_fd

例如,查看指定设备 TC2 的内联 Intel 以太网 FD 设置:

devlink dev param show pci/0000:af:00.0 name tc2_inline_fd

创建流量类(Traffic Classes)

注意:

  • 以下说明并非 ADQ 配置专用。有关创建流量类(TC)的更多信息,请参阅 tc 和 tc-flower 手册页。
  • 使用 tc 命令添加过滤器前,请禁用 FW-LLDP。有关禁用 FW-LLDP 的信息,请参阅本 README 中的 FW-LLDP 一节。

在接口上创建流量类:

  1. 使用 tc 命令创建流量类。每个接口最多可创建 16 个 TC:

    tc qdisc add dev <ethX> root mqprio num_tc <tcs> map <priorities> \
      queues <count1@offset1 ...> hw 1 mode channel shaper bw_rlimit \
      min_rate <min_rate1 ...> max_rate <max_rate1 ...>
    

    其中:

    • num_tc <tcs>:要使用的 TC 数量。
    • map <priorities>:优先级到 TC 的映射。最多可将 16 个优先级映射到 TC。
    • queues <count1@offset1 ...>:对于每个 TC,格式为 <队列数>@<偏移量>。所有 TC 的队列总数上限为核心数。
    • hw 1 mode channel:channel 配合 hw 设为 1 是 mqprio 中的一种新硬件卸载模式,可充分利用 mqprio 选项、TC、队列配置和 QoS 参数。
    • shaper bw_rlimit:为每个 TC 设置最小和最大带宽速率。总和必须等于或小于端口速率。此参数为可选项,仅在需要设置 Tx 速率时才需要。
    • min_rate <min_rate1>:为每个 TC 设置最小带宽速率限制。
    • max_rate <max_rate1 ...>:为每个 TC 设置最大带宽速率限制。可以同时设置最小速率和最大速率。

    注意:

    • 如果将 max_rate 设置为小于 50Mbps,则 max_rate 将向上取整为 50Mbps,并在 dmesg 中记录一条警告。
    • 更多信息请参阅 mqprio 手册页和下面的示例。
  2. 使用 ifstat 或 sar -n DEV [interval] [number of samples] 等网络监控工具验证带宽限制。

    注意:
    使用 mqprio 配置 TC 时,不支持通过 ethtool(ethtool -L)设置通道。

  3. 在接口上启用硬件 TC 卸载:

    ethtool -K <ethX> hw-tc-offload on
    
  4. 添加 clsact qdisc 以启用 Rx/Tx 的入口/出口过滤器:

    tc qdisc add dev <ethX> clsact
    
  5. 创建 qdisc 后,验证 TC 是否创建成功:

    tc qdisc show dev <ethX> ingress
    

流量类示例:

有关流量控制(TC)和 TC flower 过滤器的更多信息,请参阅 tc 和 tc-flower 手册页。

  • 设置两个 TC(tc0 和 tc1),每个 TC 16 个队列,优先级 0-3 用于 tc0,优先级 4-7 用于 tc1,tc0 最大 Tx 速率设置为 1Gbit,tc1 为 3Gbit:

    tc qdisc add dev ens4f0 root mqprio num_tc 2 map 0 0 0 0 1 1 1 1 \
      queues 16@0 16@16 hw 1 mode channel shaper bw_rlimit max_rate 1Gbit 3Gbit
    

    其中:

    • map 0 0 0 0 1 1 1 1:将优先级 0-3 设置为使用 tc0,优先级 4-7 使用 tc1。
    • queues 16@0 16@16:为 tc0 在偏移 0 处分配 16 个队列,为 tc1 在偏移 16 处分配 16 个队列。
  • 启用 ADQ 时,创建 8 个 TC,256 个队列分布在所有 TC 上:

    tc qdisc add dev <ethX> root mqprio num_tc 8 map 0 1 2 3 4 5 6 7 \
      queues 2@0 4@2 8@6 16@14 32@30 64@62 128@126 2@254 hw 1 mode channel
    
  • 为 TC 设置最小速率:

    tc qdisc add dev ens4f0 root mqprio num_tc 2 map 0 0 0 0 1 1 1 1 \
      queues 4@0 8@4 hw 1 mode channel shaper bw_rlimit min_rate 25Gbit 50Gbit
    
  • 为 TC 设置最大速率:

    tc qdisc add dev ens4f0 root mqprio num_tc 2 map 0 0 0 0 1 1 1 1 \
      queues 4@0 8@4 hw 1 mode channel shaper bw_rlimit max_rate 25Gbit 50Gbit
    
  • 同时设置最小和最大速率:

    tc qdisc add dev ens4f0 root mqprio num_tc 2 map 0 0 0 0 1 1 1 1 \
      queues 4@0 8@4 hw 1 mode channel shaper bw_rlimit \
      min_rate 10Gbit 20Gbit max_rate 25Gbit 50Gbit
    

创建流量类过滤器

注意:

  • 以下说明并非 ADQ 配置专用。
  • 使用 tc 命令添加过滤器前,请禁用 FW-LLDP。有关信息请参阅本 README 中的 FW-LLDP 一节。

创建流量类后,使用 tc 命令为流量创建过滤器。更多信息请参阅 tc 和 tc-flower 手册页。

查看所有 TC 过滤器:

tc filter show dev <ethX> ingress
tc filter show dev <ethX> egress

有关 Intel 以太网 800 系列设备 switchdev 模式下详细配置信息、支持的字段和示例代码,请参阅配置指南:
https://edc.intel.com/content/www/us/en/design/products/ethernet/appnote-e810-eswitch-switchdev-mode-config-guide/

TC 过滤器示例:

配置 TCP TC 过滤器,其中各参数含义:

  • protocol:封装协议(有效选项为 IP 和 802.1Q)。

  • prio:优先级。

  • flower:基于流量的流量控制过滤器。

  • dst_ip:设备的 IP 地址。

  • ip_proto:要使用的 IP 协议(TCP 或 UDP)。

  • dst_port:目的端口。

  • src_port:源端口。

  • skip_sw:仅在硬件中添加规则的标志。

  • hw_tc:将传入流量流路由到此硬件 TC。TC 计数从 0 开始。例如 hw_tc 1 表示过滤器位于第二个 TC 上。

  • vlan_id:VLAN ID。

  • TCP:目的 IP + L4 目的端口

    将目的 IP 地址和目的端口匹配的传入 TCP 流量路由到给定 TC:

    tc filter add dev <ethX> protocol ip ingress prio 1 flower \
      dst_ip <ip_address> ip_proto tcp dst_port <port_number> skip_sw hw_tc 1
    
  • TCP:源 IP + L4 源端口

    将源 IP 地址和源端口匹配的传出 TCP 流量路由到与给定优先级关联的 TC:

    tc filter add dev <ethX> protocol ip egress prio 1 flower \
      src_ip <ip_address> ip_proto tcp src_port <port_number> action skbedit priority 1
    
  • TCP:目的 IP + L4 目的端口 + VLAN 协议

    使用 VLAN 协议(802.1Q)将目的 IP 地址和目的端口匹配的传入 TCP 流量路由到给定 TC:

    tc filter add dev <ethX> protocol 802.1Q ingress prio 1 flower \
      dst_ip <ip_address> eth_type ipv4 ip_proto tcp dst_port <port_number> \
      vlan_id <vlan_id> skip_sw hw_tc 1
    
  • 添加 GTP 过滤器:

    tc filter add dev <ethX> protocol ip parent ffff: prio 1 flower \
      src_ip 16.0.0.0/16 ip_proto udp dst_port 5678 enc_dst_port 2152 \
      enc_key_id <tunnel_id> skip_sw hw_tc 1
    

    其中:

    • dst_port:应用的内层目的端口(5678)。
    • enc_dst_port:外层目的端口(GTP 用户数据隧道使用 UDP 端口 2152)。
    • enc_key_id:隧道 ID(vxlan ID)。

注意:
您可以向设备添加多个过滤器,使用相同的配方(recipe)(无需额外配方资源),可以在同一接口或不同接口上。每个过滤器使用相同的字段进行匹配,但可以具有不同的匹配值。

tc filter add dev <ethX> protocol ip ingress prio 1 flower \
ip_proto tcp dst_port <port_number> skip_sw hw_tc 1

tc filter add dev <ethX> protocol ip egress prio 1 flower \
ip_proto tcp src_port <port_number> action skbedit priority 1

例如:

tc filter add dev ens4f0 protocol ip ingress prio 1 flower \
ip_proto tcp dst_port 5555 skip_sw hw_tc 1

tc filter add dev ens4f0 protocol ip egress prio 1 flower \
ip_proto tcp src_port 5555 action skbedit priority 1

使用 TC 过滤器转发到队列

ice 驱动支持根据数据包中的 L2/L3/L4 字段将流量定向到特定的 Rx 队列,使用 TC 过滤器的类 ID(class ID)。

注意:

  • 此功能可在使用或不使用 ADQ 的情况下使用。
  • 使用 tc 命令添加过滤器前,请禁用 FW-LLDP。有关信息请参阅本 README 中的 FW-LLDP 一节。

为目标队列添加过滤器的命令:

tc filter add dev <ethX> ingress prio 1 protocol all flower \
  src_mac <mac_address> skip_sw classid ffff:<queue_id>

其中:

  • <mac_address>:您希望定向到 Rx 队列的 MAC 地址。
  • <queue_id>:Rx 队列 ID 号(十六进制)。

例如,将单个 MAC 地址定向到队列 10:

ethtool -K ens801 hw-tc-offload on
tc qdisc add dev ens801 clsact
tc filter add dev ens801 ingress prio 1 protocol all flower \
  src_mac 68:dd:ac:dc:19:00 skip_sw classid ffff:b

将 4 个源 MAC 地址定向到 Rx 队列 10-13:

ethtool -K ens801 hw-tc-offload on
tc qdisc add dev ens801 clsact
tc filter add dev ens801 ingress prio 1 protocol all flower \
  src_mac 68:dd:ac:dc:19:00 skip_sw classid ffff:b
tc filter add dev ens801 ingress prio 1 protocol all flower \
  src_mac 68:dd:ac:dc:19:01 skip_sw classid ffff:c
tc filter add dev ens801 ingress prio 1 protocol all flower \
  src_mac 68:dd:ac:dc:19:02 skip_sw classid ffff:d
tc filter add dev ens801 ingress prio 1 protocol all flower \
  src_mac 68:dd:ac:dc:19:03 skip_sw classid ffff:e

Intel(R) 以太网流量导向器(Intel(R) Ethernet Flow Director)

Intel(R) 以太网流量导向器(Intel(R) Ethernet FD)执行以下任务:

  • 根据流将接收数据包导向不同的队列。
  • 实现对平台中路由的流的紧密控制。
  • 匹配流和 CPU 核心以实现流亲和性。

注意: 附带的脚本 set_irq_affinity 可自动设置 IRQ 到 CPU 的亲和性。

本驱动支持以下流类型:

  • IPv4
  • TCPv4
  • UDPv4
  • SCTPv4
  • IPv6
  • TCPv6
  • UDPv6
  • SCTPv6

每种流类型支持 IP 地址(源或目的)和 UDP/TCP/SCTP 端口(源和目的)的有效组合。您可以仅提供源 IP 地址、源 IP 地址加目的端口,或这四个参数中一个或多个的任意组合。

注意:
本驱动允许您使用 ethtool 的 user-def 和 mask 字段,基于用户定义的灵活两字节模式和偏移量过滤流量。用户定义的灵活过滤器仅支持 L3 和 L4 流类型。对于给定的流类型,更改输入集(input set)之前,必须先清除该流类型的所有 Intel 以太网流量导向器过滤器。

Intel 以太网流量导向器过滤器仅影响 LAN 流量。RDMA 过滤发生在 Intel 以太网流量导向器之前,因此 Intel 以太网流量导向器过滤器不会影响 RDMA。

有关 Intel 以太网控制器支持的 Intel 以太网流量导向器功能的汇总表,请参阅《Intel(R) 以太网适配器与设备用户指南》。


Intel 以太网流量导向器过滤器

Intel 以太网流量导向器过滤器用于导向匹配指定特征的流量。通过 ethtool 的 ntuple 接口启用。启用或禁用 Intel 以太网流量导向器及这些过滤器:

ethtool -K <ethX> ntuple <off|on>

注意:
禁用 ntuple 过滤器时,所有用户编程的过滤器将从驱动缓存和硬件中清除。重新启用 ntuple 时,必须重新添加所有需要的过滤器。

显示所有活动过滤器:

ethtool -u <ethX>

添加新过滤器:

ethtool -U <ethX> flow-type <type> src-ip <ip> [m <ip_mask>] \
  dst-ip <ip> [m <ip_mask>] src-port <port> [m <port_mask>] \
  dst-port <port> [m <port_mask>] action <queue>

其中:

  • <ethX>:要编程的以太网设备。

  • <type>:可以是 ip4、tcp4、udp4、sctp4、ip6、tcp6、udp6、sctp6。

  • <ip>:要匹配的 IP 地址。

  • <ip_mask>:用于掩码的 IPv4 地址。

    注意: 这些过滤器使用反掩码(inverted mask)。反掩码中 0 表示精确匹配,0xF 表示任意(DON'T CARE)。更多详情请参阅下面的示例。

  • <port>:要匹配的端口号。

  • <port_mask>:用于掩码的 16 位整数。

    注意: 这些过滤器使用反掩码。

  • <queue>:要将流量定向到的队列(-1 表示丢弃匹配的流量)。

删除过滤器:

ethtool -U <ethX> delete <N>

其中 <N> 是打印所有活动过滤器时显示的过滤器 ID,也可能是在添加过滤器时使用 loc <N> 指定的 ID。

示例:

添加一个将数据包定向到队列 2 的过滤器:

ethtool -U <ethX> flow-type tcp4 src-ip 192.168.10.1 dst-ip \
  192.168.10.2 src-port 2000 dst-port 2001 action 2 [loc 1]

仅使用源和目的 IP 地址设置过滤器:

ethtool -U <ethX> flow-type tcp4 src-ip 192.168.10.1 dst-ip \
  192.168.10.2 action 2 [loc 1]

基于用户定义的模式和偏移量设置过滤器,其中 user-def 字段的值包含偏移量(4 字节)和模式(0xffff):

ethtool -U <ethX> flow-type tcp4 src-ip 192.168.10.1 dst-ip \
  192.168.10.2 user-def 0x4FFFF action 2 [loc 1]

匹配从 192.168.0.1 端口 5300 发送到 192.168.0.5 端口 80 的 TCP 流量,并将其发送到队列 7:

ethtool -U enp130s0 flow-type tcp4 src-ip 192.168.0.1 dst-ip 192.168.0.5 \
  src-port 5300 dst-port 80 action 7

添加带有源 IP 子网部分掩码的 TCPv4 过滤器。这里匹配的 src-ip 为 192.*.*.*(反掩码):

ethtool -U <ethX> flow-type tcp4 src-ip 192.168.0.0 m 0.255.255.255 \
  dst-ip 192.168.5.12 src-port 12600 dst-port 31 action 12

注意:

  • 对于每种流类型,编程的过滤器必须具有相同的匹配输入集。例如,发出以下两条命令是可以接受的:

    ethtool -U enp130s0 flow-type ip4 src-ip 192.168.0.1 src-port 5300 action 7
    ethtool -U enp130s0 flow-type ip4 src-ip 192.168.0.5 src-port 55 action 10
    

    但是,发出接下来两条命令则不可接受,因为第一条指定了 src-ip 而第二条指定了 dst-ip:

    ethtool -U enp130s0 flow-type ip4 src-ip 192.168.0.1 src-port 5300 action 7
    ethtool -U enp130s0 flow-type ip4 dst-ip 192.168.0.5 src-port 55 action 10
    

    第二条命令将失败并报错。您可以使用相同的字段、不同的值编程多个过滤器,但在一台设备上,不能编程两个匹配字段不同的 tcp4 过滤器。

  • ice 驱动不支持匹配字段的子部分,因此不支持部分掩码字段。

  • IPv4 过滤器类型不会匹配 TCP、UDP 或 SCTP 流量。要匹配这些类型的流量,请分别为 TCP、UDP 和 SCTP 创建过滤器,或使用其他类型的过滤。


灵活字节(Flex Byte)Intel 以太网流量导向器过滤器

驱动还支持匹配数据包负载中的用户定义数据。此灵活数据使用 ethtool 命令的 user-def 字段按以下方式指定:

+----------------------------+--------------------------+
| 31    28    24    20    16 | 15    12    8    4    0  |
+----------------------------+--------------------------+
| 数据包负载中的偏移量        | 2 字节的灵活数据          |
+----------------------------+--------------------------+

例如:

... user-def 0x4FFFF ...

告诉过滤器从负载开始偏移 4 字节处查找,并将该值与 0xFFFF 匹配。偏移量基于负载的起始位置,而不是数据包的起始位置。因此:

flow-type tcp4 ... user-def 0x8BEAF ...

将匹配在 TCP/IPv4 负载中偏移 8 字节处值为 0xBEAF 的 TCP/IPv4 数据包。

注意,ICMP 头被解析为 4 字节头部和 4 字节负载。因此要匹配负载的第一个字节,您实际上需要在偏移量上加 4。另请注意,ip4 过滤器同时匹配 ICMP 帧和原始(未知)ip4 帧,其中负载将是 IP4 帧的 L3 负载。

最大偏移量为 64。硬件最多只从负载中读取 64 字节的数据。偏移量必须为偶数,因为灵活数据长 2 字节,必须与数据包负载的第 0 字节对齐。

用户定义的灵活偏移量也被视为输入集的一部分,不能为同一类型的多个过滤器分别编程。但是,灵活数据不是输入集的一部分,多个过滤器可以使用相同的偏移量,但匹配不同的数据。


RSS 哈希流

允许您为每种流类型设置哈希字节,以及接收端缩放(RSS)哈希字节配置的任意一个或多个选项的组合。

ethtool -N <ethX> rx-flow-hash <type> <option>

其中 <type> 为:

  • tcp4:表示 TCP over IPv4
  • udp4:表示 UDP over IPv4
  • tcp6:表示 TCP over IPv6
  • udp6:表示 UDP over IPv6

<option> 为一个或多个:

  • s:对 Rx 数据包的 IP 源地址进行哈希。
  • d:对 Rx 数据包的 IP 目的地址进行哈希。
  • f:对 Rx 数据包的 L4 头字节 0 和 1 进行哈希。
  • n:对 Rx 数据包的 L4 头字节 2 和 3 进行哈希。

例如,要对 TCP IPv4 流量的源和目的 IP 地址进行哈希,使用:

ethtool -N <ethX> rx-flow-hash tcp4 sd

要对 UDP IPv6 流量的源和目的端口进行哈希:

ethtool -N <ethX> rx-flow-hash udp6 sdfn

加速接收流导向(aRFS)

基于 Intel(R) 以太网 800 系列的设备在 PF 上支持加速接收流导向(Accelerated Receive Flow Steering,aRFS)。aRFS 是一种负载均衡机制,允许您将数据包定向到运行或使用该流的同一 CPU。

  • aRFS 要求通过 ethtool 启用 ntuple 过滤。
  • aRFS 支持仅限于以下数据包类型:
    • TCP over IPv4 和 IPv6
    • UDP over IPv4 和 IPv6
    • 非分片数据包
  • aRFS 仅支持 Intel 以太网流量导向器过滤器,由源/目的 IP 地址和源/目的端口组成。
  • aRFS 和 ethtool 的 ntuple 接口都使用设备的 Intel 以太网流量导向器。aRFS 和 ntuple 功能可以共存,但如果 aRFS 和 ntuple 请求之间存在冲突,可能会遇到意外结果。更多信息请参阅 Intel(R) 以太网流量导向器 一节。

设置 aRFS:

  1. 使用 ethtool 启用 Intel 以太网流量导向器和 ntuple 过滤器:

    ethtool -K <ethX> ntuple on
    
  2. 设置全局流表中的条目数。例如:

    NUM_RPS_ENTRIES=16384
    echo $NUM_RPS_ENTRIES > /proc/sys/net/core/rps_sock_flow_entries
    
  3. 设置每个队列流表中的条目数。例如:

    NUM_RX_QUEUES=64
    for file in /sys/class/net/$IFACE/queues/rx-*/rps_flow_cnt; do
      echo $(($NUM_RPS_ENTRIES/$NUM_RX_QUEUES)) > $file;
    done
    
  4. 禁用 IRQ 平衡守护进程(这只是临时停止服务,直到下次重启):

    systemctl stop irqbalance
    
  5. 配置中断亲和性:

    set_irq_affinity <ethX>
    

使用 ethtool 禁用 aRFS:

ethtool -K <ethX> ntuple off

注意:
此命令将禁用 ntuple 过滤器,并清除软件和硬件中的所有 aRFS 过滤器。

示例用例:

  1. 将服务器应用设置在所需的 CPU 上(例如 CPU 4):

    taskset -c 4 netserver
    
  2. 使用 netperf 将流量从客户端路由到配置了 aRFS 的服务器上的 CPU 4。本示例使用 TCP over IPv4:

    netperf -H <主机 IPv4 地址> -t TCP_STREAM
    

为 SR-IOV 启用虚拟功能(VF)

使用 sysfs 启用虚拟功能(VF)。

例如,您可以按如下方式创建 4 个 VF:

echo 4 > /sys/class/net/<ethX>/device/sriov_numvfs

要禁用 VF,向同一文件写入 0:

echo 0 > /sys/class/net/<ethX>/device/sriov_numvfs

ice 驱动的最大 VF 数量为 256 个(所有端口总计)。要检查每个 PF 支持多少个 VF,使用:

cat /sys/class/net/<ethX>/device/sriov_totalvfs

注意: VF 驱动不会阻止 teaming/bonding/链路聚合,但这不是受支持的功能。请勿期望 VF 接口上实现故障转移或负载均衡。


SR-IOV 实时迁移(Live Migration)

您可以使用 VFIO 设备迁移(VFIO Device Migration)在活动虚拟机(VM)之间移动,而不会丢失网络连接。迁移后,虚拟功能(VF)将在不中断的情况下继续大部分以太网操作。在迁移期间,数据和 VIRTCHNL 操作会被发送到缓冲区,以便在迁移完成后重新创建。如果分配的命令缓冲区内存被超出,系统将丢弃缓冲区并禁用该 VF 的实时迁移能力。您必须重置 VF 才能重新启用实时迁移。

  • 实时迁移需要内核版本 5.15 到 5.17。
  • 如果 VF 正在使用 RDMA,则无法迁移虚拟机。
  • 您只能将 VF 迁移到同系列且固件版本相近的设备。例如,可以将 VF 从一台 810 设备迁移到另一台 810 设备,但不能从 810 设备迁移到 820 设备。
  • PF 设置的任何 VF 属性都不会被迁移。请确保两台设备具有相同的 PF 设置属性。

更多详情请参阅:https://qemu.readthedocs.io/en/latest/devel/vfio-migration.html


在 PF 上显示 VF 统计信息

使用以下命令显示 PF 及其 VF 的统计信息:

ip -s link show dev <ethX>

注意: 由于可能的 VF 数量上限很大,此命令的输出可能非常大。

PF 驱动将显示 PF 和所有已配置 VF 的部分统计信息。PF 将始终为每个可能的 VF 打印一个统计信息块,对于所有未配置的 VF 显示为零。


在 SR-IOV 启用端口上配置 VLAN 标记

要为启用了 SR-IOV 的适配器端口配置 VLAN 标记,请使用以下命令。VLAN 配置应在加载 VF 驱动或启动虚拟机之前完成。VF 不知道在发送帧上插入并在接收帧上移除的 VLAN 标记(有时称为"端口 VLAN"模式)。

ip link set dev <ethX> vf <id> vlan <vlan id>

例如,以下命令将 PF eth0 和第一个 VF 配置到 VLAN 10:

ip link set dev eth0 vf 0 vlan 10

端口断开时启用 VF 链路

如果物理功能(PF)链路断开,您可以在绑定到该 PF 的任何虚拟功能(VF)上强制启用链路(从主机 PF)。请注意,这需要内核支持(Red Hat 内核 3.10.0-327 或更新版本,上游内核 3.11.0 或更新版本)以及相关的 iproute2 用户空间支持。

例如,强制启用绑定到 PF eth0 的 VF 0 的链路:

ip link set eth0 vf 0 state enable

注意: 如果命令不生效,可能是您的系统不支持。


设置 VF 的 MAC 地址

要更改指定 VF 的 MAC 地址:

ip link set <ethX> vf 0 mac <address>

例如:

ip link set <ethX> vf 0 mac 00:01:02:03:04:05

此设置持续到 PF 重新加载为止。

注意: 对于不受信任的 VF,从主机为 VF 分配 MAC 地址将禁用来自 VM 内部的任何后续 MAC 地址更改请求。这是一项安全功能。VM 不知道此限制,因此如果在 VM 中尝试此操作,将触发 MDD 事件。受信任的 VF 允许从 VM 内部更改 MAC 地址。


受信任的 VF 与 VF 混杂模式

此功能允许您将特定 VF 指定为受信任的(trusted),并允许该受信任的 VF 在物理功能(PF)上请求选择性混杂模式。

在 Hypervisor 中设置 VF 为受信任或不受信任:

ip link set dev <ethX> vf 1 trust [on|off]

注意: 务必在设置混杂模式之前将 VF 设置为受信任。如果 VM 不受信任,PF 将忽略来自 VF 的混杂模式请求。如果在 VF 驱动加载后才将 VM 设为受信任,您必须重新发出请求以将 VF 设置为混杂模式。

VF 被指定为受信任后,在 VM 中使用以下命令将 VF 设置为混杂模式:

  • 全部混杂模式,其中 <ethX> 为 VM 中的 VF 接口:

    ip link set <ethX> promisc on
    
  • 组播混杂模式:

    ip link set <ethX> allmulticast on
    

注意:
默认情况下,ethtool 私有标志 vf-true-promisc-support 设置为 off,意味着 VF 的混杂模式将是受限的。要将 VF 的混杂模式设置为真正的混杂模式并允许 VF 看到所有入口流量,使用:

ethtool --set-priv-flags <ethX> vf-true-promisc-support on

vf-true-promisc-support 私有标志并不启用混杂模式;它指定当您使用上述 ip link 命令启用混杂模式时获得哪种类型的混杂模式(受限或真正)。您可以为所有 PF 单独切换 vf-true-promisc-support 标志。

接下来,在 VF 接口上添加 VLAN 接口。例如:

ip link add link eth2 name eth2.100 type vlan id 100

注意,将 VF 设置为混杂模式和添加 VLAN 接口的顺序无关紧要(可以任意先做哪一个)。在本示例中,结果是 VF 将获得所有标记为 VLAN 100 的流量。


VF 上的 LLDP 支持

ice 驱动支持在 VF 上使用链路层发现协议(LLDP)。

注意: 您必须禁用端口上基于固件的 LLDP 代理,才能在 VF 上使用 LLDP 数据包。禁用方法请参阅本 README 中的 FW-LLDP 一节。

当 FW-LLDP 代理被禁用时:

  • 驱动允许受信任的 VF 配置包含 LLDP 组播地址的 L2 过滤器。设置 VF 为受信任的方法请参阅本 README 中的 受信任的 VF 与 VF 混杂模式 一节。
  • 在 switchdev 模式下,您可以使用 tc-flower 命令配置包含 LLDP 组播地址的 L2 过滤器。更多信息请参阅本 README 中的 Switchdev 模式 一节。
  • ice 驱动使用 sysfs 中的 transmit_lldp 参数启用 VF 发送 LLDP 数据包。

每个端口只允许一个 VF 发送 LLDP 数据包。PF 不允许发送 LLDP 数据包。

在 PF 上启用 VF 的 LLDP 发送:

echo 1 > /sys/bus/pci/devices/<VF 的 PCI 设备 ID>/transmit_lldp

例如:

echo 1 > /sys/bus/pci/devices/0000:ad:01.0/transmit_lldp

要在其他端口上启用 transmit_lldp,必须先在原端口上禁用它。例如,如果它已在 0000:ad:01.0 上启用,而您想将其更改为端口 0000:ad:01.1:

echo 1 > /sys/bus/pci/devices/0000:ad:01.0/transmit_lldp
echo 0 > /sys/bus/pci/devices/0000:ad:01.0/transmit_lldp   # 在此端口上禁用它
echo 1 > /sys/bus/pci/devices/0000:ad:01.1/transmit_lldp

虚拟功能(VF)Tx 速率限制

使用 ip 命令从 PF 接口为 VF 配置最大或最小 Tx 速率限制。

例如,为 VF 0 设置最大 Tx 速率限制 8000Mbps:

ip link set eth0 vf 0 max_tx_rate 8000

例如,为 VF 0 设置最小 Tx 速率限制 1000Mbps:

ip link set eth0 vf 0 min_tx_rate 1000
  • 如果 PF 上启用了 DCB 或 ADQ,则无法为该 PF 关联的 VF 设置最小 Tx 速率。
  • 如果 PF 上同时禁用了 DCB 和 ADQ,则可以为该 PF 关联的 VF 设置最小 Tx 速率。
  • 如果您为 SR-IOV VF 在 PF 上设置了最小 Tx 速率限制,然后应用了 DCB 或 ADQ 配置,则 PF 无法保证这些 VF 的最小 Tx 速率限制。
  • 如果在多个端口上为 VF 设置最小 Tx 速率,且聚合带宽超过 100Gbps,则 PF 无法保证为 VF 设置的最小 Tx 速率。

VF 的恶意驱动检测(MDD)

某些 Intel 以太网设备使用恶意驱动检测(Malicious Driver Detection,MDD)来检测来自 VF 的恶意流量,并禁用 Tx/Rx 队列或丢弃违规数据包,直到 VF 驱动重置。您可以使用 dmesg 命令在 PF 的系统日志中查看 MDD 消息。

  • 如果 PF 驱动记录来自 VF 的 MDD 事件,请确认已安装正确的 VF 驱动。
  • 要恢复功能,您可以手动重新加载 VF 或 VM,或启用自动 VF 重置。
  • 启用自动 VF 重置后,当 PF 驱动在接收或发送路径上检测到 MDD 事件时,将立即重置 VF 并重新启用队列。
  • 如果禁用自动 VF 重置,当 PF 检测到 MDD 事件时,将不会自动重置 VF。

启用或禁用自动 VF 重置:

ethtool --set-priv-flags <ethX> mdd-auto-reset-vf on|off

VF 的 MAC 和 VLAN 反欺骗功能

当虚拟功能(VF)接口上的恶意驱动尝试发送欺骗数据包时,硬件会丢弃该数据包且不予传输。

注意: 可以为特定 VF 禁用此功能:

ip link set <ethX> vf <vf id> spoofchk {off|on}

VLAN 剪除(VLAN Pruning)

ice 驱动允许您使用 ethtool 私有标志 vf-vlan-pruning 启用或禁用 VF VSI 的 VLAN 剪除。

注意:

  • 当任何 VF 处于活动状态时,您无法更改此私有标志。
  • 如果配置了端口 VLAN,VLAN 剪除将始终启用。
  • 启用 VLAN 剪除后,接口将:
    • 当 Rx VLAN 过滤被禁用时,丢弃所有带 VLAN 标记的数据包。
    • 当 Rx VLAN 过滤被启用时,丢弃未标记的数据包。

在所有 VF 上禁用或启用 VLAN 剪除:

  1. 反初始化所有 VF。

  2. 在 PF 上使用以下命令:

    ethtool --set-priv-flags <ethX> vf-vlan-pruning on|off
    

    其中:

    • on:启用 VLAN 剪除。
    • off:禁用 VLAN 剪除(默认)。
  3. 初始化并配置所有 VF。

之后,VLAN 剪除将根据您设置的标志在这些 VF 上禁用或启用。


灵活的 VF 环回速率控制(Flexible VF Loopback Pacing)

ice 驱动支持调整指定端口的环回速率,允许您优先处理该端口以获得最大带宽并实现更高速度。

使用 devlink 命令和 loopback 参数更改此设置。更改 loopback 参数后,驱动将重新配置所有底层 VF 以匹配所需的端口设置,并为 VF 到 VF 流量增加更多带宽。将此参数设置为 prioritized 可在相关 PF 上启用更高的 hairpin 带宽。

注意:

  • 此配置仅适用于 8x10G 和 4x25G 适配器卡。
  • 通常您会将某些端口设置为优先环回,然后在其他端口上禁用环回,以允许驱动利用空闲带宽用于 VF 到 VF 流量。
  • Intel 建议在网络流量最小的端口上使用 prioritized 环回设置。
  • 您应先配置 PF 上的环回,然后再配置任何其他设置,例如 VF/VM 或分配 MAC 地址。

更改环回设置:

devlink dev param set <pci/D:b:d.f> name loopback value <setting> \
      cmode runtime

其中:

  • <pci/D:b:d.f>:设备的 PCI 地址(pci/Domain🚌device.function)。
  • <setting>:loopback 参数的所需设置。支持的值:
    • enabled:允许环回流量在指定端口上通过(默认)。
    • disabled:不允许环回流量在指定端口上通过。
    • prioritized:在指定端口上优先处理环回流量。注意:此值在单端口适配器上不受支持。

例如:

devlink dev param set pci/0000:b2:00.3 name loopback value prioritized cmode runtime
devlink dev param set pci/0000:b2:00.3 name loopback value enabled cmode runtime
devlink dev param set pci/0000:b2:00.3 name loopback value disabled cmode runtime

Switchdev 模式

PF 驱动支持 legacy 和 switchdev 两种 eSwitch 模式。Switchdev 模式允许驱动创建额外的端口 representor 网络设备,使主机上运行的控制平面能够为 VF 配置过滤器,并处理来自上行链路和 VF 的默认/异常流量。

驱动默认以 legacy 模式加载。您可以使用 devlink 命令独立配置每个物理端口的 eSwitch 模式。只有在尚未创建任何 VF 时才能更改 eSwitch 模式。如果已启用 SR-IOV 且 VF 已绑定到 PF,在 switchdev 与 legacy 模式之间切换之前,您必须:

  • 卸载所有已绑定的 VF。
  • 将 PF 上的 VF 数量设置为零。

注意:

  • ADQ、受信任的 VF 和 L2 转发在 switchdev 模式下不受支持。
  • Switchdev 模式在重启或驱动重新加载后不会保留。

将设备配置为 switchdev 模式:

devlink dev eswitch set <pci/0000:##:##.#> mode switchdev

例如:

devlink dev eswitch set pci/0000:17:00.0 mode switchdev

将设备配置为 legacy 模式:

devlink dev eswitch set <pci/0000:##:##.#> mode legacy

检查当前的 eSwitch 模式:

devlink dev eswitch show <pci/0000:##:##.#>

ice 驱动在 switchdev 模式下支持以下硬件卸载:

支持的过滤器条件:

  • L2:源/目的 MAC 地址、VLAN ID
  • L3:源/目的 IP 地址(IPv4、IPv6)、IP 协议(TCP、UDP)、ToS(IPv4)、流量类(IPv6)、TTL(IPv4)、PPPoE(IPv4、IPv6、TCP、UDP)
  • L4:源端口和目的端口、L2TPv3(IP)
  • VXLAN/GRETAP/GENEVE:VNI/GRE Key、外层目的 IP、内层源 IP、内层目的 IP、内层目的 MAC、TCP/UDP 源端口和目的端口
  • GTP:TEID、PDU 类型、QFI、外层目的 IP、外层源 IP
  • PPPoE:会话 ID、协议
  • L2TPv3:会话 ID

支持的过滤器动作: redirect、drop、mirror

注意:

  • 不支持基于 UDP 的 L2TPv3。
  • GTP、L2TPv3 和 PPPoE 仅在 DDP 包支持这些协议时才受支持,例如 Comms 包。
  • GTP 支持需要内核 5.18 和 iproute2 5.18 或更新版本。在较旧的内核版本上,DCF 方法提供相同的功能。

有关 Intel 以太网 800 系列设备 switchdev 模式下的详细配置信息、支持的字段和示例代码,请参阅配置指南:
https://edc.intel.com/content/www/us/en/design/products/ethernet/appnote-e810-eswitch-switchdev-mode-config-guide/

在 switchdev 模式下将 TC 过滤器卸载到硬件并创建交换规则,大致步骤如下:

  1. 验证已启用 switchdev 模式。

  2. 在 VF 端口 representor(VF_PR)上启用 hw-tc-offload。

  3. 对于隧道接口:使用 ip link 命令创建隧道。

  4. 使用 tc-flower 命令创建交换规则。

  5. 验证硬件中已卸载的流。

Switchdev 模式支持以下用于配置 VF 的 ip link 命令:

  • mac
  • vlan、vxlan、geneve、gre、nvgre、gtp、qos、proto
  • max_tx_rate
  • min_tx_rate
  • spoofchk
  • query_rss
  • state
  • node_guid
  • port_guid

注意:

  • 不支持 trust。支持 rate 但已弃用;请改用 max_tx_rate。

在 switchdev 模式下限制 VF 的 Rx 和 Tx 中断速率:

ethtool -C <vf_pr> rx-usecs-high <N>

其中 <vf_pr> 为指定的 VF 端口 representor,<N> 为所需的中断速率上限。


VF 流量镜像(Traffic Mirroring)

ice 驱动支持 VF 流量镜像(也称端口镜像),支持入口和出口流量。此功能允许将进入和离开 VF 的网络流量复制并发送到同一 PF 上驻留的另一个指定 VF。

注意:

  • 此功能仅在 switchdev 模式下受支持。更多信息请参阅本 README 中的 Switchdev 模式 一节。
  • 使用 tc 命令添加过滤器前,请禁用 FW-LLDP。有关信息请参阅本 README 中的 FW-LLDP 一节。

使用 tc-mirred 命令配置镜像规则。例如,添加一个最小化过滤器:

tc filter add dev <VF1_PR> ingress flower skip_sw action mirred egress mirror dev <VF2_PR>

其中:

  • <VF1_PR> 和 <VF2_PR> 分别为 VF1 和 VF2 的端口 representor 网络设备。
  • 有关 skip_sw 和 ingress flower 的解释,请参阅本 README 中的 创建流量类过滤器 一节。

交换模式(Switching Modes)

基于 Intel(R) 以太网 800 系列的设备支持 VEB(虚拟以太网桥) 和 VEPA(虚拟以太网端口聚合器) 两种交换模式。

虚拟以太网桥(VEB)交换模式:

  • 功能:VEB 充当 Intel 以太网 800 系列内部的交换机,管理同一物理设备上各虚拟功能(VF)之间的互连和流量流。
  • 网络拓扑与环回:它是支持 VLAN 的,能够基于 VLAN 标记隔离和路由流量。重要的是,VEB 在网络控制器上直接处理环回流量,实现高效的内部通信,而无需将流量发送出主机系统再返回。
  • 用例示例:在单台服务器上运行多个虚拟机(VM)、每个 VM 分配不同 VF 的场景中,VEB 在硬件层面促进这些 VM 之间直接、高效的通信。这对于需要低延迟和高速内部数据传输的应用特别有益。

虚拟以太网端口聚合器(VEPA)交换模式:

  • 功能:相比之下,VEPA 将所有 VF 间流量转发到外部网络交换机,依靠这个外部实体进行流量管理和路由。
  • 网络拓扑:它通常用于需要在中央位置(如外部交换机)进行流量控制和分析的环境,例如出于安全或策略执行的目的。
  • 用例示例:在外部流量监控和策略执行至关重要的数据中心中,VEPA 能够将来自各种 VF 的流量聚合到外部交换机,由外部交换机管理路由、监控和策略应用。

VEB 和 VEPA 的主要区别:

  1. 流量管理:VEB 为 VF 之间提供高效的内部流量管理,并在网络控制器上处理环回。相比之下,VEPA 依赖外部设备来管理和路由 VF 间流量。
  2. 效率与控制:VEB 对内部流量和环回场景更高效,而 VEPA 在中央化外部流量控制和监控方面具有优势。
  3. 应用用例:VEB 适用于需要高速、低延迟内部通信的环境,例如密集的 VM 部署。VEPA 则更适合优先考虑外部流量分析和策略执行的场景。

设置和显示硬件交换模式的命令:

bridge link set dev <ethX> hwmode {vepa|veb}
bridge link show dev <ethX>

巨型帧(Jumbo Frames)

通过将最大传输单元(MTU)更改为大于默认值 1500 的值来启用巨型帧支持。

使用 ip 命令增加 MTU 大小。例如,输入以下内容,其中 <ethX> 为接口编号:

ip link set mtu 9000 dev <ethX>
ip link set up dev <ethX>

此设置在重启后不会保留。

要使设置更改永久生效,请将 MTU=9000 添加到以下文件:

  • 对于 RHEL:/etc/sysconfig/network-scripts/ifcfg-<ethX>
  • 对于 SLES:/etc/sysconfig/network/<配置文件>

注意:

  • 巨型帧的最大 MTU 设置为 9702,对应的最大巨型帧大小为 9728 字节。
  • 此驱动将尝试使用多个页面大小的缓冲区来接收每个巨型数据包。这有助于避免分配接收数据包时的缓冲区耗尽问题。
  • 使用巨型帧时,丢包对吞吐量的影响可能更大。如果在启用巨型帧后观察到性能下降,启用流量控制可以缓解该问题。

速率与双工配置

您不能使用 ethtool 设置速率、双工或自动协商设置。

查看设备支持的速率配置:

ethtool <ethX>

让设备通告支持的速率,其中 N 为所需速率的位掩码:

ethtool -s <ethX> advertise N

例如,让设备通告 10000baseSR Full:

ethtool -s <ethX> advertise 0x80000000000

更多详情请参阅 ethtool 手册页。

注意: 在选定的 E82x 设备上使用受支持的 1G 模块时,支持切换自动协商;有关您的适配器和模块组合是否可用,请参阅设备用户指南。


数据中心桥接(DCB)

注意:
内核假定 TC0 可用,如果 TC0 不可用,将在设备上禁用优先级流量控制(PFC)。要解决此问题,请在交换机上设置 DCB 时确保 TC0 已启用。

DCB 是硬件中的配置化服务质量(QoS)实现。它使用 VLAN 优先级标记(802.1p)过滤流量,意味着流量可以被过滤到 8 个不同的优先级中。它还启用优先级流量控制(802.1Qbb),可以在网络压力下限制或消除丢弃数据包的数量。带宽可以分配给这些优先级中的每一个,并在硬件层面强制执行(802.1Qaz)。

DCB 通常在网络上使用 DCBX 协议(802.1Qaz)配置,它是 LLDP(802.1AB)的专门化。ice 驱动支持以下互斥的 DCBX 支持方式:

  • 基于固件的 LLDP 代理(Firmware-based LLDP Agent)
  • 基于软件的 LLDP 代理(Software-based LLDP Agent)

在固件模式下,固件拦截所有 LLDP 流量,并为用户透明地处理 DCBX 协商。在此模式下,适配器以"willing(顺从)"DCBX 模式运行,从链路对端(通常是交换机)接收 DCB 设置。本地用户只能查询协商的 DCB 配置。有关在交换机上配置 DCBX 参数的信息,请查阅交换机制造商的文档。

在软件模式下,LLDP 流量被转发到网络栈和用户空间,由软件代理处理。在此模式下,适配器可以以"willing"或"nonwilling(非顺从)"DCBX 模式运行,并且 DCB 配置既可以在本地查询也可以设置。此模式要求禁用基于固件的 LLDP 代理。

注意:

  • 您可以使用 ethtool 私有标志启用和禁用基于固件的 LLDP 代理。更多信息请参阅本 README 中的 FW-LLDP 一节。
  • 在基于软件的 DCBX 模式下,您可以使用与 Linux 内核 DCB Netlink API 交互的软件 LLDP/DCBX 代理来配置 DCB 参数。软件模式下我们推荐使用 OpenLLDP 作为 DCBX 代理。更多信息请参阅 OpenLLDP 手册页和 https://github.com/intel/openlldp。
  • 驱动实现了 DCB netlink 接口层,允许用户空间与驱动通信并查询端口的 DCB 配置。
  • 不支持 iSCSI with DCB。

L3 QoS 模式

ice 驱动支持在 PF 驱动中设置基于 DSCP 的第三层服务质量(L3 QoS)。驱动以 L2 QoS 模式初始化。L3 QoS 模式:

  • 当定义第一个 DSCP/ToS 到 TC 的映射时自动启用。
  • 当最后一个 DSCP/ToS 到 TC 的映射被移除时自动禁用。

以下是将 DSCP/ToS 映射到 TC 的示例:

lldptool -T -i <ethX> -V APP app=<prio>,<sel>,<pid>

其中:

  • <prio>:分配给 DSCP/ToS 代码点的 TC。
  • <sel>:5 表示 DSCP 到 TC 的映射。
  • <pid>:DSCP/ToS 代码点。

例如,将接口 eth0 上包含 DSCP 值 63 的数据包映射到流量类 0:

lldptool -T -i eth0 -V APP app=63,5,0

移除映射:

lldptool -T -I <ethX> -V APP -d app=<prio>,<sel>,<pid>

查看当前配置的映射:

lldptool -t -i <ethX> -V APP -c

注意:

  • L3 QoS 模式在启用 FW-LLDP 时不可用。如果 L3 QoS 模式处于活动状态,您也无法启用 FW-LLDP。切换到 L3 QoS 模式前请先禁用 FW-LLDP。更多信息请参阅本 README 中的 FW-LLDP 一节。
  • 一旦提交了某个 DSCP 值的映射,在第一个映射被删除之前,不会接受该值的其他映射。

FW-LLDP(固件链路层发现协议)

使用 ethtool 更改 FW-LLDP 设置。FW-LLDP 设置按端口配置,并在重启后保留。

启用 LLDP:

ethtool --set-priv-flags <ethX> fw-lldp-agent on

禁用 LLDP:

ethtool --set-priv-flags <ethX> fw-lldp-agent off

检查当前 LLDP 设置:

ethtool --show-priv-flags <ethX>

注意:
您必须在 UEFI HII 中启用"LLDP Agent"属性,此设置才能生效。如果"LLDP AGENT"设置为禁用,您将无法从操作系统启用它。


前向纠错(FEC)

允许您设置前向纠错(FEC)模式。FEC 可提高链路稳定性,但会增加延迟。许多高质量光模块、直连电缆和背板通道无需 FEC 即可提供稳定的链路。

注意: 设备要从此功能受益,链路对端必须启用 FEC。

如果启用标志 allow-no-fec-modules-in-auto,自动 FEC 协商将包含"No FEC",以防您的链路对端未启用 FEC 或不支持 FEC:

ethtool --set-priv-flags <ethX> allow-no-fec-modules-in-auto on

在内核 4.14 之前的版本上,使用以下私有标志禁用 FEC 模式:

  • rs-fec:0 禁用,1 启用
  • base-r-fec:0 禁用,1 启用

在内核 4.14 或更高版本上,使用 ethtool 获取/设置以下 FEC 模式:

  • No FEC(无 FEC)
  • Auto FEC(自动 FEC)
  • BASE-R FEC
  • RS-FEC

链路级流量控制(LFC)

可以使用 ethtool 配置以太网流量控制(IEEE 802.3x),为 ice 启用接收和发送暂停帧。启用发送时,当接收数据包缓冲区超过预定义阈值时,会生成暂停帧。启用接收时,当接收到暂停帧时,发送单元将暂停指定的时间延迟。

注意: 您必须拥有支持流量控制的链路对端。

流量控制默认禁用。

使用 ethtool 更改流量控制设置。

启用或禁用 Rx 或 Tx 流量控制:

ethtool -A <ethX> rx <on|off> tx <on|off>

注意:
此命令仅在自动协商禁用时才启用或禁用流量控制。如果启用了自动协商,此命令会更改用于与链路对端自动协商的参数。

流量控制自动协商是链路自动协商的一部分。根据设备的不同,您可能无法更改自动协商设置。

注意:

  • ice 驱动要求端口和链路对端都启用流量控制。如果其中一侧禁用了流量控制,端口在流量较大时可能看起来挂起。

  • 禁用 DCB 后,您可能会遇到链路级流量控制(LFC)问题。LFC 状态可能显示为已启用,但流量并未暂停。要解决此问题,请使用 ethtool 禁用并重新启用 LFC:

    ethtool -A <ethX> rx off tx off
    ethtool -A <ethX> rx on tx on
    

限制发送队列的最大比特率

ice 驱动支持通过 tx_maxrate sysfs 条目限制发送队列比特率。使用此条目以 Mbps 设置最大比特率。值为零表示不限制。

例如,将发送队列 1 的比特率设置为 300 Mbps:

echo 300 > /sys/class/net/<ethx>/queues/tx-1/tx_maxrate

移除限制:

echo 0 > /sys/class/net/<ethx>/queues/tx-1/tx_maxrate

NAPI

此驱动支持 NAPI(Rx 轮询模式)。有关 NAPI 的更多信息,请参阅:
https://docs.kernel.org/networking/napi.html


MACVLAN

此驱动支持 MACVLAN。可以通过检查 MACVLAN 驱动是否已加载来测试内核对 MACVLAN 的支持。您可以运行 lsmod | grep macvlan 查看 MACVLAN 驱动是否已加载,或运行 modprobe macvlan 尝试加载 MACVLAN 驱动。

注意: 在 passthru(直通)模式下,您只能设置一个 MACVLAN 设备。它将继承底层 PF(物理功能)设备的 MAC 地址。

ice 设备支持 L2 转发卸载(L2 Forwarding Offload)。这将把 L2 转发所需的处理从系统处理器卸载到 ice 设备。启用 L2 转发卸载的步骤:

  1. 启用 L2 转发卸载:

    ethtool -K <ethX> l2-fwd-offload on
    
  2. 创建 MACVLAN 网络设备并将其绑定到 PF。

  3. 启用 MACVLAN 网络设备。

注意:
MACVLAN 卸载和 ADQ 互斥。如果先启用 l2-fwd-offload 再设置 ADQ,或先设置 ADQ 再启用 l2-fwd-offload,可能会导致系统不稳定。


IEEE 802.1ad(QinQ)支持

IEEE 802.1ad 标准(非正式名称为 QinQ)允许在单个以太网帧中包含多个 VLAN ID。VLAN ID 有时称为"标记",因此多个 VLAN ID 被称为"标记栈"。标记栈允许 L2 隧道以及分离特定 VLAN ID 内的流量等用途。

以下是配置 802.1ad(QinQ)的示例,其中"24"和"371"为示例 VLAN ID:

ip link add link eth0 eth0.24 type vlan proto 802.1ad id 24
ip link add link eth0.24 eth0.24.371 type vlan proto 802.1Q id 371

注意:

  • 802.1ad(QinQ)在内核 3.19 及更高版本中受支持。
  • VLAN 协议使用以下 EtherType:
    • 802.1Q = EtherType 0x8100
    • 802.1ad = EtherType 0x88A8
  • 要使 QinQ 流量在 MTU 1500 下工作,L2 对端(交换机端口或另一块网卡)应能够接收 1526 字节的以太网帧。某些第三方网卡在 MTU 1500 下支持的最大以太网帧大小为 1522 字节,这将导致 QinQ 流量失败。要解决此问题,请将 Intel 以太网设备上的 MTU 限制为 1496。

双重 VLAN(Double VLANs)

基于 Intel(R) 以太网 800 系列的设备在以下所有条件都满足时,可以处理数据包中最多两个 VLAN:

  • ice 驱动版本 1.4.0 或更高版本
  • NVM 版本 2.4 或更高版本
  • ice DDP 包版本 1.3.21 或更高版本

如果未使用上述版本,唯一支持的 VLAN 配置是单个 802.1Q VLAN 流量。

当数据包中存在两个 VLAN 标记时,外层 VLAN 标记可以是 802.1Q 或 802.1ad。内层 VLAN 标记必须始终是 802.1Q。

注意以下限制:

  • 对于每个 VF,PF 只允许一种类型的 VLAN 硬件卸载(插入和剥离),即 802.1Q 或 802.1ad 之一。
  • 您不能单独启用或禁用外层或单个 802.1Q 或 802.1ad 过滤。它们要么同时启用,要么同时禁用。
  • 在 SR-IOV 模式下,当启用 VF 真正混杂模式(vf-true-promisc-support)和双重 VLAN 时,VF 可能无法基于内层 VLAN 头接收所有网络流量。

启用外层或单个 802.1Q VLAN 插入和剥离,并禁用 802.1ad VLAN 插入和剥离:

ethtool -K <ethX> rxvlan on txvlan on rx-vlan-stag-hw-parse off tx-vlan-stag-hw-insert off

启用外层或单个 802.1ad VLAN 插入和剥离,并禁用 802.1Q VLAN 插入和剥离:

ethtool -K <ethX> rxvlan off txvlan off rx-vlan-stag-hw-parse on tx-vlan-stag-hw-insert on

启用外层或单个 VLAN 过滤:

ethtool -K <ethX> rx-vlan-filter on rx-vlan-stag-filter on

禁用外层或单个 VLAN 过滤:

ethtool -K <ethX> rx-vlan-filter off rx-vlan-stag-filter off

将 QinQ 与 SR-IOV VF 结合使用

我们建议您始终从 PF 为 VF 配置端口 VLAN。如果未配置端口 VLAN,VF 驱动可能只能通过软件卸载 VLAN。PF 允许所有 VLAN 流量到达 VF,由 VF 管理所有 VLAN 流量。

当设备配置为双重 VLAN 且 PF 已配置端口 VLAN 时:

  • VF 只能为 802.1Q 流量卸载客户机 VLAN。
  • VF 只能使用 802.1Q 流量为客户机 VLAN 配置 VLAN 过滤规则。

但是,当设备配置为双重 VLAN 且 PF 未配置端口 VLAN 时:

  • 您必须使用 iavf 驱动版本 4.1.0 或更高版本 才能卸载和过滤 VLAN。
  • PF 默认在 VF 的 VSI 中启用 VLAN 剪除和反欺骗。在 VF 请求 VLAN 过滤器之前,VF 将不会传输或接收任何带标记的流量。
  • VF 可以卸载(插入和剥离)802.1Q 或 802.1ad 流量的外层 VLAN 标记。
  • VF 可以为 802.1Q 和 802.1ad 流量的外层 VLAN 标记创建过滤规则。

如果 PF 不支持双重 VLAN,则 VF 可以在没有端口 VLAN 的情况下硬件卸载单个 802.1Q VLAN。

当 PF 启用双重 VLAN 时,对于 4.1.x 之前的 iavf 驱动:

  • 仅当 PF 已配置端口 VLAN 时,才支持 VLAN 硬件卸载和过滤。
  • 未配置端口 VLAN 时,VLAN 过滤、插入和剥离将通过软件卸载。

查看 VLAN 过滤和卸载能力:

ethtool -k <ethX> | grep vlan

IEEE 1588 精确时间协议(PTP)硬件时钟(PHC)

精确时间协议(PTP)用于同步计算机网络中的时钟。支持此驱动的 Intel 设备之间 PTP 支持各不相同。使用以下命令获取设备支持的 PTP 能力的权威列表:

ethtool -T <ethX>

以下设备有详细的用户指南,此功能的高级配置请参阅该指南:

Intel 以太网 800 系列设备支持硬件生成的时间戳。ice 驱动使用这些时间戳来同步平台上的时钟,并报告数据包上的精确时间戳。使用 linuxptp 工具包中提供的 hwstamp_ctl 命令启用此设置:

hwstamp_ctl -i <ethX> -t 1 -r 1

所有 Intel 以太网 800 系列(E810 除外)设备都支持硬件生成的交叉时间戳(cross timestamps),可在硬件中同时捕获 PHC 和 x86 ART 时间。可通过内核 PTP 设备的 PTP_SYS_OFFSET_PRECISE IOCTL 获取。

E810 设备仅支持软件交叉时间戳,即以足够高的精度在软件中捕获 PHC 和 x86 TSC 时间。这仅对 VF 可用,通过使用 VIRTCHNL_OP_1588_PTP_GET_SW_CROSS_TSTAMP 和 VIRTCHNL_OP_1588_PTP_GET_PHC_TO_CPU_DYNAMIC_RATIO 命令。


SyncE 支持

在支持同步以太网(Synchronous Ethernet,SyncE)的硬件上,ice 驱动提供允许您与其他支持 SyncE 的端口同步频率的接口。手动配置 SyncE 后,设备会从可用信号中动态选择质量最好的信号。然后,一旦信号锁定,它就会将其频率时钟同步到该信号。最佳质量信号是根据 ice SyncE 接口配置的拓扑确定的。

以下设备有详细的用户指南,此功能的高级配置请参阅该指南:


非托管 DPLL 支持

受支持硬件的托管 DPLL 支持在外部指南中描述,如 SyncE 支持 一节所述。

E830 的某些硬件变体可能支持非托管 DPLL:

  • Intel(R) 以太网网络适配器 E830-XXVDA8F for OCP 3.0
  • Intel(R) 以太网网络适配器 E830-XXVDA4F

对于非托管 DPLL,配置在硬件和固件中是硬编码的,用户无法修改设置。但是,用户可以通过 Linux DPLL 子系统检查 DPLL 锁定状态并获取配置信息。

存在时,DPLL 设备锁定到通过 PCIe/OCP 引脚提供的外部信号。预期输入信号是嵌入在 10MHz 参考时钟上的 1PPS(每秒 1 脉冲)。DPLL 产生的输出:

  • 用于 MAC(媒体访问控制)和 PHY(物理层)时钟
  • 用于机载 PHC(精确硬件时钟)定时器同步的 1PPS

要求: Linux 内核必须同时支持 DPLL 子系统和嵌入式同步(Embedded Sync)补丁系列。

下面给出了查询 Linux DPLL 子系统的示例输出。

转储 DPLL 引脚(pins):

$ ./tools/net/ynl/cli.py --spec Documentation/netlink/specs/dpll.yaml --dump pin-get
[{'board-label': '1588-TIME_SYNC',
  'capabilities': set(),
  'clock-id': 282574471561216,
  'esync-frequency': 1,
  'esync-frequency-supported': [{'frequency-max': 1, 'frequency-min': 1}],
  'esync-pulse': 25,
  'frequency': 10000000,
  'id': 13,
  'module-name': 'ice',
  'parent-device': [{'direction': 'input',
                     'parent-id': 6,
                     'state': 'connected'}],
  'phase-adjust-max': 0,
  'phase-adjust-min': 0,
  'type': 'ext'},
 {'board-label': 'MAC-PHY-CLK',
  'capabilities': set(),
  'clock-id': 282574471561216,
  'frequency': 156250000,
  'id': 14,
  'module-name': 'ice',
  'parent-device': [{'direction': 'output',
                     'parent-id': 6,
                     'state': 'connected'}],
  'phase-adjust-max': 0,
  'phase-adjust-min': 0,
  'type': 'synce-eth-port'},
 {'board-label': '1588-TIME_REF',
  'capabilities': set(),
  'clock-id': 282574471561216,
  'frequency': 1,
  'id': 15,
  'module-name': 'ice',
  'parent-device': [{'direction': 'output',
                     'parent-id': 6,
                     'state': 'connected'}],
  'phase-adjust-max': 0,
  'phase-adjust-min': 0,
  'type': 'int-oscillator'}]

转储 DPLL 设备(devices):

$ ./tools/net/ynl/cli.py --spec Documentation/netlink/specs/dpll.yaml --dump device-get
[{'clock-id': 282574471561216,
  'id': 6,
  'lock-status': 'locked',
  'mode': 'automatic',
  'mode-supported': ['automatic'],
  'module-name': 'ice',
  'type': 'eec'}]

最早发送时间优先(ETF)卸载

Intel 以太网 E83x 系列设备支持最早发送时间优先(Earliest TxTime First,ETF)卸载。ETF 卸载实现精确的数据包发送调度,这对于需要严格时间控制的时间敏感型网络应用至关重要。ice 驱动使用 SO_TXTIME 套接字选项来调度发送。应用程序必须在发送数据包时设置此选项,以利用 ETF 卸载提供的精确发送时间。

在队列上启用和配置 ETF qdisc 卸载:

  1. 使用 mqprio qdisc 将数据包分类到不同的流量类。例如:

    tc qdisc add dev <ethX> handle 100: parent root mqprio num_tc 3 \
      map 2 2 1 0 2 2 2 2 2 2 2 2 2 2 2 2 \
      queues 1@0 1@1 2@2 \
    

    将 <ethX> 替换为您的网络接口名称。

  2. 将 ETF 设置为您所需流量类的排队规则。例如,为流量类 0 设置 ETF qdisc:

    tc qdisc replace dev <ethX> parent 100:1 etf \
      clockid CLOCK_TAI delta 300000 offload
    

有关 ETF qdisc 及其选项的详细说明,请参阅 tc-etf 手册页。


配置校验和卸载

您可以使用 ethtool 配置校验和卸载。

查看设备支持和已配置的校验和功能:

ethtool -k <ethX>

启用或禁用 Tx 和 Rx 校验和卸载功能:

ethtool -K <ethX> [tx|rx] [on|off]

Intel 以太网 E83x 系列设备支持通用 Tx 和 Rx 校验和。

  • 要更改通用 Rx 校验和卸载,请使用上述 Rx 校验和启用/禁用命令。

  • 要更改通用 Tx 校验和卸载,使用以下命令:

    ethtool -K <ethX> tx-checksum-ip-generic [on|off]
    

注意:
在 Intel 以太网 E83x 系列设备上,通用 Tx 校验和卸载功能(tx-checksum-ip-generic)不能与以下功能同时启用:

  • TCP 分段卸载(TSO),或
  • IP 校验和卸载(tx-checksum-ipv4 和 tx-checksum-ipv6)

在启用通用 Tx 校验和卸载之前,请确保已禁用 TSO 和 IP 校验和卸载。

更多详情请参阅 ethtool 手册页。


隧道/覆盖无状态卸载

支持的隧道和覆盖包括 VXLAN、GENEVE 等,具体取决于硬件和软件配置。无状态卸载默认启用。

查看所有卸载的当前状态:

ethtool -k <ethX>

UDP 分段卸载

允许适配器将负载高达 64K 的 UDP 数据包的发送分段卸载为有效的以太网帧。由于适配器硬件完成数据分段的速度远快于操作系统软件,此功能可提高发送性能。

此外,适配器可能使用更少的 CPU 资源。

注意:

  • UDP 发送分段卸载需要 Linux 内核 4.18 或更高版本。
  • 发送 UDP 数据包的应用程序必须支持 UDP 分段卸载。

启用/禁用 UDP 分段卸载:

ethtool -K <ethX> tx-udp-segmentation [off|on]

CRC/FCS 剥离的运行时控制

帧校验序列(FCS)是四字节循环冗余校验(CRC),允许驱动检测接收到的以太网帧中的数据损坏。

ice 驱动允许您使用 ethtool 命令禁用或启用 FCS/CRC 剥离。

  • FCS/CRC 剥离默认启用。
  • 驱动强制执行 FCS/CRC 和 VLAN 剥离的有效组合。只有在 PF 上也禁用 VLAN 剥离时,才能禁用 FCS/CRC 剥离。
  • 禁用 FCS/CRC 剥离可能有助于调试问题。XDP 程序也可以将 FCS/CRC 用于其目的。

启用或禁用 FCS/CRC 剥离:

ethtool -K <ethX> rx-fcs on|off

检查 FCS/CRC 剥离状态,查看 ethtool 报告的 rx-fcs 信息:

ethtool -k <ethX>

在某些设备上更新 NVM 时,更新可能使用 devlink 接口,而不是 ethtool 接口。如果以下所有条件都为真,就会发生这种情况:

  • 您正在更新 Intel 以太网 800 系列设备。
  • 您的系统运行的发行版支持 devlink dev flash 命令。
  • 设备上当前安装的固件支持它。
  • 新的 NVM 符合正确的 PLDM 格式。

除了以下例外,大部分功能和命令都是相同的:

  • 您无法在恢复模式下更新设备。(要更新恢复模式下的设备,您必须下载并安装 Intel 以太网驱动程序集。)
  • 您无法将 OROM 或 Netlist 作为单独的更新进行更新,只能作为完整 NVM 更新的一部分。
  • 如果您指定了 "PRESERVE_ALL" 保留级别,系统将在 NVM 更新后立即执行 EMPR 重置。

在支持它的设备上,您也可以直接使用 devlink 命令行更新设备 NVM。但我们建议您使用 NVMUpdate。

devlink dev flash pci/0000:3b:00.0 file filename.bin

其中:

  • pci/0000:3b:00.0:您希望更新的设备。您可以使用 devlink dev info 命令获取设备列表。
  • filename.bin:包含新 NVM 映像的文件。

大多数 CVL 设备支持更改其端口拆分配置以满足您的需求。例如,双端口设备可能支持两个 100Gbps 链路、两个 50Gbps 链路以及(使用正确的线缆)四个 25Gbps 链路等。支持的端口拆分配置在设备的 NVM 中定义。

您可以使用 Intel 的以太网端口配置工具(EPCT)等工具查询和设置此配置。如果没有此类工具,可以使用 devlink 循环遍历设备可能的端口拆分配置。

如果使用 devlink 更改配置,您必须检查日志以确定选择了哪个配置。如果使用 devlink,您需要指定要在设备上配置的端口数量。每次调用具有该端口数的 devlink 时,驱动程序将检查设备的当前配置,然后移动到具有指定端口数的下一个配置。例如,如果您的设备在 NVM 中定义了两个四端口配置,第一次调用 devlink 时,它将选择第一个配置。第二次调用时,它将选择第二个配置。如果再次调用 devlink,它将选择第一个配置。

没有直接的反馈机制;您必须检查日志以确定设置了哪个配置。

devlink port split <pci/D:b:d.f>/0 count <num>

其中:

  • <pci/D:b:d.f>/0:设备的 PCI 地址(pci/Domain🚌device.function)。/0 为"PORT_INDEX"。
  • <num>:所需的端口拆分数量。

注意:

  • 如果您成功更改了端口的配置,驱动程序会记录一条信息消息:"Reboot required to finish port split"(需要重启以完成端口拆分)以及所选的端口拆分配置。这是成功的唯一指示。
  • 如果您在 devlink port split 中请求了不受支持的 count 值参数,驱动程序会记录信息消息:"Port split requested unsupported port config."
  • 如果您尝试在不是 PF 0 的 PF 上更改配置,驱动程序将返回错误:"Port cannot be split."

例如,如果您的设备在 NVM 中定义了以下配置:

ice 0000:16:00.0:  Status  Split      Quad 0         Quad 1
ice 0000:16:00.0:          count  L0  L1  L2  L3  L4  L5  L6  L7
ice 0000:16:00.0: Active   2     100   -   -   - 100   -   -   -
ice 0000:16:00.0:          2      50   -  50   -   -   -   -   -
ice 0000:16:00.0:          4      25  25  25  25   -   -   -   -
ice 0000:16:00.0:          4      25  25   -   -  25  25   -   -
ice 0000:16:00.0:          8      10  10  10  10  10  10  10  10
ice 0000:16:00.0:          1     100   -   -   -   -   -   -   -

如果调用:

devlink port split pci/0000.16:00.0/0 count 4

您的设备将被配置为:

ice 0000:16:00.0:          4      25  25  25  25   -   -   -   -

如果再次调用相同的命令,您的设备将被配置为:

ice 0000:16:00.0:          4      25  25   -   -  25  25   -   -

如果第三次调用相同的命令,设备将循环回到其 4 端口配置的顶部(因为其 NVM 中只定义了两个 4 端口配置),并将设置为:

ice 0000:16:00.0:          4      25  25  25  25   -   -   -   -

固件日志(Firmware Logs)

ice 驱动允许您为受支持的事件类别生成固件日志,以帮助客户支持部门调试问题。固件日志默认启用。 有关此功能的概述和其他提示,请参阅《Intel(R) 以太网适配器与设备用户指南》。

  • 驱动仅在 PF 0 上通过 debugfs 接口支持固件日志记录。
  • 在以太网设备上运行的固件必须支持固件日志记录;如果固件不支持固件日志记录,ice 的 debugfs 目录中将不会创建 fwlog 文件。
  • 固件日志以二进制形式存储在数据文件中。

捕获固件日志的高层次步骤如下(详细信息见以下小节):

  1. 设置日志级别。例如:

    echo normal > /sys/kernel/debug/ice/0000:18:00.0/fwlog/modules/all
    
  2. 打开固件日志:

    echo 1 > /sys/kernel/debug/ice/0000:18:00.0/fwlog/enable
    
  3. 执行必要的步骤以生成您试图调试的问题。

  4. 关闭固件日志:

    echo 0 > /sys/kernel/debug/ice/0000:18:00.0/fwlog/enable
    
  5. 将数据保存到文件:

    cat /sys/kernel/debug/ice/0000:18:00.0/fwlog/data > fwlog.bin
    
  6. 与客户支持部门合作调试您的问题。

注意:

  • 固件日志以二进制格式生成,必须由客户支持部门解码。收集的信息仅与固件和硬件有关,用于调试目的。
  • 您必须具有管理员权限并以 root 用户登录才能更改固件日志设置。

驱动将固件事件分组为称为"模块(modules)"的类别。模块在 fwlog/modules 目录下实例化。

配置模块和详细级别的命令:

echo <log_level> > /sys/kernel/debug/ice/0000\:18\:00.0/fwlog/modules/<module>

其中:

  • <log_level>:固件日志所需的详细级别。支持的值包括:

    • none
    • error
    • warning
    • normal
    • verbose

    每个模块只能设置一个日志级别,每个级别包括低于它的详细级别。例如,将级别设置为 normal 也会记录 warning 和 error 消息。

  • <module>:表示要接收事件的模块名称。支持的值包括:

    值 含义
    general 常规
    ctrl 控制
    link 链路管理
    link_topo 链路拓扑检测
    dnl 链路控制技术
    i2c I2C
    sdp SDP
    mdio MDIO
    adminq 管理队列
    hdma 主机 DMA
    lldp LLDP
    dcbx DCBx
    dcb DCB
    xlr XLR(功能级复位)
    nvm NVM
    auth 认证
    vpd 重要产品数据
    iosf Intel 片上系统结构
    parser 解析器
    sw 交换
    scheduler 调度器
    txq TX 队列管理
    rsvd ACL(访问控制列表)
    post 自检(POST)
    watchdog 看门狗
    task_dispatch 任务调度器
    mng 可管理性
    synce SyncE
    health 健康
    tsdrv 时间同步
    pfreg PF 注册
    mdlver 模块版本
    all 允许您将所有模块设置为指定的 log_level,或读取所有模块的 log_level

示例:

将单个模块设置为 verbose:

echo verbose > /sys/kernel/debug/ice/0000\:18\:00.0/fwlog/modules/link

设置多个模块,然后多次发出命令:

echo verbose > /sys/kernel/debug/ice/0000\:18\:00.0/fwlog/modules/link
echo warning > /sys/kernel/debug/ice/0000\:18\:00.0/fwlog/modules/ctrl
echo none > /sys/kernel/debug/ice/0000\:18\:00.0/fwlog/modules/dcb

将所有模块设置为相同的值:

echo normal > /sys/kernel/debug/ice/0000\:18\:00.0/fwlog/modules/all

读取特定模块的 log_level(例如 general 模块):

cat /sys/kernel/debug/ice/0000\:18\:00.0/fwlog/modules/general

读取所有模块的 log_level:

cat /sys/kernel/debug/ice/0000\:18\:00.0/fwlog/modules/all

您可以配置模块,但在固件明确收到 fwlog/enable 设置之前,固件不会向驱动发送固件日志事件。

启用固件日志:

echo 1 > /sys/kernel/debug/ice/0000\:18\:00.0/fwlog/enable

禁用固件日志:

echo 0 > /sys/kernel/debug/ice/0000\:18\:00.0/fwlog/enable

检索固件日志数据,从 fwlog/data 读取数据。您可以通过向 fwlog/data 写入任何值来清除固件日志数据的内容。

将固件日志数据输出到二进制文件:

cat /sys/kernel/debug/ice/0000\:18\:00.0/fwlog/data > fwlog.bin

清除固件日志数据的内容:

echo 0 > /sys/kernel/debug/ice/0000\:18\:00.0/fwlog/data

注意:

  • 只有在禁用固件日志时才能清除数据。
  • 固件日志以二进制格式生成,必须由客户支持部门解码。收集的信息仅与固件和硬件有关,用于调试目的。

驱动从管理接收队列(ARQ)接收固件日志数据。要更改固件发送 ARQ 事件的频率,请向 fwlog/nr_messages 写入一个值。

  • 范围为 1-128(1 表示推送每条日志消息;128 表示仅在 AQ 命令缓冲区满时才推送)。
  • 建议值为 10。

设置该值的示例:

echo 50 > /sys/kernel/debug/ice/0000\:18\:00.0/fwlog/nr_messages

查看当前配置的值:

cat /sys/kernel/debug/ice/0000\:18\:00.0/fwlog/nr_messages

驱动在驱动程序内部存储固件日志数据。用于存储数据的内存默认大小为 1MB,但某些用例可能需要更多或更少的数据。

更改为固件日志数据分配的内存量,写入 fwlog/log_size。例如:

echo 128K > /sys/kernel/debug/ice/0000\:18\:00.0/fwlog/log_size

该值必须为以下之一:128K、256K、512K、1M 或 2M。

注意: 固件日志必须处于禁用状态才能更改 fwlog/log_size 的值。


调试转储(Debug Dump)

Intel 以太网 800 系列设备支持调试转储,允许您从固件获取"集群(clusters)"事件的运行时寄存器值,然后将结果写入单个转储文件,用于调试现场复杂问题。

此调试转储包含设备及其现有硬件配置(如交换表、发送调度器表和其他信息)的快照。调试转储捕获指定集群的当前状态,是整个设备的无状态快照。

注意:

  • 与固件日志一样,调试转储的内容不是人类可读的。您必须与客户支持部门合作解码文件。
  • 调试转储是按设备,而不是按 PF。

ice 驱动使用 debugfs 接口进行调试转储。在 Linux 中生成调试转储文件:

  1. 使用以下命令之一指定要包含在转储文件中的集群。您可以设置单个集群或所有集群。

    • 转储所有集群:

      echo > /sys/kernel/debug/ice/<pci_addr>/fw/dump_cluster_id
      
    • 转储单个集群:

      echo <cluster ID> > /sys/kernel/debug/ice/<pci_addr>/fw/dump_cluster_id
      

      集群 ID 值因 Intel 以太网控制器系列而异。请根据您的设备类型使用下面的相应参考表。

      <cluster ID> 的可能值:

      集群功能 E810/E82x E83x 系列
      交换(Switch) 0 100
      ACL 1 101
      Tx 调度器 2 102
      配置文件配置 3 103
      EMP DRAM 4 104
      链路 5 105
      DCB 7 107
      L2P 8 108
      队列可管理性 9 109
      CSR 空间 21 121
      可管理性事务 22 122

      例如,转储 CSR 空间:

      echo 21 > /sys/kernel/debug/ice/<pci_addr>/fw/dump_cluster_id
      
  2. 使用以下命令之一将调试转储保存到文件。将 .bin 名称替换为您要使用的文件名。例如:

    • 单个集群:

      cat /sys/kernel/debug/ice/<pci_addr>/fw/debug_dump > ~/single_cluster_dump.bin
      
    • 所有集群:

      cat /sys/kernel/debug/ice/<pci_addr>/fw/debug_dump > ~/all_cluster_dump.bin
      

调试 PHY 统计信息

ice 驱动支持在运行时获取 PHY 寄存器的值,以调试链路和连接问题。

驱动允许您获取有关以下方面的信息:

  • Rx 和 Tx 均衡(Equalization)参数
  • RS FEC 可纠正和不可纠正块计数

使用 ethtool 读取 PHY 寄存器:

ethtool -d <ethX> [raw on|off] [hex on|off] [file name]

命令输出类似:

Offset          Values
------          ------
0x0000:         00 00 00 00 0a 00 00 00 00 00 00 00 00 00 00 00
0x0010:         00 00 00 00 02 00 a9 b1 00 10 00 00 19 df 00 00
0x0020:         b7 00 00 00 d4 00 00 00 00 00 00 00 00 00 00 00
0x0030:         0a 00 00 00 19 00 00 00 00 00 00 00 0e 00 00 00
...

注意: 寄存器的内容不是人类可读的。您必须与客户支持部门合作解码文件。

使用 ethtool 读取 RS FEC 可纠正和不可纠正块计数:

ethtool --show-fec <ethX>

命令输出类似:

FEC parameters for ethX:
Supported/Configured FEC encodings: Auto RS BaseR
Active FEC encoding: RS
Statistics:
  corrected_blocks: 0
  uncorrectable_blocks: 0

分层 QoS(HQoS)发送调度器

您可以配置自定义发送调度器树结构,以针对特定需求整形发送流量。您可以通过在设备上创建父节点,然后将子节点(VF)分配给父节点来更改树结构。您还可以更改每个节点的发送速率管理配置。

注意:

  • 重新配置调度器拓扑应仅由专家进行。修改调度器拓扑可能会对设备的网络可用性和吞吐量产生不利影响。除非您愿意承担这些风险,否则请勿执行此操作。修改调度器拓扑后,如果设备未按预期运行,应将设备恢复到默认拓扑。
  • 修改分层 QoS(HQoS)发送调度器需要内核 6.2 或更高版本。
  • 修改分层 QoS(HQoS)发送调度器与 ADQ、DCB、RDMA 或其他自定义调度器树功能不兼容。

创建 devlink-rate 父组:

devlink port function rate add <dev/port>/<group>

其中:

  • <dev/port>:设备的 PCI 总线:设备:功能(bus:device:function)。
  • <group>:新的父组。

例如,以下命令在指定设备上创建 operators 组:

devlink port function rate add pci/0000:03:00.0/operators

在父组中创建新的子节点:

devlink port function rate add <dev/port>/<child> parent <group>

其中:

  • <dev/port>:设备的 PCI 总线:设备:功能。
  • <child>:新的子节点。
  • <group>:现有的父组。

例如,以下命令在 operators 父组中创建 class_1 子节点:

devlink port function rate add pci/0000:03:00.0/class_1 parent operators

显示设备当前的树结构,其中 <dev/port> 为设备的 PCI 总线:设备:功能:

devlink port function rate show <dev/port>

例如:

devlink port function rate show pci/0000:03:00.0

输出示例:

pci/0000:03:00.0/node_0 type node (root)
pci/0000:03:00.0/operators type node tx_share 20Mbit tx_max 100Mbit tx_priority 2 tx_weight 5
pci/0000:03:00.0/class_1 type node parent operators
pci/0000:03:00.0/1 type leaf parent class_1

详情请参阅 devlink-rate 手册页和其他文档。


支持的复位类型

驱动支持用户可以使用 ethtool 执行的几种复位类型。ethtool 复位标志映射到 E810 复位类型:

PF 复位:

ethtool --reset <ethX> irq dma filter offload

CORE 复位:

ethtool --reset <ethX> irq-shared dma-shared filter-shared offload-shared \
  ram-shared

GLOBAL 复位:

ethtool --reset <ethX> irq-shared dma-shared filter-shared offload-shared \
  mac-shared phy-shared ram-shared

在端口 representor 上调用相同的标志集会触发 VF 复位。


性能优化

驱动默认值旨在适应各种工作负载,但如果需要进一步优化,我们建议尝试以下设置。

发送/接收队列分配

驱动分配的发送/接收队列对数量等于本地节点 CPU 线程数,并受以下约束:

  • 驱动将分配最少 8 个队列对,或 CPU 总数,以较低者为准。
  • 驱动将分配最多 64 个队列对(iavf 驱动为 256)。

您可以使用 ethtool -L 命令设置对称(Rx/Tx)或不对称(combined 与 Tx 或 Rx 混合)队列的数量。使用 combined 参数设置配置的对称部分,然后使用 rx 或 tx 设置配置的剩余不对称部分。例如:

  • 设置 16 个队列对,无论之前的配置如何:

    ethtool -L <ethX> combined 16 rx 0 tx 0
    

    注意:
    如果当前配置已经是对称的,您可以省略 rx 和 tx 参数。例如:

    ethtool -L <ethX> combined 16
    
  • 设置 16 个 Tx 队列和 8 个 Rx 队列:

    ethtool -L <ethX> combined 8 tx 8
    

注意:

  • 您不能配置少于 1 个队列对。尝试这样做将被内核拒绝。
  • 您不能配置超过可用 MSI-X 中断数量的 Tx/Rx 队列。尝试这样做将被驱动拒绝。
  • ethtool 会独立保留 combined、rx 和 tx 的先前值,与处理标志的方式相同。如果您未在命令中指定某个值,它将保持不变,而不是被设置为零。
  • Tx/Rx 队列不能同时存在于队列对之外,因此 rx 或 tx 参数之一必须为零。

IRQ 与适配器队列对齐

通过禁用 irqbalance 服务并使用附带的 set_irq_affinity 脚本,将适配器的 IRQ 固定到特定核心。更多选项请参阅脚本的帮助文本。

  • 以下设置将在所有核心上均匀分配 IRQ:

    scripts/set_irq_affinity -x all <interface1> , [ <interface2>, ... ]
    
  • 以下设置将在适配器本地的所有核心(同一 NUMA 节点)上分配 IRQ:

    scripts/set_irq_affinity -x local <interface1> ,[ <interface2>, ... ]
    
  • 对于非常耗 CPU 的工作负载,我们建议将 IRQ 固定到所有核心。

Rx 描述符环大小

为减少 Rx 数据包丢弃数量,使用 ethtool 增加每个 Rx 环的 Rx 描述符数量。

  • 检查接口是否因缓冲区已满而丢弃 Rx 数据包(rx_dropped.nic 可能意味着没有 PCIe 带宽):

    ethtool -S <ethX> | grep "rx_dropped"
    
  • 如果上一个命令显示队列上有丢弃,使用 ethtool -G 增加描述符数量可能会有帮助,其中 <N> 为所需的环条目/描述符数量:

    ethtool -G <ethX> rx <N>
    

    这可以为造成延迟的问题提供临时缓冲,而 CPU 正在处理描述符。

中断速率限制

此驱动支持为一般工作负载调优的自适应中断调节速率(ITR)机制。用户可以通过 ethtool 为特定工作负载自定义中断速率控制,调整中断之间的微秒数。

手动设置中断速率,必须禁用自适应模式:

ethtool -C <ethX> adaptive-rx off adaptive-tx off

降低 CPU 利用率:

  • 禁用自适应 ITR 并降低 Rx 和 Tx 中断。下面的示例影响指定接口的每个队列。

  • 将 rx-usecs 和 tx-usecs 设置为 80,将把中断限制为每队列每秒约 12,500 次中断:

    ethtool -C <ethX> adaptive-rx off adaptive-tx off rx-usecs 80 tx-usecs 80
    

降低延迟:

  • 禁用自适应 ITR 并通过 ethtool 将 rx-usecs 和 tx-usecs 设置为 0 来禁用 ITR:

    ethtool -C <ethX> adaptive-rx off adaptive-tx off rx-usecs 0 tx-usecs 0
    

每队列中断速率设置:

  • 以下示例针对队列 1 和 3,但您可以调整其他队列。

  • 为队列 1 和 3 禁用 Rx 自适应 ITR 并将静态 Rx ITR 设置为 10 微秒(约每秒 100,000 次中断):

    ethtool --per-queue <ethX> queue_mask 0xa --coalesce adaptive-rx off rx-usecs 10
    
  • 显示队列 1 和 3 的当前合并设置:

    ethtool --per-queue <ethX> queue_mask 0xa --show-coalesce
    

使用 rx-usecs-high 限制中断速率:

  • 有效范围:0-236(0 = 无限制)

  • 0-236 微秒的范围提供每秒 4,237 到 250,000 次中断的有效范围。rx-usecs-high 的值可以在同一个 ethtool 命令中独立于 rx-usecs 和 tx-usecs 设置,也独立于自适应中断调节算法。底层硬件支持 4 微秒间隔的粒度,因此相邻值可能导致相同的中断速率。

  • 以下命令将禁用自适应中断调节,并允许在指示接收或发送完成之前最多 5 微秒。但是,它不会导致每秒多达 200,000 次中断,而是通过 rx-usecs-high 参数将每秒总中断数限制为 50,000:

    ethtool -C <ethX> adaptive-rx off adaptive-tx off rx-usecs-high 20 \
      rx-usecs 5 tx-usecs 5
    

虚拟化环境

除了本节中的其他建议外,以下建议可能有助于优化虚拟机中的性能:

  • 在虚拟机中使用适当的机制(vcpupin)将 CPU 固定到各个 LCPU,确保使用包含在设备的 local_cpulist 中的一组 CPU:

    /sys/class/net/<ethX>/device/local_cpulist
    
  • 在虚拟机中配置尽可能多的 Rx/Tx 队列(请参阅 iavf 驱动文档了解支持的队列数量)。例如:

    ethtool -L <virt_interface> rx <max> tx <max>
    

发送调度层

ice 硬件在调度树中使用具有固定层数的分层调度来发送。每一层都是决策点。根节点代表一个端口,而所有叶节点代表队列。这种配置 Tx 调度器的方式允许 DCB 或 devlink-rate(如下文所述)等功能来配置给予任何给定队列或队列组的带宽,从而实现细粒度控制,因为调度参数可以在树的任何给定层配置。

默认的 9 层树拓扑被认为最适合大多数工作负载,因为它提供了性能与可配置性的最佳比率。但是,对于某些特定情况,9 层拓扑可能不是所需的。一个例子是向不是 8 的倍数的队列发送流量。由于 9 层拓扑中的最大基数(radix)限制为 8,第 9 个队列与其他队列具有不同的父节点,并获得更多带宽配额。当系统向 9 个队列发送流量时,这会导致问题:

| tx_queue_0_packets: 24163396
| tx_queue_1_packets: 24164623
| tx_queue_2_packets: 24163188
| tx_queue_3_packets: 24163701
| tx_queue_4_packets: 24163683
| tx_queue_5_packets: 24164668
| tx_queue_6_packets: 23327200
| tx_queue_7_packets: 24163853
| tx_queue_8_packets: 91101417 < 第 9 个队列发送的流量过多

为解决此需求,您可以切换到 5 层拓扑,它将最大拓扑基数更改为 512。通过此增强,所有队列都可以分配给树中的同一个父节点,性能特性是相等的。此解决方案的明显缺点是树的配置深度较低。

使用 devlink 命令和 tx_scheduling_layer 参数来更改发送调度器拓扑。要使用 5 层拓扑,请使用值 5。例如:

devlink dev param set pci/0000:16:00.0 name tx_scheduling_layers \
  value 5 cmode permanent

使用值 9 将其设置回默认值。您必须对 PCI 插槽进行断电循环(powercycle),所选的拓扑才能生效。

验证值是否已设置:

devlink dev param show pci/0000:16:00.0 name tx_scheduling_layers

MSI-X 向量分配

ice 驱动从 2048 个向量的池中自动为 PF、VF 和 RDMA 分配 MSI-X 向量。如果本地节点 CPU 线程数为 8 或更少,驱动将自动为每个 PF 分配 8 个向量。这通过为每个本地节点 CPU 线程分配一个向量来扩展,最多 64 个向量。

驱动不会为每个 PF 自动分配超过 64 个 MSI-X 向量。RDMA 需要比 PF 分配多一个 MSI-X 向量,因此驱动将自动为 RDMA 分配 9-65 个 MSI-X 向量。

您可以使用 sysfs 覆盖特定 PF 或 RDMA 功能的自动 MSI-X 向量分配,或覆盖绑定到 PF 的 VF 所使用的向量池:

devlink resource set <pci/D:b:d.f> path msix/<parameter> size <num>

其中:

  • <pci/D:b:d.f>:设备的 PCI 地址(pci/Domain🚌device.function)。
  • <parameter>:为以下之一:
    • 对于 PF,使用 msix_eth 参数。
    • 对于 RDMA 功能,使用 msix_rdma 参数。
    • 对于 VF 使用的向量池,使用 msix_vf 参数。
  • <num>:分配给该功能的 MSI-X 向量数量。

例如,设置 PF 使用 320 个 MSI-X 向量:

devlink resource set pci/0000:31:00.1 path msix/msix_eth size 320

注意:
要使此更改生效,您必须在进行此更改后重新初始化驱动。重新初始化驱动可能会丢弃一些网络设备配置,包括复位或停机。更多信息请参阅 Devlink Reload 文档。

您可以使用 sriov_vf_msix_count sysfs 参数为特定 VF 设置分配:

echo <num> > /sys/bus/pci/devices/D:b:d.f/sriov_vf_msix_count

其中:

  • <D:b:d.f>:设备的 PCI 地址(Domain🚌device.function)。
  • <num>:分配给特定 VF 的 MSI-X 向量数量。

例如,将 VF 设置为 64 个 MSI-X 向量:

echo 64 > /sys/bus/pci/devices/0000:31:00.2/sriov_vf_msix_count

注意:
对于某些 Linux 发行版,sriov_vf_msix_count 参数不可用,建议使用 devlink 参数。

您可以使用 devlink resource show 参数检查当前的 MSI-X 向量分配。例如:

devlink resource show pci/0000:31:00.1

可能返回:

name: msix size 520 occ 262 unit entry dpipe_tables none
resources:
  name msix_misc size 4 unit entry dpipe_tables none
  name: msix_eth size 48 occ 24 unit
  name: msix_vf size 48 occ 24 unit
  name: msix_rdma size 48 occ 24 unit

ice 驱动支持更改 PF 和 VF 的自动 MSI-X 向量和队列分配,以将 RSS 负载分散到更多核心。

每个 PF 默认拥有 2048 个条目的 PF 查找表(LUT)的所有权,每个 VF 获得 64 个条目的 VSI LUT。有 16 个全局 LUT,每个 512 个条目,允许使用 64 个队列对,可分配给 VF 和 PF。

PF 默认 MSI-X 计数等于本地 CPU 核心数,允许使用多达 256 个队列对。

VF 默认为 16 个 MSI-X 向量,允许使用 16 个队列对。这可以进一步受可用本地 CPU 核心数限制。通常 1 个 MSI-X 向量映射到一个 TX 队列对。

PF 上的其他功能(如基本控制和 RDMA)需要若干 MSI-X 向量。

使用 rss_lut_pf_attr 和 rss_lut_vf_attr sysfs 参数管理 VF 和 PF 的 LUT 大小。

  • 您可以分别更改 PF 和 VF 的 MSI-X 计数和 LUT 大小。
  • 在将 VF 的 MSI-X 向量限制增加到预期的队列对数量并将 PF 的 LUT 减小到全局 LUT 大小 512 之后,您可以将 PF LUT 分配给绑定的 VF。

注意:

  • 在更改 rss_lut_vf_attr 之前,必须先将 sriov_drivers_autoprobe 设置为零。更改 rss_lut_vf_attr 后,可以将 sriov_drivers_autoprobe 设置回 1。
  • 进行这些更改后,您必须重新加载 iavf 驱动。

将 VF 的队列对限制设置为最多 64,使用全局 LUT:

echo 0 > /sys/bus/pci/devices/<ethx>/sriov_drivers_autoprobe
echo 512 > /sys/bus/pci/devices/<ethx>/rss_lut_vf_attr

将 VF 设置为使用其 PF 的 LUT:

echo 0 > /sys/bus/pci/devices/<ethx>/sriov_drivers_autoprobe
echo 512 > /sys/bus/pci/devices/<ethx>/rss_lut_pf_attr
echo 2048 > /sys/bus/pci/devices/<ethx>/rss_lut_vf_attr

将 PF 设置回使用其 PF LUT:

echo 0 > /sys/bus/pci/devices/<ethx>/sriov_drivers_autoprobe
echo 64 > /sys/bus/pci/devices/<ethx>/rss_lut_vf_attr
echo 2048 > /sys/bus/pci/devices/<ethx>/rss_lut_pf_attr

ice 驱动支持监控芯片的内部温度。

通过匹配 PCI 地址来识别设备的 hwmon 接口。例如使用:

tree /sys/class/hwmon/

可能返回:

/sys/class/hwmon/
├── <hwmonX> -> ../../devices/pci0000:<bus>/<pci-addresss-id>/hwmon/hwmon0

温度数据可通过 sysfs 接口访问:

cat /sys/class/hwmon/<hwmonX>/temp1_input

温度值以毫摄氏度(millidegrees Celsius)报告。


已知问题/故障排查

接收错误计数可能高于实际数据包错误计数

当接收到的数据包有多个错误时,可能报告两个坏数据包。这影响所有基于 10G 或更快控制器的设备。

动态调试

如果在驱动加载期间遇到意外问题,错误报告中最有用的信息对开发人员来说可以包括驱动日志记录。此日志记录使用称为动态调试(Dynamic Debug)的内核功能,大多数内核配置中都启用了它(CONFIG_DYNAMIC_DEBUG=y)。

使用动态调试启用的情况下加载驱动:

modprobe ice dyndbg=+p

然后驱动将加载并将调试信息打印到内核日志(dmesg)中,通常会记录到系统日志中,可通过 journalctl 查看,或位于 /var/log/messages 中。将此信息保存到文件并附加到任何错误报告中,可以帮助开发人员缩短复现和调试时间。

在驱动运行期间启用动态调试:

echo "module ice +p" > /sys/kernel/debug/dynamic_debug/control

更多详情,请参阅 Linux 内核说明中包含的动态调试文档。

PF 消息队列溢出

设备驱动可以检测某些类型的异常行为。当它检测到异常行为时,将记录 VF MAC 地址和关联的 PF MAC 地址。使用此信息,您可以检查正在使用该 VF MAC 地址的虚拟机(VM),以确保 VM 正常运行。

ethtool -S 不显示 Tx/Rx 数据包统计信息

执行命令 ethtool -S 不显示 Tx/Rx 数据包统计信息。这是约定。请使用显示标准网络设备统计信息的其他工具(如 ip 命令)来显示 Tx/Rx 数据包统计信息。

ethtool -S 的 rx_bytes 与 ip 统计的 rx_bytes 不匹配

由于设备剥离了 4 字节 CRC,ethtool 的 rx_bytes 值与 Netdev 的 rx_bytes 值不匹配。两个 rx_bytes 值之间的差值将是 4 × Rx 数据包数。例如,如果 Rx 数据包为 10,Netdev(软件统计)显示 rx_bytes 为 "X",则 ethtool(硬件统计)将显示 rx_bytes 为 "X+40"(4 字节 CRC × 10 个数据包)。

设备驱动与 DPDK 共享设备时的意外问题

当 ice 设备处于多驱动模式且内核驱动和 DPDK 驱动共享设备时,可能会出现意外问题。这是因为多个驱动之间对全局 NIC 资源的访问不同步。对全局 NIC 配置的任何更改(写入全局寄存器、通过 AQ 设置全局配置或更改交换模式)将影响设备上的所有端口和所有驱动。使用 multi-driver 模块参数加载 DPDK 可能会缓解部分问题。

光纤与自动协商

基于 100GBASE-SR4、有源光缆(AOC)和有源铜缆(ACC)的模块按照 IEEE 规范不支持自动协商。要使用这些模块获得链路,您必须关闭链路对端交换机端口上的自动协商。

ethtool -a 自动协商结果可能因驱动而异

对于内核版本 4.6 或更高版本,ethtool -a 将显示通告和协商的自动协商设置。对于低于 4.6 的内核版本,ethtool 将只报告协商的链路状态。

该问题是外观上的,不影响功能。安装最新的 ice 驱动并将内核升级到 4.6 或更高版本将解决此问题。

AF_XDP 分配缓冲区失败

在内核 5.3 之前的版本上,如果您以原生模式启用 AF_XDP 且 Rx 环大小大于 UMEM 填充队列,您可能会在数据包处理期间看到不理想的 CPU 负载。这是由于内核中的已知问题,已在 5.3 中修复。要解决此问题,请将内核升级到 5.3 或更新版本。

Geneve 隧道上未指示 SCTP 校验和卸载

对于 Geneve 隧道上的 SCTP 流量,即使 tx-checksum-sctp 开启,SCTP 校验和也不会卸载到设备。这是 Linux 内核的限制。但是,对于 Rx 流量,如果 rx-checksum 开启,则会验证 SCTP 校验和。对于 Tx 和 Rx 流量,您都可以将外部 UDP 校验和卸载到设备。

CentOS* 7.2 问题

以下问题特定于 CentOS* 7.2:

  • base-r-fec 模式默认应开启。在 CentOS 7.2 上,ethtool --show-priv-flags 显示它为关闭,而不是开启。

  • ethtool -m <ethX> 不按预期显示光模块信息。

  • 您无法创建 IPv6 Intel(R) 以太网流量导向器规则。例如,以下命令返回错误语法:

    ethtool -U p1p1 flow-type tcp6 src-ip 3001:1::2:1:1 dst-ip 3001:1::1:1:1 \
      src-port 22 dst-port 23 action 10
    

升级到最新版本的操作系统将解决这些问题。

旧版 VF 驱动上报告的链路速度不正确

带有旧版 iavf 或 i40evf 驱动的 Linux 发行版(包括 Red Hat Enterprise Linux 8)可能在 VF 接口上显示不正确的链路速度。此问题是外观上的,不影响 VF 功能。要解决此问题,请下载最新的 iavf 驱动。

Intel 以太网 800 系列适配器上的旧版 VF 驱动

某些 Release 22.9 或更早版本的 Windows* VF 驱动在 Linux KVM 上加载到基于 Intel 以太网 800 系列的 PF 上时可能会遇到错误。您可能会看到错误,并且 VF 可能无法加载。从以下 Windows VF 驱动版本开始,此问题不会发生:

  • v40e64、v40e65:1.5.65.0 及更新版本

要解决此问题,请下载并安装最新的 iavf 驱动。

主机上 dmesg 中出现 "VF X failed opcode 24" 错误消息

在 Linux 主机上运行 Microsoft Windows Server 2019 客户机时,您可能会在主机上的 dmesg 中看到 "VF <vf_number> failed opcode 24" 错误消息。此错误是无害的,不影响流量。在客户机中安装最新的 iavf 驱动将解决此问题。

Linux 主机上的 Windows 客户机操作系统可能无法跨 VLAN 传输流量

如果您使用负载均衡和故障转移(LBFO)在 Windows 客户机中配置 VLAN,则 VF 不知道 VLAN 配置。在 VF 驱动上使用 LBFO 配置的 VLAN 可能会导致无法传输流量。

SR-IOV 虚拟功能具有相同的 MAC 地址

当您创建多个 SR-IOV 虚拟功能时,VF 可能具有相同的 MAC 地址。只有一个 VF 会传输流量,所有其他具有相同 MAC 地址的 VF 上的流量都将失败。这与 /usr/lib/systemd/network/99-default.link 中的 MACAddressPolicy=persistent 设置有关。

要解决此问题,请编辑 /usr/lib/systemd/network/99-default.link 文件,并将 MACAddressPolicy 行更改为 MACAddressPolicy=none。更多信息请参阅 systemd.link 手册页。

在 VF 上创建最大数量 VLAN 时 dmesg 中出现 MDD 事件

当您在 VF 上创建最大数量的 VLAN 时,您可能会在主机上的 dmesg 中看到 MDD 事件。这是由于 iavf 驱动的异步设计。它总是对任何 VLAN 请求报告成功,但请求可能随后失败。客户机操作系统可能尝试在未配置 VLAN 的 VF 上发送流量,这将导致主机上 dmesg 中出现恶意驱动检测(MDD)事件。

此问题是外观上的。您不需要重新加载 PF 驱动。

在配置了 245 个或更多 VF 的单端口适配器上的 Linux 主机上使用 ip address 或 ip link 命令时,您可能会遇到 "Buffer too small for object" 错误。这是由于 iproute2 工具中的已知问题。请使用 ifconfig 代替 iproute2。您可以通过 net-tools-deprecated 软件包安装 ifconfig。

与内核自带 irdma 驱动的符号不匹配

当树外 ice 驱动与内核自带 irdma 驱动一起安装时,内核将在加载树外 ice 驱动后报告缺少符号:

irdma: Unknown symbol ice_del_rdma_qset
irdma: Unknown symbol ice_add_rdma_qset
irdma: Unknown symbol ice_rdma_update_vsi_filter
irdma: Unknown symbol ice_rdma_request_reset
irdma: Unknown symbol ice_get_qos_params

在安装 ice.ko 驱动的签名二进制版本(适用于 SLES 和 RHEL 发行版)时,depmod 也会报告缺少的符号,从而阻止创建 weak-updates 符号链接:

Warning: weak-updates symlinks might not be created
depmod: WARNING: /lib/modules/5.14.21-150400.22-default/kernel/drivers/infiniband/hw/irdma/irdma.ko.zst needs unknown symbol ice_del_rdma_qset
depmod: WARNING: /lib/modules/5.14.21-150400.22-default/kernel/drivers/infiniband/hw/irdma/irdma.ko.zst needs unknown symbol ice_add_rdma_qset
depmod: WARNING: /lib/modules/5.14.21-150400.22-default/kernel/drivers/infiniband/hw/irdma/irdma.ko.zst needs unknown symbol ice_rdma_update_vsi_filter
depmod: WARNING: /lib/modules/5.14.21-150400.22-default/kernel/drivers/infiniband/hw/irdma/irdma.ko.zst needs unknown symbol ice_rdma_request_reset
depmod: WARNING: /lib/modules/5.14.21-150400.22-default/kernel/drivers/infiniband/hw/irdma/irdma.ko.zst needs unknown symbol ice_get_qos_params

要抑制这些消息,用户必须手动删除内核自带的 irdma 驱动,或安装兼容的树外 irdma 驱动。


技术支持

有关一般信息,请访问 Intel 支持网站:
https://www.intel.com/support/

或 Intel 托管在 GitHub 上的以太网 Linux 项目:
https://github.com/intel/ethernet-linux-ice

如果在受支持的内核和受支持的适配器上发现已发布源代码存在问题,请联系 Intel 客户支持:
https://www.intel.com/content/www/us/en/support/products/36773/ethernet-products.html


许可证

本程序是自由软件;您可以根据自由软件基金会发布的 GNU 通用公共许可证第 2 版的条款和条件重新分发和/或修改它。

本程序的发布希望它有用,但不附带任何担保;甚至不附带适销性或特定用途适用性的默示担保。有关更多详情,请参阅 GNU 通用公共许可证。

您应该已经随本程序收到了 GNU 通用公共许可证的副本;如果没有,请写信给 Free Software Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA。

完整的 GNU 通用公共许可证包含在本发行版中名为 "COPYING" 的文件中。

版权所有 (c) 2017 - 2024 Intel Corporation。


商标

Intel 是 Intel Corporation 或其子公司在美国和/或其他国家的商标或注册商标。

其他名称和品牌可能是其各自所有者的财产。

posted @ 2026-09-28 17:22  LoftyAmbition  阅读(24)  评论(0)    收藏  举报