# 適用於 Intel® 乙太網路裝置的遠端直接記憶體存取 (RDMA)

遠端直接記憶體存取（簡稱 RDMA）可以讓網路裝置在另外一個系統上的應用程式記憶體中直接傳輸資料、增加輸出量、並且在特定網路環境中減少延遲性。

- Intel® 乙太網路 800 系列裝置同時支援 iWARP 與 RoCEv2。
- Intel® 乙太網路 X722 系列裝置僅支援 iWARP。

最主要的不同點是 iWARP 能透過 TCP 執行 RDMA，而 RoCEv2 則是使用 UDP 來執行。

在具有 RDMA 功能的裝置上，下列作業系統可支援 RDMA：

- Linux*
- FreeBSD*
- VMware* ESXi*
- Microsoft* Windows 伺服器*

為了避免遺失封包造成的效能降低，可以在所有的網路介面和交換器上啟用連結層的流量控制或優先順序流量控制。

| 注意： 在執行 Microsoft Windows Server 作業系統的系統上，啟用 *QoS/優先順序流量控制將會停用連結層的流量控制。 使用超過 4 個連接埠的多連接埠模式作業時，搭載 Intel® 乙太網路 800 系列的裝置不支援 RDMA。 在 Linux 系統上，RDMA 和連結集合（LAG，也稱為連結）在大多數裝置上不相容。如果 RDMA 已啟用，連結就不會有作用。 在 Intel 乙太網路 810 系列裝置上，如果滿足以下所有條件，則 RDMA 和 LAG 可相容： RDMA 技術設定為 RoCEv2。 LAG 配置是有效備份。 連結介於同一裝置內的兩個連接埠之間。 兩個連接埠的 QoS 設定會在裝置連結之前配對。

## Linux 或 FreeBSD 的 RDMA

對於在 Linux 或 FreeBSD 上支援 RDMA 的 Intel 乙太網路裝置，請使用下表所列的驅動程式。

裝置 | Linux | FreeBSD | 支援的通訊協定
--- | --- | --- | ---
基礎驅動程式 | RDMA 驅動程式 | 基礎驅動程式 | RDMA 驅動程式
Intel® 乙太網路 800 系列 | ice | irdma | ice | irdma | RoCEv2、iWARP
Intel® 乙太網路 X722 系列 | i40e | irdma | ixl | 不支援 | iWARP

##### 基本安裝說明

概括地說，在 Linux 或 FreeBSD 上安裝和配置 RDMA 包括以下步驟。完整詳細資訊請參閱適當的 RDMA 驅動程式 tarball 中的讀我檔案。

1. 安裝基礎驅動程式。
2. 安裝 RDMA 驅動程式。
3. 安裝並修補任何使用者模式 RDMA 程式庫。具體步驟依作業系統而異；請參閱 RDMA 驅動程式的讀我檔案以瞭解詳細資訊。
4. 在您的裝置上啟用流量控制。詳細資訊與支援模式請參閱基礎驅動程式的讀我檔案。
5. 如果您使用 RoCE，請在裝置和系統連接的端點上啟用流量控制（PFC 或 LFC）。請參閱您的交換器文件以及（對於 Linux）適用於 RDMA 使用案例的 Intel® 乙太網路 800 系列 Linux 流量控制配置指南以取得詳細資訊 。

### 適用於 Linux 虛擬化環境的 RDMA

搭載 Intel 乙太網路 800 系列的裝置，於支援之 Windows 或 Linux 主機上，支援 Linux VF 內的 RDMA。如需如何在 Linux VF 載入及設定 RDMA 的詳細資訊，請參考 Linux RDMA 驅動程式 tarball 內的讀我檔案。

## Microsoft Windows 上的 RDMA

### 適用於 Network Direct (ND) 使用者模式應用程式的 RDMA

使用 Network Direct (ND)，使用者模式應用程式就可以使用 RDMA 功能。

| 注意：使用者模式應用程式可能有預先安裝的要求條件，例如 Microsoft HPC Pack 或 Intel MPI Library，請參考您的應用程式說明文件來了解詳細資料。

