# インテル® イーサネット・デバイス用リモート・ダイレクト・メモリー・アクセス (RDMA)

リモート・ダイレクト・メモリー・アクセス (RDMA) は、ネットワーク・デバイスが別のシステムのアプリケーション・メモリーと直接データを転送できるようにすることで、特定のネットワーク環境でスループットを向上させ、レイテンシーを短縮します。

- インテル® イーサネット・コントローラー 800 シリーズのデバイスは iWARP と RoCEv2 の両方をサポートします。
- インテル® イーサネット・コントローラー X722 シリーズのデバイスは iWARP のみサポートします。

主な違いは、iWARP は TCP で RDMA を実行し、RoCEv2 は UDP を使用することです。

パケットのドロップによるパフォーマンスの低下を防ぐには、すべてのネットワーク・インターフェイスおよびスイッチでリンクレベルのフロー制御または優先度のフロー制御を有効にします。

| 注： Microsoft* Windows Server* オペレーティング・システムを実行しているシステムでは、*QoS / 優先度のフロー制御を有効にすると、リンクレベルのフロー制御が無効になります。 インテル® イーサネット・コントローラー 800 シリーズベースのデバイスは、4 ポート以上のマルチポート・モードで動作している場合、RDMA をサポートしません。 Linux* システムでは、RDMA とボンディングに互換性はありません。RDMA が有効になっている場合、ボンディングは機能しません。

## Linux* での RDMA

これらの基本的な Linux* RDMA インストール手順は、次のデバイスに適用されます。

- インテル® イーサネット・コントローラー 800 シリーズ
- インテル® イーサネット・コントローラー X722 シリーズ

インストールと設定の詳細は、RDMA 対応のインテル® イーサネット・デバイス用ドライバー tarball の Linux* RDMA ドライバー README ファイルに記載されています。

この例は、Red Hat* Enterprise Linux* 特有のものです。ご利用のオペレーティング・システムによっては細部が異なる可能性があります。

1. RDMAドライバーの tarball を展開します。例：
   `# tar zxf irdma-<x.x.x>.tar.gz`
2. RDMA PF ドライバーをインストールします。例：
   `# cd irdma-<x.x.x>
   # ./build.sh
   # modprobe irdma`

   | 注：デフォルトでは、irdma ドライバーは iWARP モードでロードされます。devlink インターフェイスを使用して、ポートごとに RoCEv2 を有効にします。RoCev2 モードですべての irdma ポートをロードするには、次のようにしてください。 `# modprobe irdma roce_ena=1`

3. 以前インストールされたバージョンの rdma-core をアンインストールします。
   `# yum erase rdma-core`
4. GitHub* から rdma-core ライブラリー tarball をダウンロードします。例：
   `# wget https://github.com/linux-rdma/rdma-core/releases/download/v27.0/rdma-core-27.0.tar.gz`

   | 注：ドライバーに付属する libirdma パッチファイルのバージョンに一致する rdma-core バージョンをダウンロードします。例えば、`libirdma-27.0.patch` には `rdma-core-27.0.tar.gz`?????? が必要です。

5. rdma-core の tarball を展開し、パッチを適用して spec ファイルのグループを変更します。例：
   `# tar -xzvf rdma-core-<version>.tar.gz
   # cd rdma-core-<version>
   # patch -p2 <<path-to-component-build>/libirdma-<version>.patch
   # cd ..
   # chgrp -R root <path-to-rdma-core>/redhat
   # tar -zcvf rdma-core-<version>.tgz rdma-core-<version>`
6. rdma-core-intel ユーザー・スペース・ライブラリーをインストールします。例：
   `# mkdir -p ~/rpmbuild/SOURCES
   # mkdir -p ~/rpmbuild/SPECS
   # cp rdma-core-<version>.tgz ~/rpmbuild/SOURCES/
   # cd ~/rpmbuild/SOURCES
   # tar -xzvf rdma-core-<version>.tgz
   # cp ~/rpmbuild/SOURCES/rdma-core-<version>/redhat/rdma-core.spec ~/rpmbuild/SPECS/
   # cd ~/rpmbuild/SPECS/
   # rpmbuild -ba rdma-core.spec
   # cd ~/rpmbuild/RPMS/x86_64
   # yum install *<version>*.rpm`
7. アダプターでフロー制御を有効にします。リンクレベルのフロー制御または優先度のフロー制御を有効にできますが、優先度のフロー制御を使用することを推奨します。フロー制御の詳細については、Linux* RDMA ドライバー README ファイルを参照してください。
8. システムが接続されているスイッチでフロー制御を有効にします。詳細はスイッチのマニュアルでご覧ください。

## FreeBSD* での RDMA

FreeBSD* RDMA ドライバーは、次のデバイスシリーズで利用できます。

デバイス | ベースドライバー名 | RDMA ドライバー名 | サポートされているプロトコル
インテル® イーサネット・コントローラー 800 シリーズ | ice | irdma | RoCEv21、iWARP
インテル® イーサネット・コントローラー X722 シリーズ | ixl | iw_ixl | iWARP

