英特尔®以太网控制器 800 系列的 Linux 基本驱动程序¶
英特尔 ice Linux 驱动程序。版权所有 (c) 2018-2021 英特尔公司。
目录¶
概述
识别您的适配器
重要说明
附加功能和配置
性能优化
此驱动程序的关联虚拟功能 (VF) 驱动程序是 iavf。
可以使用 ethtool 和 lspci 获取驱动程序信息。
有关硬件要求的相关问题,请参阅英特尔适配器随附的文档。列出的所有硬件要求均适用于 Linux。
此驱动程序支持 XDP(快速数据路径)和 AF_XDP 零复制。请注意,XDP 会阻止大于 3KB 的帧大小。
识别您的适配器¶
有关如何识别您的适配器以及最新的英特尔网络驱动程序的信息,请参阅英特尔支持网站:https://www.intel.com/support
重要说明¶
接收压力下可能会发生数据包丢弃¶
基于英特尔®以太网控制器 800 系列的设备设计为在 PCIe 和 DMA 事务期间容忍有限的系统延迟。如果这些事务的耗时超过了容忍的延迟时间,则可能会影响数据包在设备和相关内存中缓冲的时间长度,这可能会导致数据包丢弃。在标准工作负载下,这些数据包丢弃通常不会对吞吐量和性能产生明显影响。
如果这些数据包丢弃似乎影响了您的工作负载,则以下操作可能会改善情况:
确保您的系统的物理内存处于平台供应商建议的高性能配置中。一个常见的建议是所有通道都填充单个 DIMM 模块。
在您的系统 BIOS/UEFI 设置中,选择“性能”配置文件。
您的发行版可能会提供诸如“tuned”之类的工具,这可以帮助调整内核设置,以便为不同的工作负载实现更好的标准设置。
配置 SR-IOV 以提高网络安全性¶
在虚拟化环境中,在支持 SR-IOV 的英特尔®以太网网络适配器上,虚拟功能 (VF) 可能会受到恶意行为的影响。软件生成的第 2 层帧,如 IEEE 802.3x(链路流控制)、IEEE 802.1Qbb(基于优先级的流控制)和其他此类帧,是预料之外的,可能会限制主机和虚拟交换机之间的流量,从而降低性能。为了解决此问题并确保与意外流量隔离,请从 PF 上的管理界面为所有启用 SR-IOV 的端口配置 VLAN 标记。此配置允许丢弃意外的和潜在恶意的帧。
有关配置说明,请参阅本 README 中后面的“在启用 SR-IOV 的适配器端口上配置 VLAN 标记”。
如果带有活动 VM 的 VF 已绑定,则不要卸载端口驱动程序¶
如果带有活动虚拟机 (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 和安全模式的更多详细信息,请参阅《英特尔®以太网适配器和设备用户指南》。
注意
如果您遇到 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) 的加载。
英特尔®以太网流定向器¶
英特尔以太网流定向器执行以下任务
根据数据流将接收数据包定向到不同的队列
能够严格控制平台中的数据流路由
将数据流与 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 数据包,该数据包在 TCP/IPv4 有效负载中偏移 8 个字节处的值为 0xBEAF。
请注意,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 支持仅限于以下数据包类型
基于 IPv4 和 IPv6 的 TCP
基于 IPv4 和 IPv6 的 UDP
非分段数据包
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 balance 守护程序(这只是在下次重新启动之前临时停止服务)。
# 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 将流量从客户端路由到服务器上的 CPU 4,并配置 aRFS。此示例使用基于 IPv4 的 TCP。
# 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>
例如,以下命令将在 VLAN 10 上配置 PF eth0 和第一个 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 的混杂模式请求。如果 VM 在 VF 驱动程序加载后变为受信任,则必须发出新的请求以将 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 的混杂模式设置为 true 混杂模式并允许 VF 查看所有入口流量,请使用以下命令
# ethtool --set-priv-flags <ethX> vf-true-promisc-support on
vf-true-promisc-support 私有标志不会启用混杂模式;相反,它指定了当您使用上面的 ip link 命令启用混杂模式时,您将获得的混杂模式类型(有限或 true)。请注意,这是一个影响整个设备的全局设置。但是,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)¶
某些英特尔以太网设备使用恶意驱动程序检测 (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}
巨型帧¶
通过将最大传输单元 (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 字节的最大巨型帧大小。
注意:此驱动程序将尝试使用多个页面大小的缓冲区来接收每个巨型数据包。这应该有助于避免在分配接收数据包时出现缓冲区饥饿问题。
注意:当您使用巨型帧时,数据包丢失可能会对吞吐量产生更大的影响。如果您在启用巨型帧后发现性能下降,则启用流量控制可能会缓解此问题。
速度和双工配置¶
在解决速度和双工配置问题时,您需要区分基于铜缆的适配器和基于光纤的适配器。
在默认模式下,使用铜缆连接的英特尔®以太网网络适配器将尝试与其链路伙伴进行自动协商,以确定最佳设置。如果适配器无法使用自动协商与链路伙伴建立连接,您可能需要手动将适配器和链路伙伴配置为相同的设置,以建立连接并传递数据包。仅当尝试与不支持自动协商或已被强制设置为特定速度或双工模式的旧交换机连接时才需要这样做。您的链路伙伴必须与您选择的设置匹配。不能强制执行 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) 在网络上配置,它是 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 代理”设置为禁用,则无法从操作系统启用它。
流量控制¶
可以使用 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
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 硬件模块,因为驱动程序通过 GNSS 对象通过 i2c 将原始字节写入接收器。有关配置详细信息,请参阅硬件 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 是如下所述的名称。每个级别都包含来自前一个/较低级别的消息
none
error
warning
normal
verbose
module 是一个名称,表示要接收事件的模块。模块名称是
general
ctrl
link
link_topo
dnl
i2c
sdp
mdio
adminq
hdma
lldp
dcbx
dcb
xlr
nvm
auth
vpd
iosf
parser
sw
scheduler
txq
rsvd
post
watchdog
task_dispatch
mng
synce
health
tsdrv
pfreg
mdlver
all
名称 ‘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
启用 FW 日志¶
配置模块会向 FW 指示已配置的模块应生成驱动程序感兴趣的事件,但在向 FW 发送启用消息之前,它不会将事件发送到驱动程序。为此,用户可以将 1(启用)或 0(禁用)写入 ‘fwlog/enable’。一个例子是
# echo 1 > /sys/kernel/debug/ice/0000\:18\:00.0/fwlog/enable
检索 FW 日志数据¶
FW 日志数据可以通过从 ‘fwlog/data’ 读取来检索。用户可以将任何值写入 ‘fwlog/data’ 以清除数据。仅当禁用 FW 日志记录时才能清除数据。FW 日志数据是一个二进制文件,它被发送到英特尔,用于帮助调试用户问题。
读取数据的示例是
# 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
更改将日志事件发送到驱动程序的频率¶
驱动程序从 Admin Receive Queue (ARQ) 接收 FW 日志数据。FW 发送 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
配置用于存储 FW 日志数据的内存量¶
驱动程序在驱动程序中存储 FW 日志数据。用于存储数据的内存的默认大小为 1MB。某些用例可能需要更多或更少的数据,因此用户可以更改为 FW 日志数据分配的内存量。要更改内存量,请写入 ‘fwlog/log_size’。该值必须是以下之一:128K、256K、512K、1M 或 2M。必须禁用 FW 日志记录才能更改该值。更改该值的示例是
# 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
虚拟化环境¶
除了本节中的其他建议外,以下内容可能有助于优化虚拟机中的性能。
使用虚拟机中适当的机制 (vcpupin),将 CPU 固定到各个 LCPU,确保使用设备 local_cpulist 中包含的一组 CPU:
/sys/class/net/<ethX>/device/local_cpulist
。在虚拟机中配置尽可能多的 Rx/Tx 队列。(有关支持的队列数量,请参阅 iavf 驱动程序文档。)例如
# ethtool -L <virt_interface> rx <max> tx <max>
支持¶
有关一般信息,请访问英特尔支持网站:https://www.intel.com/support/
如果在使用支持的适配器的支持内核上发布的源代码中发现问题,请将与问题相关的具体信息通过电子邮件发送至 intel-wired-lan@lists.osuosl.org。
商标¶
Intel 是英特尔公司或其子公司在美国和/或其他国家/地区的商标或注册商标。
其他名称和品牌可能被声明为其他方的财产。