#### 安裝 RDMA 使用者模式

「Intel® 乙太網路使用者模式 RDMA 供應器」受到 Microsoft Windows Server 2012 R2 或更新版本的支援。

請遵照下面的步驟來安裝使用者模式的 Network Direct (ND) 功能。

1. 從安裝媒體執行 Autorun.exe 來啟動該安裝程式，然後選擇「安裝驅動程式與軟體」，然後接受授權合約書。
2. 在「設定選項」螢幕選取「Intel® 乙太網路使用者模式 RDMA 供應器」。
3. 在 RDMA 組態選項螢幕，依您的需求選取「在整個 IP 子網路中啟用 RDMA 路由功能」。請注意，即使您沒有選取使用者模式的 RDMA，這個選項也會在基本驅動程式安裝期間出現，因為這個選項也適用於 Network Direct Kernel 功能。
4. 如果有安裝「Windows 防火牆」，且該防火牆也在作用中，請選取「在 Windows 防火牆建立一條 Intel® 乙太網路 RDMA 連接埠對應服務規則」，以及要套用此規則的網路。

   | 注意：如果「Windows 防火牆」已停用或者您使用的是第三方的防火牆，就需要以手動方式來新增這條規則。

5. 繼續進行驅動程式和軟體安裝。

### RDMA Network Direct Kernel (NDK)

RDMA Network Direct Kernel (NDK) 功能已經包括在 Intel 基礎網路驅動程式，而且不需安裝其它功能。

#### 在整個 IP 子網路中啟用 RDMA 路由功能

如果您要讓所有的子網路都能使用 NDK 的 RDMA 功能，就必須在基礎驅動程式安裝期間，於 RDMA 組態選項畫面，選取「在整個 IP 子網路中啟用 RDMA 路由功能」。

### 在 Microsoft Windows Server 作業系統上啟用優先順序流量控制

為了避免遺失封包造成的效能降低，可以在所有的網路介面和交換器上啟用優先順序流量控制 (PFC) 或連結層的流量控制。

| 注意：在執行 Microsoft Windows Server 作業系統的系統上，啟用 *QoS/優先順序流量控制將會停用連結層的流量控制。

請使用下列 PowerShell* 指令，以啟用 Microsoft Windows Server 上的 PFC：

`Install-WindowsFeature -Name Data-Center-Bridging -IncludeManagementTools
New-NetQoSPolicy "SMB" -NetDirectPortMatchCondition 445 -PriorityValue8021Action 3
Enable-NetQosFlowControl -Priority 3
Disable-NetQosFlowControl -Priority 0,1,2,4,5,6,7
New-NetQosTrafficClass -Name "SMB" -Priority 3 -BandwidthPercentage 60 -Algorithm ETS
Set-NetQosDcbxSetting -Willing $FALSE
Enable-NetAdapterQos -Name "Slot1 4 2 Port 1"`

### 利用 Microsoft PowerShell 驗證 RDMA 作業

您可以使用下面的 Microsoft PowerShell 指令來確定網路介面上的 RDMA 是否已啟用：

`Get-NetAdapterRDMA`

請使用以下的 PowerShell 指令來檢查網路介面是否具備 RDMA 功能，並且已啟用多通道：

`Get-SmbClientNetworkInterface`

請使用以下的 PowerShell 指令來檢查作業系統中的 Network Direct 是否已啟用：

`Get-NetOffloadGlobalSetting | 選取 NetworkDirect`

請使用 netstat 來檢查每個具備 RDMA 功能的網路介面在第 445 連接埠有一個接聽程式（支援 RDMA 的 Windows 用戶端作業系統可能不會公布接聽程式）。例如：

`netstat.exe -xan | ? {$_ -match "445"}`

### 適用於 Windows 虛擬化環境的 RDMA

若要在連接至 VMSwitch 的虛擬介面卡上啟用 RDMA 功能，您必須：

- 在每個連接埠上啟用 SR-IOV（單一根 I/O 虛擬化）與 VMQ（虛擬機器佇列）的進階屬性。
- 設定要啟用 RDMA 功能的 VF 數量。您最多可以啟用 32 個具有 RDMA 功能的 VF。