1限定的なサポート。機能テストのみ。DCB と優先フロー制御 (PFC) は現在のところサポートされていません。

次の手順は、各デバイスシリーズにおける FreeBSD* RDMA インストールについて説明します。インストールと設定の詳細については、FreeBSD* RDMA ドライバー tarball の README ファイルを参照してください。

インテル® イーサネット・コントローラー 800 シリーズ：

1. ベースドライバーと RDMA ドライバーを展開します。例：`
   # tar -xf ice-<version>.tar.gz
   # tar -xf irdma-<version>.tar.gz`
2. ベースドライバーをインストールします。例：
   `# cd ice-<version>/ directory
   # make
   # make install`
3. RDMA ドライバーをインストールします。例：
   `# cd irdma-<version>/src
   # make clean
   # make ICE_DIR=$PATH_TO_ICE/ice-<version>/
   # make install`

   | 注：デフォルトでは、irdma ドライバーは iWARP モードでロードされます。RoCEv2 モードで irdma ポートをロードするには、 `/boot/loader.conf` に次の行を追加します。ここで `<port>` は、 RoCEv2 モードを有効にするインターフェイスであり、その後再起動します。 `dev.irdma<port>.roce_enable=1` 例えば、ice1 で RoCEv2 モードを有効にする場合： `dev.irdma1.roce_enable=1`

4. フロー制御を有効にします。
   `# sysctl dev.ice.<interface_num>.fc=3`
5. システムが接続されているスイッチでフロー制御を有効にします。詳細はスイッチのマニュアルでご覧ください。

インテル® イーサネット・コントローラー X722 シリーズ：

1. ベースドライバーと RDMA ドライバーを展開します。例：`
   # tar -xf ixl-<version>.tar.gz
   # tar -xf iw_ixl-<version>.tar.gz`
2. ベースドライバーをインストールします。例：
   `# cd ixl-<version>/src directory
   # make
   # make install`
3. RDMA ドライバーをインストールします。例：
   `# cd iw_ixl-<version>/src
   # make clean
   # make IXL_DIR=$PATH_TO_IXL/ixl-<version>/src
   # make install`
4. フロー制御を有効にします。
   `# sysctl dev.ixl.<interface_num>.fc=3`
5. システムが接続されているスイッチでフロー制御を有効にします。詳細はスイッチのマニュアルでご覧ください。

## Microsoft* Windows* Network Direct (ND) 用 RDMA ユーザーモードのアプリケーション

Network Direct (ND) はユーザーモードのアプリケーションで RDMA 機能を使用可能にします。

| 注： ユーザーモードのアプリケーションは、Microsoft* HPC Pack またはインテル® MPI ライブラリーなどで前提条件をもつことがあります。詳細については、アプリケーションのドキュメンテーションを参照してください。

### RDMA ユーザーモードのインストール

インテル® イーサネット・ユーザー・モード RDMA プロバイダーは、Microsoft* Windows Server* 2012 R2 以降でサポートされています。

ユーザーモードの Network Direct 機能をインストールするには、以下の手順に従います。

1. インストール・メディアで Autorun.exe を実行してインストーラーを起動して、[ドライバーとソフトウェアをインストールする] を選択し、ソフトウェア使用許諾契約に同意します。
2. セットアップ・オプション画面で [インテル® イーサネット・ユーザー・モード RDMA プロバイダー] を選択します。
3. RDMA 設定オプション画面で、希望する場合は [IP サブネット全体で RDMA ルーティングを有効にする] を選択します。このオプションは、Network Direct Kernel 機能にも適用可能なため、ユーザーモード RDMA が選択されていない場合でも、ベースドライバーのインストール中にこのオプションが表示されることに注意してください。
4. Windows* ファイアウォールがインストールされ、アクティブになっている場合は、[Windows ファイアウォールにインテル® RDMA Port Mapping Service の規則を作成する] を選択するとその規則を適用するネットワークを選択します。

   | 注： Windows* ファイアウォールが無効になっている場合またはサードパーティーのファイアウォールを使用している場合は、この規則を手動で追加する必要があります。

5. ドライバーとソフトウェアのインストールに進みます。

## RDMA Network Direct Kernel (NDK)

RDMA Network Direct Kernel (NDK) 機能は、インテルベースのネットワークドライバーに含まれており、追加機能をインストールする必要はありません。

## IP サブネット全体に渡る RDMA ルーティング

サブネット全体に渡って NDK の RDMA 機能を許可したい場合は、ベースドライバーのインストール中に RDMA 設定オプション画面で [IP サブネット全体で RDMA ルーティングを有効にする] を選択する必要があります。

## Microsoft* Windows Server* オペレーティング・システムでの優先フロー制御 (PFC) の有効化

