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 事務期間容忍有限的系統延遲。如果這些事務花費的時間超過可容忍的延遲,則可能會影響資料包在裝置和相關記憶體中緩衝的時間長度,從而可能導致丟包。在標準工作負載下,這些丟包通常不會對吞吐量和效能產生明顯影響。

如果這些丟包似乎影響您的工作負載,以下方法可能會改善情況:

  1. 確保您的系統物理記憶體處於平臺供應商推薦的高效能配置。常見建議是所有通道都填充單個 DIMM 模組。

  2. 在系統的 BIOS/UEFI 設定中,選擇“效能”配置檔案。

  3. 您的發行版可能會提供“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://kernel.linux.club.tw/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

動態裝置個性化

動態裝置個性化 (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 包檔案

  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) 的載入。

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”欄位以如下方式指定:

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>

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

  1. 使用 ethtool 啟用 Intel 乙太網流導向器和 ntuple 過濾器。

# ethtool -K <ethX> ntuple on
  1. 設定全域性流表中的條目數。例如:

# NUM_RPS_ENTRIES=16384
# echo $NUM_RPS_ENTRIES > /proc/sys/net/core/rps_sock_flow_entries
  1. 設定每個佇列流表中的條目數。例如:

# 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
  1. 停用 IRQ 平衡守護程式(這只是在下次重啟之前暫時停止服務)。

# systemctl stop irqbalance
  1. 配置中斷親和性。

    請參閱 /Documentation/core-api/irq/irq-affinity.rst

使用 ethtool 停用 aRFS

# ethtool -K <ethX> ntuple off

注意:此命令將停用 ntuple 過濾器並清除軟體和硬體中的所有 aRFS 過濾器。

示例用例

  1. 在所需的 CPU(例如 CPU 4)上設定伺服器應用程式。

# taskset -c 4 netserver
  1. 使用 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 的 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 支援變體:

  1. 基於韌體的 LLDP 代理

  2. 基於軟體的 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。

流控制

乙太網流控制 (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) 流量:

    1. VF 未分配埠 VLAN。

    2. 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 是英特爾公司或其子公司在美國和/或其他國家/地區的商標或註冊商標。

  • 其他名稱和品牌可能被聲稱為他方財產。