在特定情況下，您可以預設停用這些設定。您可以在 Intel PROSet ACU 的「介面卡設定」面板內，其介面卡屬性對話框「進階」分頁中，或以下列 PowerShell 指令，手動設定這些選項：

`Set-NetAdapterAdvancedProperty -Name <nic_name> -RegistryKeyword *SRIOV -RegistryValue 1`

`Set-NetAdapterAdvancedProperty -Name <nic_name> -RegistryKeyword *VMQ -RegistryValue 1`

`Set-NetAdapterAdvancedProperty -Name <nic_name> -RegistryKeyword RdmaMaxVfsEnabled -RegistryValue <1-32>`

### 設定 RDMA 訪客支援（NDK 模式 3）

「NDK 模式 3」可讓核心模式 Windows 元件使用 Hyper-V 訪客分割區內的 RDMA 功能。若要在 Intel 乙太網路裝置上啟用 NDK 模式 3，請執行以下的步驟：

1. 在您的系統的 BIOS 或 UEFI 上啟用 SR-IOV。
2. 在裝置上啟用 SR-IOV 進階設定。
3. 在同一裝置上的所有實體功能都執行以下的指令就可以將與該裝置綁定之 VMSwitch 上的 SR-IOV 啟用：
   `New-VMSwitch -Name <switch_name> -NetAdapterName <device_name>`
   `-EnableIov $true`
4. 利用設定 RdmaMaxVfsEnabled 進階設定值來設定裝置上的 RDMA 虛擬功能 (VF) 數。所有的實體功能都必需設定成相同的值。該值代表在整個裝置中，一次能夠進行 RDMA 的最高 VF 數。啟用較多的 VF 會限制實體功能 (PF) 和其它 VF 的 RDMA 資源。
   `Set-NetAdapterAdvancedProperty -Name <device_name> -RegistryKeyword RdmaMaxVfsEnabled -RegistryValue <Value: 0 - 32>`
5. 在主機上停用所有的 PF 介面卡後再將它們重新啟用。當登錄關鍵字「RdmaMaxVfsEnabled」已變更，或是在建立或終結一個 VMSwitch 時就需要進行此作業。
   `Get-NetAdapterRdma | Disable-NetAdapter`
   `Get-NetAdapterRdma | Enable-NetAdapter`
6. 為需要 RDMA VF 支援的 VM 建立「VM 網路介面卡」。
   `Add-VMNetworkAdapter -VMName <vm_name> -VMNetworkAdapterName <device_name> -SwitchName <switch_name>`
7. 如果您打算在客體分割區使用 Microsoft Windows 10 Creators Update (RS2) 或更新的版本，請在主機輸入下面指令來設定「VM 網路介面卡」上 RDMA 的權數：
   `Set-VMNetworkAdapterRdma -VMName <vm_name> -VMNetworkAdapterName <device_name> -RdmaWeight 100`
8. 在「VM 網路介面卡」設定 SR-IOV 的權數（注意：一定要先將 RdmaWeight 設為 0 後才能將 SR-IOV 的權數設為 0）：
   `Set-VMNetworkAdapter -VMName <vm_name> -VMNetworkAdapterName <device_name> -IovWeight 100`
9. 使用 VM 中的 PROSET 安裝程式來安裝 VF 網路介面卡。
10. 使用 VM 中的 PowerShell 來啟用 VF 驅動程式上的 RDMA 和 Hyper-V 網路介面卡：
    `Set-NetAdapterAdvancedProperty -Name <device_name> -RegistryKeyword RdmaVfEnabled -RegistryValue 1`
    `Get-NetAdapterRdma | Enable-NetAdapterRdma`

### 適用於 NDK 的 RDMA 功能，例如 SMB 直接傳輸（伺服器訊息區）

NDK 可讓 Windows 元件（例如「SMB 直接傳輸」儲存）使用 RDMA 功能。

#### 測試 NDK：搭載 DiskSPD 的 Microsoft Windows SMB 直接傳輸