パケットのドロップによるパフォーマンスの低下を防ぐには、すべてのネットワーク・インターフェイスおよびスイッチでリンクレベルのフロー制御または優先フロー制御 (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 | Select NetworkDirect`

Netstat を使用して、各 RDMA 対応ネットワーク・インターフェイスのポート 445 にリスナーがあることを確認します (RDMA をサポートする Windows* クライアント OS はリスナーをポストできない場合があります)。例：

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

## 仮想環境の RDMA

VMSwitch に接続されている仮想アダプターで RDMA 機能を有効にするには、各ポートで SRIOV (シングルルート IO 仮想化) および VMQ (仮想マシンキュー) の詳細プロパティーを有効にする必要があります。特定の状況の下では、これらの設定がデフォルトで無効になっていることがあります。これらのオプションは、アダプターの [プロパティ] ダイアログボックスの [詳細設定] タブで手動で設定するか、次の Powershell* コマンドを使用して設定できます：

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

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

### RDMA ゲストサポートの設定 (NDK モード 3)

NDK モード 3 はカーネルモード Windows* コンポーネントが Hyper-V* ゲスト・パーティション内で RDMA 機能を使用できるようにします。インテル® イーサネット・デバイスで 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 ネットワーク・アダプターを作成します。
   `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 ウェイトを設定します (注：RDMA ウェイトを 0 に設定する前に SR-IOV ウェイトを 0 に設定する必要があります)：
   `Set-VMNetworkAdapter -VMName <vm_name> -VMNetworkAdapterName <device_name> -IovWeight 100`
9. VM の PROSET インストーラーを使用して VF ネットワーク・アダプターをインストールします。
10. VM の PowerShell* を使用して、VF ドライバーと Hyper-V* ネットワークアダプターで RDMA を有効にします：
    `Set-NetAdapterAdvancedProperty -Name <device_name> -RegistryKeyword RdmaVfEnabled -RegistryValue 1`
    `Get-NetAdapterRdma | Enable-NetAdapterRdma`

## SMB ダイレクト (サーバー・メッセージ・ブロック) など NDK 機能用の RDMA

NDK は、Windows* コンポーネント (SMB ダイレクト・ストレージなど) が RDMA 機能を使用できるようにします。

### DiskSPD を使用して NDK：Microsoft* Windows* SMB ダイレクトをテストする

このセクションでは、インテルのイーサネット機能と、Microsoft* Windows* オペレーティング・システムでのパフォーマンスを調べるために推奨される RDMA のテスト方法を説明します。

SMB ダイレクトはストレージ・ワークロードなので、ベンチマークのパフォーマンスは、テストされるネットワーク・インターフェイスではなく、ストレージデバイスの速度に制限される可能性があります。テスト中のネットワーク・デバイスの真の性能をテストするために、インテルは可能な限り最速のストレージを使用することを推奨します。

テストの手順：

1. サポートされている Microsoft* Windows Server* オペレーティング・システムを実行している少なくとも 2 台のサーバーをセットアップして、接続します。各サーバーに少なくとも 1 つの RDMA 対応インテル® イーサネット・デバイスが必要です。
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. 次のサイトから Microsoft* ユーティリティー Diskspd をダウンロードしてインストールします：https://gallery.technet.microsoft.com/DiskSpd-a-robust-storage-6cd2f223
4. CMD または Powershell* を利用して DiskSpd フォルダーに cd を実行し、テストを実行します。(パラメーターの詳細については、Diskspd のドキュメンテーションを参照してください)
   例：ブロックのサイズを 4K に設定してテストを 60 秒間実行。すべてのハードウェアとソフトウェアのキャッシュを無効にし、レイテンシーの統計を測定・表示。ターゲットごとに 16 の重複した IO と 16 スレッドを活用し、ランダム 0% 書き込みおよび 100% 読み取りで 10GB テストファイルを "\\<SMBserverTestIP>\<SMBsharename>\test.dat" に作成：
   `.\diskspd.exe -b4K -d60 -h -L -o16 -t16 -r -w0 -c10G \\<SMBserverTestIP>\<SMBsharename>\test.dat`
5. 「RDMA Activity」や「SMB Direct Connection」などの perfmon カウンターを使用して RDMA トラフィックが実行されていることを検証します。詳細については、Microsoft* のドキュメンテーションを参照してください。

## カスタマーサポート

- インテルのサポート・ホームページ：http://www.intel.com/p/ja_JP/support
- ネットワーク製品情報：http://www.intel.com/network

## 法務情報 / 免責情報

(C) 2019 - 2021, Intel Corporation.無断での引用、転載を禁じます。

Intel Corporation は本書に記載されている内容の誤りまたは記載漏れについて、一切責任を負いません。また、本書の記載内容を更新する義務も一切負いません。

Intel、インテルは、アメリカ合衆国および / またはその他の国における Intel Corporation の商標です。

* その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

本ソフトウェアはライセンスに基づいて提供されるものであり、そのライセンスの許諾範囲内でのみ使用または複製できます。本マニュアル内での情報は、あくまでも情報として提供するもので、予告なしに変更されることもあり、また、内容についても、インテルが責任を負うものではありません。本書の内容および本書の内容に関連して掲載されているソフトウェア製品の誤りに関して、インテルは一切の責任や義務を負いません。ライセンス契約で許可されている場合を除き、インテルからの書面での承諾なく、本書のいかなる部分も複製したり、検索システムに保持したり、他の形式や媒体によって転送したりすることは禁じられています。