Intel(R) Ethernet Controller 800 系列的 Linux 基础驱动程序¶
Intel ice Linux 驱动程序。版权所有 (c) 2018-2021 Intel Corporation。
目录¶
概述
识别您的适配器
重要说明
附加功能和配置
性能优化
此驱动程序关联的虚拟功能 (VF) 驱动程序是 iavf。
驱动程序信息可通过 ethtool 和 lspci 获取。
有关硬件要求的问题,请参阅 Intel 适配器随附的文档。所有列出的硬件要求均适用于 Linux 环境。
此驱动程序支持 XDP (Express Data Path) 和 AF_XDP 零拷贝。请注意,XDP 会阻止大于 3KB 的帧。
识别您的适配器¶
有关如何识别您的适配器以及获取最新 Intel 网络驱动程序的信息,请访问 Intel 支持网站:https://www.intel.com/support
重要说明¶
接收压力下可能出现丢包¶
基于 Intel(R) Ethernet Controller 800 系列的设备设计用于在 PCIe 和 DMA 事务期间容忍有限的系统延迟。如果这些事务花费的时间超过可容忍的延迟,则可能会影响数据包在设备和相关内存中缓冲的时间长度,从而可能导致丢包。在标准工作负载下,这些丢包通常不会对吞吐量和性能产生明显影响。
如果这些丢包似乎影响您的工作负载,以下方法可能会改善情况:
确保您的系统物理内存处于平台供应商推荐的高性能配置。常见建议是所有通道都填充单个 DIMM 模块。
在系统的 BIOS/UEFI 设置中,选择“性能”配置文件。
您的发行版可能会提供“tuned”等工具,它们可以帮助调整内核设置以针对不同的工作负载实现更好的标准设置。
配置 SR-IOV 以提高网络安全性¶
在虚拟化环境中,对于支持 SR-IOV 的 Intel(R) 以太网网络适配器,虚拟功能 (VF) 可能会受到恶意行为的影响。软件生成的二层帧,如 IEEE 802.3x(链路流控制)、IEEE 802.1Qbb(基于优先级的流控制)以及其他此类帧,是不期望的,并且可能会限制主机与虚拟交换机之间的流量,从而降低性能。为了解决此问题并确保与非预期流量流隔离,请从 PF 上的管理接口配置所有支持 SR-IOV 的端口进行 VLAN 标记。此配置允许丢弃意外的、可能是恶意的帧。
有关配置说明,请参阅本 README 文件后面的“在 SR-IOV 启用的适配器端口上配置 VLAN 标记”部分。
如果 VF 绑定了活动的 VM,请勿卸载端口驱动程序¶
如果绑定了活动的虚拟机 (VM) 的虚拟功能 (VF),请勿卸载端口的驱动程序。这样做会导致端口看似挂起。一旦 VM 关闭或以其他方式释放 VF,该命令将完成。
附加功能和配置¶
ethtool¶
该驱动程序利用 ethtool 接口进行驱动程序配置和诊断,以及显示统计信息。此功能需要最新版本的 ethtool。请从以下网址下载:https://linuxkernel.org.cn/pub/software/network/ethtool/
注意:ethtool 的 rx_bytes 值与 Netdev 的 rx_bytes 值不匹配,原因是设备剥离了 4 字节的 CRC。两个 rx_bytes 值之间的差值将是 Rx 数据包数量的 4 倍。例如,如果 Rx 数据包为 10,并且 Netdev(软件统计)显示 rx_bytes 为“X”,则 ethtool(硬件统计)将显示 rx_bytes 为“X+40”(4 字节 CRC x 10 个数据包)。
ethtool 重置¶
驱动程序支持 3 种类型的重置
PF 重置 - 仅重置与给定 PF 关联的组件,不影响其他 PF
CORE 重置 - 整个适配器受影响,重置所有 PF
GLOBAL 重置 - 与 CORE 相同,但 mac 和 phy 组件也重新初始化
这些映射到 ethtool 重置标志如下
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
在 switchdev 模式下,您可以使用端口代表重置 VF
# ethtool --reset <repr> irq dma filter offload
查看链路消息¶
如果发行版限制系统消息,则链路消息将不会显示在控制台上。为了在控制台上查看网络驱动程序链路消息,请通过输入以下命令将 dmesg 设置为八
# dmesg -n 8
注意:此设置不会在重新启动后保存。
动态设备个性化¶
动态设备个性化 (DDP) 允许您通过在运行时将配置文件包应用于设备来更改设备的包处理管道。例如,配置文件可用于添加对新协议的支持、更改现有协议或更改默认设置。DDP 配置文件也可以在不重新启动系统的情况下回滚。
DDP 包在设备初始化期间加载。驱动程序会在固件根目录(通常是 /lib/firmware/
或 /lib/firmware/updates/
)中查找 intel/ice/ddp/ice.pkg
,并检查它是否包含有效的 DDP 包文件。
注意:您的发行版应该已经提供了最新的 DDP 文件,但如果 ice.pkg 缺失,您可以在 linux-firmware 存储库或 intel.com 上找到它。
如果驱动程序无法加载 DDP 包,设备将进入安全模式。安全模式禁用高级和性能功能,仅支持基本流量和最小功能,例如更新 NVM 或下载新的驱动程序或 DDP 包。安全模式仅适用于受影响的物理功能,不影响任何其他 PF。有关 DDP 和安全模式的更多详细信息,请参阅“Intel(R) 以太网适配器和设备用户指南”。
注意事项
如果您遇到 DDP 包文件问题,可能需要下载更新的驱动程序或 DDP 包文件。有关更多信息,请参阅日志消息。
ice.pkg 文件是指向默认 DDP 包文件的符号链接。
如果任何 PF 驱动程序已加载,则无法更新 DDP 包。要覆盖包,请卸载所有 PF,然后使用新包重新加载驱动程序。
每个设备上只有第一个加载的 PF 可以为该设备下载包。
您可以在同一系统中为不同的物理设备安装特定的 DDP 包文件。要安装特定的 DDP 包文件
下载您想要的设备 DDP 包文件。
将文件重命名为 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
将重命名的 DDP 包文件复制到
/lib/firmware/updates/intel/ice/ddp/
。如果该目录尚不存在,请在复制文件之前创建它。卸载设备上的所有 PF。
使用新包重新加载驱动程序。
注意:设备特定 DDP 包文件的存在会覆盖默认 DDP 包文件 (ice.pkg) 的加载。
Intel(R) 以太网流导向器¶
Intel 以太网流导向器执行以下任务:
根据其流将接收到的数据包定向到不同的队列
允许严格控制平台中流的路由
匹配流和 CPU 核心以实现流亲和性
注意:此驱动程序支持以下流类型:
IPv4
TCPv4
UDPv4
SCTPv4
IPv6
TCPv6
UDPv6
SCTPv6
每种流类型都支持 IP 地址(源或目标)和 UDP/TCP/SCTP 端口(源和目标)的有效组合。您只能提供源 IP 地址、源 IP 地址和目标端口,或者这四个参数中的一个或多个的任意组合。
注意:此驱动程序允许您通过使用 ethtool 的 user-def 和 mask 字段,基于用户定义的灵活的两个字节模式和偏移来过滤流量。仅支持 L3 和 L4 流类型的用户定义的灵活过滤器。对于给定的流类型,您必须在更改输入集(针对该流类型)之前清除所有 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>
Where:
<ethX> - the Ethernet device to program
<type> - can be ip4, tcp4, udp4, sctp4, ip6, tcp6, udp6, sctp6
<ip> - the IP address to match on
<ip_mask> - the IPv4 address to mask on
NOTE: These filters use inverted masks.
<port> - the port number to match on
<port_mask> - the 16-bit integer for masking
NOTE: These filters use inverted masks.
<queue> - the queue to direct traffic toward (-1 discards the
matched traffic)
删除过滤器
# ethtool -U <ethX> delete <N>
Where <N> is the filter ID displayed when printing all the active filters,
and may also have been specified using "loc <N>" when adding the filter.
示例
添加将数据包定向到队列 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]
基于用户定义的模式和偏移设置过滤器
# 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]
where the value of the user-def field contains the offset (4 bytes) and
the pattern (0xffff).
匹配从 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 过滤器
# 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 驱动程序不支持匹配字段的子部分,因此不支持部分掩码字段。
灵活字节流导向器过滤器¶
驱动程序还支持匹配数据包负载中的用户定义数据。这种灵活数据通过 ethtool 命令的“user-def”字段以如下方式指定:
|
|
|
|
例如,
... 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>
Where <type> is:
tcp4 signifying TCP over IPv4
udp4 signifying UDP over IPv4
gtpc4 signifying GTP-C over IPv4
gtpc4t signifying GTP-C (include TEID) over IPv4
gtpu4 signifying GTP-U over IPV4
gtpu4e signifying GTP-U and Extension Header over IPV4
gtpu4u signifying GTP-U PSC Uplink over IPV4
gtpu4d signifying GTP-U PSC Downlink over IPV4
tcp6 signifying TCP over IPv6
udp6 signifying UDP over IPv6
gtpc6 signifying GTP-C over IPv6
gtpc6t signifying GTP-C (include TEID) over IPv6
gtpu6 signifying GTP-U over IPV6
gtpu6e signifying GTP-U and Extension Header over IPV6
gtpu6u signifying GTP-U PSC Uplink over IPV6
gtpu6d signifying GTP-U PSC Downlink over IPV6
And <option> is one or more of:
s Hash on the IP source address of the Rx packet.
d Hash on the IP destination address of the Rx packet.
f Hash on bytes 0 and 1 of the Layer 4 header of the Rx packet.
n Hash on bytes 2 and 3 of the Layer 4 header of the Rx packet.
e Hash on GTP Packet on TEID (4bytes) of the Rx packet.
加速接收流导向 (aRFS)¶
基于 Intel(R) Ethernet Controller 800 系列的设备在 PF 上支持加速接收流导向 (aRFS)。aRFS 是一种负载均衡机制,允许您将数据包导向运行或消费该流中数据包的同一 CPU。
注意事项
aRFS 要求通过 ethtool 启用 ntuple 过滤。
aRFS 支持仅限于以下数据包类型:
TCP over IPv4 和 IPv6
UDP over IPv4 和 IPv6
非分片数据包
aRFS 仅支持流导向器过滤器,包括源/目标 IP 地址和源/目标端口。
aRFS 和 ethtool 的 ntuple 接口都使用设备的流导向器。aRFS 和 ntuple 功能可以共存,但如果 aRFS 和 ntuple 请求之间存在冲突,您可能会遇到意外结果。有关更多信息,请参阅“Intel(R) 以太网流导向器”。
设置 aRFS
使用 ethtool 启用 Intel 以太网流导向器和 ntuple 过滤器。
# ethtool -K <ethX> ntuple on
设置全局流表中的条目数。例如:
# NUM_RPS_ENTRIES=16384
# echo $NUM_RPS_ENTRIES > /proc/sys/net/core/rps_sock_flow_entries
设置每个队列流表中的条目数。例如:
# 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
禁用 IRQ 平衡守护程序(这只是在下次重启之前暂时停止服务)。
# systemctl stop irqbalance
配置中断亲和性。
请参阅
/Documentation/core-api/irq/irq-affinity.rst
使用 ethtool 禁用 aRFS
# ethtool -K <ethX> ntuple off
注意:此命令将禁用 ntuple 过滤器并清除软件和硬件中的所有 aRFS 过滤器。
示例用例
在所需的 CPU(例如 CPU 4)上设置服务器应用程序。
# taskset -c 4 netserver
使用 netperf 将流量从客户端路由到配置了 aRFS 的服务器上的 CPU 4。本示例使用 TCP over IPv4。
# netperf -H <Host IPv4 Address> -t TCP_STREAM
启用虚拟功能 (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
注意:当链路聚合 (LAG)/绑定处于活动状态时,不能使用 SR-IOV,反之亦然。为了强制执行此操作,驱动程序会检查此互斥。
在 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 驱动程序加载或 VM 启动之前完成。VF 不知道在传输时插入并在接收帧时移除的 VLAN 标记(有时称为“端口 VLAN”模式)。
# ip link set dev <ethX> vf <id> vlan <vlan id>
例如,以下命令将配置 PF eth0 和 VLAN 10 上的第一个 VF
# ip link set dev eth0 vf 0 vlan 10
如果端口断开连接,则启用 VF 链路¶
如果物理功能 (PF) 链路已关闭,您可以在绑定到 PF 的任何虚拟功能 (VF) 上强制链路启动(从主机 PF)。
例如,要强制绑定到 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 分配 MAC 地址将禁用随后从 VM 内部更改 MAC 地址的任何请求。这是一项安全功能。VM 不知道此限制,因此如果在 VM 中尝试此操作,将触发 MDD 事件。
受信任的 VF 和 VF 混杂模式¶
此功能允许您将特定 VF 指定为受信任,并允许该受信任的 VF 请求物理功能 (PF) 上的选择性混杂模式。
要在 Hypervisor 中将 VF 设置为受信任或不受信任,请输入以下命令
# ip link set dev <ethX> vf 1 trust [on|off]
注意:在设置混杂模式之前,将 VF 设置为受信任非常重要。如果 VM 不受信任,PF 将忽略来自 VF 的混杂模式请求。如果 VF 驱动程序加载后 VM 变得受信任,则必须发出新请求以将 VF 设置为混杂模式。
一旦 VF 被指定为受信任,请在 VM 中使用以下命令将 VF 设置为混杂模式。
对于全部混杂
# ip link set <ethX> promisc on
Where <ethX> is a VF interface in the VM
对于多播混杂
# ip link set <ethX> allmulticast on
Where <ethX> is a VF interface in the VM
注意:默认情况下,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 命令启用混杂模式时将获得的混杂模式类型(有限或真实)。请注意,这是一个影响整个设备的全局设置。然而,vf-true-promisc-support 私有标志只暴露给设备的第一个 PF。无论 vf-true-promisc-support 设置如何,PF 都保持在有限混杂模式下。
接下来,在 VF 接口上添加一个 VLAN 接口。例如:
# ip link add link eth2 name eth2.100 type vlan id 100
请注意,设置 VF 为混杂模式和添加 VLAN 接口的顺序无关紧要(可以先做任何一个)。本例中的结果是 VF 将获得所有标记为 VLAN 100 的流量。
VF 的恶意驱动程序检测 (MDD)¶
一些 Intel 以太网设备使用恶意驱动程序检测 (MDD) 来检测来自 VF 的恶意流量,并禁用 Tx/Rx 队列或丢弃违规数据包,直到 VF 驱动程序重置。您可以使用 dmesg 命令在 PF 的系统日志中查看 MDD 消息。
如果 PF 驱动程序记录了来自 VF 的 MDD 事件,请确认已安装正确的 VF 驱动程序。
要恢复功能,您可以手动重新加载 VF 或 VM,或者启用自动 VF 重置。
当启用自动 VF 重置时,PF 驱动程序将在检测到接收路径上的 MDD 事件时立即重置 VF 并重新启用队列。
如果禁用自动 VF 重置,当检测到 MDD 事件时,PF 将不会自动重置 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}
巨型帧¶
通过将最大传输单元 (MTU) 更改为大于默认值 1500 的值来启用巨型帧支持。
使用 ifconfig 命令增加 MTU 大小。例如,输入以下命令,其中 <ethX> 是接口编号:
# ifconfig <ethX> mtu 9000 up
或者,您可以使用 ip 命令,如下所示:
# ip link set mtu 9000 dev <ethX>
# ip link set up dev <ethX>
此设置不会在重新启动后保存。
注意:巨型帧的最大 MTU 设置为 9702。这对应于最大巨型帧大小 9728 字节。
注意:此驱动程序将尝试使用多个页面大小的缓冲区来接收每个巨型数据包。这应该有助于避免在分配接收数据包时出现缓冲区饥饿问题。
注意:当您使用巨型帧时,丢包可能对吞吐量产生更大的影响。如果您在启用巨型帧后观察到性能下降,启用流控制可能会缓解此问题。
速度和双工配置¶
在解决速度和双工配置问题时,需要区分基于铜缆的适配器和基于光纤的适配器。
在默认模式下,使用铜缆连接的 Intel(R) 以太网网络适配器将尝试与链路伙伴进行自动协商以确定最佳设置。如果适配器无法使用自动协商与链路伙伴建立链路,您可能需要手动配置适配器和链路伙伴到相同的设置以建立链路和传输数据包。这只在尝试与不支持自动协商或已被强制设置为特定速度或双工模式的旧交换机进行链路时才需要。您的链路伙伴必须与您选择的设置匹配。1 Gbps 及更高速度无法强制设置。请使用自动协商广告设置手动设置设备以实现 1 Gbps 及更高速度。
速度、双工和自动协商广告通过 ethtool 工具配置。要获取最新版本,请从以下网站下载并安装 ethtool:
要查看您的设备支持的速度配置,请运行以下命令:
# ethtool <ethX>
注意:只有经验丰富的网络管理员才能手动强制设置速度和双工或更改自动协商广告。交换机上的设置必须始终与适配器设置匹配。如果您将适配器配置与交换机不同,适配器性能可能会受到影响或您的适配器可能无法运行。
数据中心桥接 (DCB)¶
注意:内核假定 TC0 可用,如果 TC0 不可用,将禁用设备上的优先级流控制 (PFC)。要解决此问题,请确保在交换机上设置 DCB 时启用 TC0。
DCB 是硬件中服务质量的配置实现。它使用 VLAN 优先级标签 (802.1p) 过滤流量。这意味着流量可以过滤到 8 个不同的优先级中。它还启用了优先级流控制 (802.1Qbb),这可以限制或消除网络压力期间丢包的数量。带宽可以分配给这些优先级中的每一个,这在硬件级别强制执行 (802.1Qaz)。
DCB 通常通过 DCBX 协议 (802.1Qaz) 在网络上配置,DCBX 是 LLDP (802.1AB) 的一种特化。ice 驱动程序支持以下互斥的 DCBX 支持变体:
基于固件的 LLDP 代理
基于软件的 LLDP 代理
在基于固件的模式下,固件会拦截所有 LLDP 流量并透明地为用户处理 DCBX 协商。在此模式下,适配器以“愿意”DCBX 模式运行,从链路伙伴(通常是交换机)接收 DCB 设置。本地用户只能查询协商的 DCB 配置。有关在交换机上配置 DCBX 参数的信息,请查阅交换机制造商的文档。
在基于软件的模式下,LLDP 流量被转发到网络堆栈和用户空间,由软件代理处理。在此模式下,适配器可以以“愿意”或“不愿意”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 配置。
不支持与 DCB 一起使用的 iSCSI。
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 代理”属性才能使此设置生效。如果“LLDP AGENT”设置为禁用,则无法从操作系统启用它。
流控制¶
以太网流控制 (IEEE 802.3x) 可以通过 ethtool 配置,以启用 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
NAPI¶
此驱动程序支持 NAPI(Rx 轮询模式)。
有关更多信息,请参阅 Documentation/networking/napi.rst。
MACVLAN¶
此驱动程序支持 MACVLAN。可以通过检查 MACVLAN 驱动程序是否已加载来测试内核对 MACVLAN 的支持。您可以运行“lsmod | grep macvlan”查看 MACVLAN 驱动程序是否已加载,或者运行“modprobe macvlan”尝试加载 MACVLAN 驱动程序。
注意事项
在直通模式下,您只能设置一个 MACVLAN 设备。它将继承底层 PF(物理功能)设备的 MAC 地址。
IEEE 802.1ad (QinQ) 支持¶
IEEE 802.1ad 标准,非正式地称为 QinQ,允许在单个以太网帧中存在多个 VLAN ID。VLAN ID 有时被称为“标签”,多个 VLAN ID 因此被称为“标签栈”。标签栈允许 L2 隧道和在特定 VLAN ID 中隔离流量,以及其他用途。
注意事项
802.1ad (QinQ) 数据包不支持接收校验和卸载和 VLAN 加速。
除非使用以下命令禁用 VLAN 剥离,否则不会接收 0x88A8 流量:
# ethtool -K <ethX> rxvlan off
0x88A8/0x8100 双 VLAN 不能与在同一端口上配置的 0x8100 或 0x8100/0x8100 VLAN 一起使用。如果配置了 0x8100 VLAN,则不会接收 0x88a8/0x8100 流量。
仅当满足以下条件时,VF 才能传输 0x88A8/0x8100 (即 802.1ad/802.1Q) 流量:
VF 未分配端口 VLAN。
PF 禁用了 spoofchk。如果启用 spoofchk,VF 将不会传输 0x88A8/0x8100 流量。
在 SR-IOV 模式下,当启用 VF 真实混杂模式 (vf-true-promisc-support) 和双 VLAN 时,VF 可能无法根据内部 VLAN 头部接收所有网络流量。
以下是配置 802.1ad (QinQ) 的示例
# 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
Where "24" and "371" are example VLAN IDs.
隧道/叠加无状态卸载¶
支持的隧道和叠加包括 VXLAN、GENEVE,以及其他取决于硬件和软件配置的。无状态卸载默认启用。
查看所有卸载的当前状态
# ethtool -k <ethX>
UDP 分段卸载¶
允许适配器将负载高达 64K 的 UDP 数据包的传输分段卸载到有效的以太网帧中。由于适配器硬件能够比操作系统软件更快地完成数据分段,此功能可能会提高传输性能。此外,适配器可能会使用更少的 CPU 资源。
注意事项
发送 UDP 数据包的应用程序必须支持 UDP 分段卸载。
要启用/禁用 UDP 分段卸载,请发出以下命令:
# ethtool -K <ethX> tx-udp-segmentation [off|on]
GNSS 模块¶
需要内核编译时带有 CONFIG_GNSS=y 或 CONFIG_GNSS=m。允许用户从 GNSS 硬件模块读取消息并写入支持的命令。如果模块物理存在,则会生成一个 GNSS 设备:/dev/gnss<id>
。写入命令的协议取决于 GNSS 硬件模块,因为驱动程序通过 i2c 将原始字节通过 GNSS 对象写入接收器。有关配置详细信息,请参阅硬件 GNSS 模块文档。
固件 (FW) 日志记录¶
驱动程序仅通过 PF 0 上的 debugfs 接口支持 FW 日志记录。NIC 上运行的 FW 必须支持 FW 日志记录;如果 FW 不支持 FW 日志记录,则在 ice debugfs 目录中不会创建 'fwlog' 文件。
模块配置¶
固件日志记录是按模块配置的。每个模块可以设置为独立于其他模块的值(除非指定了模块“all”)。模块将在“fwlog/modules”目录下实例化。
用户可以通过写入模块文件来设置模块的日志级别,如下所示:
# echo <log_level> > /sys/kernel/debug/ice/0000\:18\:00.0/fwlog/modules/<module>
其中
log_level 是如下所述的名称。每个级别都包含来自上一个/更低级别的消息
无
错误
警告
正常
详细
module 是一个表示接收事件的模块的名称。模块名称如下:
一般
控制
链接
链路拓扑
DNL
I2C
SDP
MDIO
管理队列
HDMA
LLDP
DCBX
DCB
XLR
NVM
认证
VPD
IOSF
解析器
SW
调度器
TxQ
预留
后期
看门狗
任务分派
管理
SynCE
健康
Tsdrv
PFREG
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
读取特定模块(例如模块“general”)的 log_level
# 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
启用 FW 日志¶
配置模块表示 FW 对已配置模块应生成事件感兴趣,但它在将启用消息发送到 FW 之前**不会**将事件发送到驱动程序。为此,用户可以将 1(启用)或 0(禁用)写入“fwlog/enable”。示例是:
# echo 1 > /sys/kernel/debug/ice/0000\:18\:00.0/fwlog/enable
检索固件日志数据¶
可以通过从“fwlog/data”读取来检索 FW 日志数据。用户可以将任何值写入“fwlog/data”以清除数据。数据只能在禁用 FW 日志记录时清除。FW 日志数据是一个二进制文件,发送给 Intel 并用于帮助调试用户问题。
读取数据的示例如下:
# 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。用户可以通过读取“fwlog/nr_messages”查看配置的值。设置值的示例如下:
# echo 50 > /sys/kernel/debug/ice/0000\:18\:00.0/fwlog/nr_messages
配置用于存储固件日志数据的内存量¶
驱动程序在驱动程序内部存储固件日志数据。用于存储数据的内存默认大小为 1MB。某些用例可能需要更多或更少的数据,因此用户可以更改为固件日志数据分配的内存量。要更改内存量,请写入“fwlog/log_size”。该值必须是以下之一:128K、256K、512K、1M 或 2M。必须禁用固件日志记录才能更改该值。更改值的示例如下:
# echo 128K > /sys/kernel/debug/ice/0000\:18\:00.0/fwlog/log_size
性能优化¶
驱动程序默认设置旨在适应各种工作负载,但如果需要进一步优化,我们建议尝试以下设置。
Rx 描述符环大小¶
为了减少 Rx 数据包丢弃的数量,使用 ethtool 增加每个 Rx 环的 Rx 描述符数量。
检查接口是否由于缓冲区已满而丢弃 Rx 数据包(rx_dropped.nic 可能意味着没有 PCIe 带宽)
# ethtool -S <ethX> | grep "rx_dropped"如果上一个命令显示队列丢弃,增加描述符数量可能有助于使用“ethtool -G”
# ethtool -G <ethX> rx <N> Where <N> is the desired number of ring entries/descriptors这可以为在 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
为减少延迟
使用 ethtool 将 rx-usecs 和 tx-usecs 设置为 0,以禁用自适应 ITR 和 ITR
# ethtool -C <ethX> adaptive-rx off adaptive-tx off rx-usecs 0 tx-usecs 0
每队列中断速率设置
以下示例适用于队列 1 和 3,但您可以调整其他队列。
要禁用 Rx 自适应 ITR 并将静态 Rx ITR 设置为 10 微秒或每秒约 100,000 次中断,对于队列 1 和 3
# 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
虚拟化环境¶
除了本节中的其他建议之外,以下内容可能有助于优化 VM 中的性能。
在 VM 中使用适当的机制 (vcpupin) 将 CPU 固定到 LCPU,确保使用设备 local_cpulist 中包含的 CPU 集合:
/sys/class/net/<ethX>/device/local_cpulist
。在 VM 中配置尽可能多的 Rx/Tx 队列。(有关支持的队列数量,请参阅 iavf 驱动程序文档。)例如:
# ethtool -L <virt_interface> rx <max> tx <max>
支持¶
有关一般信息,请访问 Intel 支持网站:https://www.intel.com/support/
如果在受支持的内核和适配器上发布的源代码中发现问题,请将与问题相关的具体信息通过电子邮件发送至 intel-wired-lan@lists.osuosl.org。
商标¶
Intel 是英特尔公司或其子公司在美国和/或其他国家/地区的商标或注册商标。
其他名称和品牌可能被声称为他方财产。