這個部分介紹了適用於測試 Intel 乙太網路功能性的 RDMA 和 Microsoft Windows 作業系統效能的建議方法。

請注意，因為「SMB 直接傳輸」是一種儲存負載，其效能指標可能會受到儲存裝置的限制，而不是受限於被測試的網路介面。Intel 建議使用最快的儲存，這樣可測試出受測之網路裝置的真實功能。

測試說明：

1. 至少將兩個執行支援 Microsoft Windows Server 作業系統的伺服器設定完成並連線，而且每個伺服器至少要有一個必須具備 RDMA 功能的 Intel® 乙太網路裝置。
2. 在指定為 SMB 伺服器使用的系統上，要設定一個 SMB 分享。請注意，效能指標可能會受到儲存裝置速度的限制，而不是受限於被測試的網路介面。儲存設定不在本文件的說明範圍內。您可以使用以下的 PowerShell 指令：
   `New-SmbShare -Name <SMBsharename> -Path <SMBsharefilepath> -FullAccess <domainname>\Administrator,Everyone`
   例如：
   `New-SmbShare -Name RAMDISKShare -Path R:\RAMDISK -FullAccess group\Administrator,Everyone`
3. 請從此處下載並安裝 Diskspd Microsoft 公用程式：https://gallery.technet.microsoft.com/DiskSpd-a-robust-storage-6cd2f223
4. 使用 CMD 或 Powershell，cd 到 DiskSpd 資料夾，然後執行測試。（請參考 Diskspd 說明文件以了解參數的詳細資料）
   範例：將區塊大小設定為 4K、執行 60 秒的測試、停用所有的硬體和軟體快取、測量並顯示延遲統計數據、每個目標運用 16 個重疊的 IO 和 16 個執行緒、隨機 0% 寫入和 100% 讀取，然後在「\\<SMBserverTestIP>\<SMBsharename>\test.dat」建立一個 10GB 的測試檔案：
   `.\diskspd.exe -b4K -d60 -h -L -o16 -t16 -r -w0 -c10G \\<SMBserverTestIP>\<SMBsharename>\test.dat`
5. 使用「RDMA 活動」和「SMB 直接連線」之類的 Perfmon 計數器來確認 RDMA 流量是否正在執行。請參考 Microsoft 說明文件以了解更多詳細資料。

### RDMA Windows 效能監控

您可以使用 perfmon 或其他效能監控工具來監控及顯示 RDMA 計數器和統計資料。請參考 Microsoft 說明文件以了解更多詳細資料。使用 Register-IntelEthernetRDMACounterSet cmdlet 向 perfmon 註冊特定裝置的 RDMA 統計資料計數器。請參閱透過 Windows PowerShell 進行設定，進一步瞭解如何安裝及使用 Intel Ethernet cmdlet。您可以使用以下 PowerShell 命令為所有支援的裝置註冊 RDMA 統計資料：

`Register-IntelEthernetRDMACounterSet`

您可以使用以下 PowerShell cmdlet 取消註冊 RDMA 統計資料：

`Unregister-IntelEthernetRDMACounterSet`

## 客戶支援

- 主要的 Intel 支援網站：http://www.intel.com.tw/content/www/tw/zh/support.html
- 網路產品資訊：https://www-ssl.intel.com/content/www/tw/zh/communications/network-transformation.html

## 法律聲明/免責聲明

版權所有 (C) 2019 - 2023，Intel 公司。保留一切權利。

此軟體與相關文件為 Intel 版權材料，而您的用途會受其提供予您的明確授權（「授權」）所規範。除非授權另有規定，否則若無 Intel 事先書面許可，您不得使用、修改、複製、發布、散發、揭露或傳輸此軟體或相關文件。

此軟體與相關文件均按原樣提供，除授權中明確載明外，不含任何明示或暗示的擔保。

Intel 技術可能需要搭配支援的硬體、特定軟體或啟動服務才能使用。

沒有產品或元件能提供絕對的安全性。

您的成本和結果可能會有所差異。

Intel、Intel 圖誌和其它 Intel 標誌是 Intel 公司或其子公司的商標。

*其他名稱與品牌可能業經宣告為他人之財產。