InfiniBand

提供: ArchWiki
移動先: 案内検索

このページでは InifiniBand ネットワークを設定・診断・ベンチマークする方法を説明します。

目次

イントロダクション

概要

InfiniBand (略して IB) は Ethernet や Fibre Channel の代わりとなる技術です。InfiniBand は高帯域幅と低遅延を実現します。InfiniBand では特定のマシンのストレージデバイスから他のマシンのユーザー空間に直接データを転送することができ、システムコールのオーバーヘッドを無視できます。CPU 上で動作する Ethernet のネットワークプロトコルとは異なり InfiniBand アダプタがネットワークプロトコルを処理します。10Gb 以上の Ethernet で問題となる広帯域転送における OS や CPU の負担を減らすことが可能です。

InfiniBand のハードウェアは Mellanox (Oracle によって支援されている Voltaire と合併しています) と Intel (QLogic の InfiniBand プログラムを持っています) によって製造されています。InfiniBand はスーパーコンピューターや計算クラスタ、データセンターなどでよく使われています。IBM, HP, Cray は InfiniBand Steering Committee のメンバーです。InfiniBand を使っている企業として Facebook, Twitter, eBay, YouTube, PayPal などが挙げられます。

InfiniBand のソフトウェアは OpenFabrics Open Source Alliance で開発されています。

手頃な中古品

InfiniBand のパッシブケーブルの長さの制限、InfiniBand のアクティブケーブルの高い価格、Ethernet よりも技術的に非常に高度なこと、さらに巨大企業が新しいバージョンを求めることなどから InifiniBand の中古市場は飽和状態となっており、家庭や小規模オフィスの内部ネットワーク用として中古の InfiniBand デバイスが手軽な価格で入手することができます。

帯域幅

信号伝送速度

現在 InfiniBand の伝送速度は PCI Express (略して PCIe) 規格の最大伝送速度に相当します。最初は PCI Extended (略して PCI-X) 相当しかなく性能に著しい制限がありました。レーンあたりの信号速度が 2.5Gb/s (PCI Express v1.0 相当) の SDR (Single Data Rate) から DDR (Double Data Rate) では 5Gb/s (PCI Express v2.0)、QDR (Quad Data Rate) では 10Gb/s (PCI Express 3.0)、FDR (Fourteen Data Rate) では 14.0625Gbps (PCI Express 4.0) と倍々に増やされていき、最新の EDR (Enhanced Data Rate) では 25Gb/s に到達しています。2017年に予定されている HDR (High Data Rate) は 50Gb/s です。

実効スループットとマルチ仮想レーン

SDR, DDR, QDR では (8ビットのデータが10ビットの信号になる) 8/10 変換が使われるため、実効スループットは 80% まで落ちます。SDR は 2Gb/s/レーン、DDR は 4Gb/s/レーン、QDR は 8Gb/s/レーンです。FDR から、InfiniBand は 64/66 変換を使用して信号比 96.97% の高い実効スループットを発揮します。FDR は 13.64Gb/s/レーン、EDR は 24.24Gb/s/レーン、HDR は 48.48Gb/s/レーンです。

InfiniBand デバイスでは複数の仮想レーンを使うことができ、大抵の場合は 4X が使われますが、低速な 1X や高速な 12X が使われることもあります。

一般的な 4X レーンのデバイスを使用した場合、実効スループットは次のとおりです: SDR は 8Gb/s、DDR は 16Gb/s、QDR は 32Gb/s、FDR は 54.54Gb/s、EDR は 96.97Gb/s、HDR は 193.94Gb/s。

遅延

InfiniBand のレイテンシは非常に小さいです: SDR (5us)、DDR (2.5us)、QDR (1.3us)、FDR (0.7us)、EDR (0.5us)、HDR (0.5us 未満)。10Gb Ethernet のレイテンシは約 7.22us であるため FDR の10倍以上です。

後方互換

ほとんどの InfiniBand デバイスには後方互換性があります。一番低いバージョンにあわせて接続は確立されます。PCI Express 8x スロット用の DDR アダプタは PCI Express 4x スロットでも動作します (帯域幅は半分になります)。

ケーブル

InfiniBand のパッシブ銅線ケーブルは QDR を使用する場合は最大7メートル、FDR を使用する場合は最大3メートルです。

InfiniBand のアクティブファイバー (光) ケーブルは FDR の場合で最大300メートルです (この記事では触れませんが派生の FDR10 では最大100メートルです)。

Mellanox の MetroX には80キロメートル (50マイル) までの接続ができる製品が存在します。1キロメートルあたり約 5us の遅延が発生します。

InfiniBand のケーブルを使うことで2台のコンピュータを直接接続できます (スイッチは不要です)。InfiniBand のクロスオーバーケーブルというものは存在しません。

用語

ハードウェア

InfiniBand 専用に製造されているアダプタ、スイッチ、ルーター、ブリッジ/ゲートウェイです。

HCA (Host Channel Adapter)
Ethernet の NIC (ネットワークインターフェイスカード) と似ています。InfiniBand ケーブルを PCI Express バスに接続します。HCA の世代によりますがバスの最大速度が使われます。InfiniBand ネットワークの終点ノードはトランスポート層として働き、InfiniBand の verbs インターフェイスをサポートしています。
スイッチ
Ethernet の NIC と似ています。同一の InfiniBand サブネット上で異なるリンクにパケットを移動します。
ルーター
Ethernet のルーターと似ています。異なる InfiniBand サブネット間でパケットを移動します。
ブリッジ/ゲートウェイ
InfiniBand と Ethernet ネットワークを接続するコンピュータ、あるいは独立のハードウェア。

GUID

Ethernet の MAC アドレスに似ていますが、デバイスには複数の GUID が割り当てられます。ハードウェアの製造メーカーによって割り当てられる GUID はマシンを再起動しても変化しません。64ビットのアドレスとしてアダプタ、スイッチ、ルーター、ブリッジ/ゲートウェイに割り当てられます (24ビットはメーカーのプレフィックスで残り40ビットがデバイスの識別子です)。

Node GUID
HCA, スイッチ, ルーターを識別します。
Port GUID
HCA, スイッチ, ルーターのポートを識別します (大抵 HCA には複数のポートが存在します)。
System GUID
複数の GUID をひとつのエンティティで扱えます。
LID (Local IDentifier)
サブネットマネージャによって割り当てられる16ビットのアドレス。パケットをルーティングするために使われます。再起動すると値が変わります。

ソフトウェア

SM (Subnet Manager)
InfiniBand のサブネットを活発に管理します。InfiniBand ネットワークに接続されたコンピュータで動作するソフトウェアプログラムを使用するか、専用の InfiniBand デバイスや InfiniBand スイッチに機能が内蔵されています。サブネット上の全てのものを初期化・設定して LID (Local IDentifier) を割り当てます。サブネットを通じてトラフィックパスを確立し、不正信号を隔離し、不許可のサブネットマネージャを防止します。サブネットはひとつでもサブネットマネージャの下、複数のスイッチを使うことができます。予備のサブネットマネージャを同一サブネット上に配置することもできますが、同時に複数のサブネットマネージャが使われることはありません。
MAD (MAnagement Datagram)
InfiniBand デバイスと通信するときにサブネットマネージャが使用する標準メッセージ形式。UD (Unreliable Datagram) によって運搬されます。

ソフトウェアのインストール

ここでは InfiniBand に関する AUR パッケージを紹介しています。AUR パッケージのインストール方法については AUR を見てください。

ファームウェアのアップグレード

最新ファームウェアを使うことで性能を著しく向上させたり、接続時の問題を解決したりすることができます。

警告: ファームウェアのアップグレードは自己責任で行ってください。新しいファームウェアを書き込むことでデバイスが文鎮化してしまう可能性は常に存在します。

Mellanox

  • mstflintAUR, libibumadAUR, libibmadAUR パッケージをインストールしてください。
  • アダプタの PCI デバイス ID を確認してください (例えば以下の場合は "05:00.0" がアダプタの PCI デバイス ID になります):
$ lspci | grep Mellanox
05:00.0 InfiniBand: Mellanox Technologies MT25418 [ConnectX VPI PCIe 2.0 2.5GT/s - IB DDR / 10GigE] (rev a0)
  • アダプタのファームウェアバージョンとアダプタの PSID を確認してください:
# mstflint -d <adapter PCI device ID> query
...
FW Version:      2.7.1000
...
PSID:            MT_04A0110002
  • 最新版のファームウェアを確認:
    • Mellanox のファームウェアダウンロードページ を開く。
    • 使用しているデバイスのカテゴリを選択する。
    • リストから使用している (mstflint で確認した) デバイスの PSID を検索する。
    • ファームウェアイメージのファイル名を確認して現在使っている FW バージョンよりも新しいかどうか確認する (例えば fw-25408-2_9_1000-MHGH28-XTC_A1.bin.zip という名前のファイルであればファームウェアのバージョンは 2.9.1000 FW です)。
  • 新しいバージョンが存在する場合、ファームウェアをダウンロードしてアダプタに書き込んでください:
$ unzip <firmware .bin.zip file name>
# mstflint -d <adapter PCI device ID> -i <firmware .bin file name> burn

Intel/QLogic

http://driverdownloads.qlogic.com/QLogicDriverDownloads_UI/Defaultnewsearch.aspxhttps://downloadcenter.intel.com/ を見てください。

カーネルモジュール

最新のカーネルには InifiniBand のモジュールが組み込まれており、ロードすることで使うことができます。

  • rdmaAUR[リンク切れ: パッケージが存在しません] をインストール。
    • /usr/lib/udev/rules.d/98-rdma.rules によって cxgb*, ib_*, mlx*, iw_*, be2net, usnic* ハードウェアカーネルモジュールがロードされます。
    • (rdma.service によって起動される) /usr/lib/rdma/rdma-init-kernel によって /etc/rdma/rdma.conf に指定されたカーネルモジュールがロードされます。
/etc/rdma/rdma.conf のオプション
オプション カテゴリ カーネルモジュール
(常時) Core ib_core, ib_mad, ib_sa, and ib_addr
(常時) Core ユーザー ib_umad, ib_uverbs, ib_ucm, and rdma_ucm
(常時) Core 接続マネージャ iw_cm, ib_cm, and rdma_cm
IPOIB_LOAD=yes (default yes)* Internet Protocol over InfiniBand ib_ipoib
RDS_LOAD=yes (default yes) Reliable Datagram Service rds, rds_tcp, and rds_rdma
SRP_LOAD=yes (default yes) SCSI Remote Protocol イニシエータ ib_srp
SRPT_LOAD=yes (default yes) SCSI Remote Protocol ターゲット ib_srpt
ISER_LOAD=yes (default yes) iSCSI over RDMA イニシエータ ib_iser.
ISERT_LOAD=yes (default no) iSCSI over RDMA ターゲット ib_isert.
(lhca デバイスの場合) IBM pSeries アダプタ (rare) ib_ehca
(be2net モジュールの場合) Emulex アダプタ (rare) ocrdma
ノート: カーネルスタックの処理 が原因で、/etc/rdma/rdma.conf に変更を加えた場合、マシンの起動時あるいは rdma.service を初めて起動した時に変更が反映されます。rdma.service の再起動では効果がありません。

サブネットマネージャ

InfiniBand ネットワークはサブネットマネージャを必要とします (サブネットマネージャを複数用意して冗長構成にすることもできます)。サブネットマネージャが存在しない場合でも、デバイスからリンクを認識することはできますが、"Initializing" 状態から永遠に "Active" になりません。サブネットマネージャは新しいアダプタが追加されていないか頻繁に (5あるいは30秒ごとに) InfiniBand をチェックして、アダプタをネットワークのルーティングテーブルに追加します。サブネットマネージャが組み込まれている InfiniBand スイッチを持っている場合、それを使ってください。持っていない場合はソフトウェアのサブネットマネージャを代わりとして使うことができます。InfiniBand サブネットマネージャ専用のデバイスも存在します。

ソフトウェアサブネットマネージャ

特定のコンピュータで以下を実行:

実行すると接続された InfiniBand ポートの状態が全て "Active" になり、物理状態が "LinkUp" になります。infiniband-diagsAUR に含まれている ibstat を実効することで確認できます:

$ ibstat
... (look at the ports shown you expect to be connected)
State: Active
Physical state: LinkUp
...

もしくは /sys ファイルシステムを確認:

$ cat /sys/class/infiniband/kernel_module/ports/port_number/phys_state
5: LinkUp
$ cat /sys/class/infiniband/kernel_module/ports/port_number/state
4: ACTIVE

TCP/IP over InfiniBand (IPoIB)

InfiniBand アダプタ上で動作する仮想の Ethernet アダプタを作成することができます。TCP/IP しか扱えないプログラムでも (間接的に) InfiniBand ネットワークを使えるようにするためです。InfiniBand ネットワークでインターネットトラフィックを転送するためではありません (インターネット接続のほうが Ethernet デバイスよりも高速な環境なら話は別です。つまり、Internet2 に参加していて、超高性能なスーパーコンピュータやクラスタ、データセンターが使えて、さらに Google FiberComcast によって提供されている 2Gbps 以上のインターネット接続が使用できる地域に居住しているという条件を満たす場合です。2015年現在ではほぼ不可能です)。

TCP/IP 経由で InfiniBand を使用するとプログラムのパフォーマンスが落ちます。IPoIB を使用すると全てのトラフィックは通常の TCP スタックを通過します。つまりシステムコール、メモリコピー、CPU で動作するネットワークプロトコルなどが必要になります。

  • カーネルモジュールをロードするために rdma をインストール
  • (ibX という名前の) ネットワークインターフェイスが作成されるので (例: ib0)、普通の Ethernet と同じように設定します。ゲートウェイを使用せずひとつのサブネットでポイントツーポイント接続を行う場合:
    • systemd-networkd を使う (既存のプライベートネットワーク IP アドレスと衝突しないように IP アドレスは必要に応じて置き換えてください):
/etc/systemd/network/interface.network
[Match]
Name=interface

[Network]
Address=192.168.2.1/24
設定後 systemd-networkd.service起動有効化してください。
/etc/conf.d/net-conf-interface
address=192.168.2.1
netmask=24
broadcast=192.168.2.255
設定後 network@interface.service起動有効化してください。

接続モード

IPoIB は "datagram" (デフォルト) または "connected" モードで実行できます。Connected モードでは MTU を高く設定できますが、datagram モードと比べて約 5 %以上 TCP のレイテンシが増加します。

現在使われているモードを確認するには:

$ cat /sys/class/net/interface/mode

MTU

datagram モードでは UD (Unreliable Datagram) トランスポートが使われ、MTU は強制的に 2044 バイトになります (技術的には IB L2 MTU (4バイトは IPoIB のカプセル化ヘッダ用) ですが通常は 2044 バイトです)。

connected モードでは RC (Reliable Connected) トランスポートが使われ、MTU は最大で IP パケットの最大値である 64K に設定できます (正確な値は 65520 バイト)。

MTU を確認するには:

$ ip link show interface

接続モードと MTU の設定

デフォルトの接続モードや MTU を変更したい場合は ipoibmodemtu が必要です。

設定による結果は様々です。connected モードで MTU 65520 を使うことで (2倍以上となる) ギガ級の速度がでることもありますし、同程度あるいは速度が落ちることもあります。qperfiperf を使って確認してください。

SDR の InfiniBand ネットワーク (論理値 8 Gb/s) で qperf を実行した例:

モード MTU MB/s 遅延 (us)
datagram 2044 707 19.4
connected 2044 353 18.9
connected 65520 726 19.6
ヒント: 通常、サブネット全体で同じ接続と MTU の設定を使った時が一番速度がでます。異なる設定を混ぜても機能はしますが、最適ではありません。

InfiniBand 経由でリモートデータストレージを使う

iSCSI, iSCSI と iSER, SRP を使うことで、InfiniBand ネットワーク経由でターゲット (ホスト/サーバー) からイニシエータ (ゲスト/クライアント) に物理デバイスや仮想デバイスを共有することができます。ネットワーク共有フォルダをマウントする (SambaNFS などの) 伝統的なファイル共有とは違って、イニシエータは共有デバイスをブロックレベルデバイスとして認識することができます。

欠点として一度に複数のシステムが共有デバイスを使うことはできず、既に共有されているデバイスをターゲットや他のイニシエータでマウントしようとしても失敗します (イニシエータ側で伝統的なファイル共有を動作させることは可能です)。

利点は物理的に離れていても高帯域幅でリモートからイニシエータのルートファイルシステムを使えることです (遠隔ブート)。

targetcli

targetcli はシェルのように機能し、複雑な /etc/target/saveconfig.json を擬似ファイルシステムとして作成します (手動で作成する必要はありません)。

インストールと使用方法

ターゲットで以下を実行:

targetcli では以下のことが出来ます:

  • どの疑似ディレクトリでも、help を実行することで擬似ディレクトリで使えるコマンドを確認できます。また、help command (help create など) で詳しいヘルプが表示されます。
  • ほとんどのコマンドでタブ補完が使えます。
  • 擬似ディレクトリや擬似ファイルシステムを確認するには ls を実行してください。
バックストアの作成

targetcli を使って共有したいデバイスや仮想デバイスのバックストアを設定してください (name はバックストアの名前に置き換えてください):

  • ブロックデバイスを共有するには、次のコマンドを実行: cd /backstores/blockcreate name dev (dev は共有したいブロックデバイスに置き換えてください、例: /dev/sda, /dev/sda4, /dev/disk/by-id/x, LVM 論理ボリューム /dev/vg0/lv1)。
  • ファイルを仮想ブロックデバイスとして共有するには、次のコマンドを実行: cd /backstores/fileiocreate name file (file は共有したいファイルに置き換えてください、例: /path/to/file)。
  • 物理的な SCSI デバイスをパススルーして共有するには、次のコマンドを実行: cd /backstores/pscsicreate name dev
  • RAM ディスクを共有するには、次のコマンドを実行: cd /backstores/ramdiskcreate name size (size は作成する RAM ディスクの容量に置き換えてください、例: 512MB, 20GB)。

iSCSI

iSCSI を使うことでネットワーク経由でストレージデバイスや仮想ストレージデバイスを使用できます。InfiniBand ネットワークの場合、ストレージは IPoIB あるいは iSER で使用できます。

iSCSI ターゲット, iSCSI イニシエータ, iSCSI ブートの記事と重複するところは多いですが、InfiniBand で使用するために変えなくてはいけないところも多く存在します。

IPoIB を使う

ターゲット環境の設定を先に行ってから一時的にイニシエータ環境に切り替えます。

  • ターゲット側で、共有したいデバイスや仮想デバイスごとに targetcli で以下を実行:
    • バックストアを作成
    • バックストアごとに iqn (iSCSI Qualified Name) を作成 (他のシステムから認識されるストレージの名前):
      • cd /iscsicreate を実行。ランダムに生成されたターゲット名が表示されます (例: iqn.2003-01.org.linux-iscsi.hostname.x8664:sn.3d74b8d4020a)。
      • Set up the tpg (Target Portal Group), automatically created in the last step as tpg1.
        • lun (Logical Unit Number) を作成。
          • cd randomly_generated_target_name/tpg1/lunscreate storage_object を実行。storage_object は既存のストレージオブジェクトのフルパスに置き換えてください (/backstores/block/name)。
        • acl (Access Control List) を作成。
          • cd ../aclscreate wwn を実行。wwn はイニシエータシステムの iqn (iSCSI Qualified Name) に置き換えてください。
            • (open-iscsi あるいは open-iscsi-gitAUR をインストールしてから) イニシエータシステムで次のコマンドを実行することで wwn を確認できます: cat /etc/iscsi/initiatorname.iscsi
    • cd /, saveconfig, exit を実行して保存して終了してください。
  • イニシエータ側では以下を実行:
    • open-iscsi または open-iscsi-gitAUR をインストール。
    • open-iscsi.service起動有効化
    • At this point, if you need this initiator system's iqn (iSCSI Qualified Name), aka its wwn (World Wide Name), for setting up the target system's luns, run: cat /etc/iscsi/initiatorname.iscsi.
    • Discover online targets. Run iscsiadm -m discovery -t sendtargets -p portal, where portal is an IP (v4 or v6) address or hostname.
    • Login to discovered targets. Run iscsiadm -m node -L all.
    • View which block device ID was given to each target logged into. Run iscsiadm -m session -P 3 | grep Attached. The block device ID will be the last line in the tree for each target. (-P is the print command, its option is the verbosity level, and only level 3 lists the block device IDs.)
iSER を使う

iSER (iSCSI Extensions for RDMA) は TCP/IP ではなく InfiniBand の RDMA プロトコルを活用します。TCP/IP のオーバーヘッドを排除することで高帯域・低遅延を実現し、CPU の使用率を下げます。

iSER デバイスが複数ある場合のバグと対処方法

open-iscsi 2.0_873-7 現在、iSER デバイスが複数存在する場合、以下のように iscsiadm がエラーを吐きます:

iscsiadm: recv's end state machine bug?
iscsiadm: Could not perform SendTargets discovery: iSCSI PDU timed out

バグ自体はかなり前に解決されていますが、open-iscsi の開発者 は2012年からリリースタグを付けていないため open-iscsi 2.0_873-7 では2012年時点でのソースコードが使われます。以下の方法で解決できます:

  1. 最新の開発ブランチのソースコードからビルドされる open-iscsi-gitAUR を使用する。
  2. 下のセクションで説明している対処方法を使う。
iSER デバイスの設定

iSER デバイスがひとつしかない場合や open-iscsi-gitAUR をインストールして複数の iSER デバイスを使用する場合はこちらのセクションを読んでください。open-iscsi を使用して複数の iSER デバイスを使いたい場合は、下のセクションに書かれている対処方法を読んでください。

iSCSI Over IPoIB の手順に以下の変更を加えてください:

  • IPoIB をインストールするかわりに、RDMA をインストールしてカーネルモジュールをロードすることができます。
  • On the target system, after everything else is setup, while still in targetcli, enable iSER on the target:
    • Run cd /iscsi/iqn/tpg1/portals/0.0.0.0:3260 for each iqn you want to have use iSER rather than IPoIB.
      • Where iqn is the randomly generated target name, i.e. iqn.2003-01.org.linux-iscsi.hostname.x8664:sn.3d74b8d4020a.
    • Run enable_iser true.
    • cd /, saveconfig, exit を実行して保存して終了してください。
  • On the initiator system, when running iscsiadm to discover online targets and login to them, use the additional argument -I iser.
open-iscsi 2.0_873-7 で複数の iSER デバイスを扱う

The bug only affects discovering multiple iSER devices. Once they're discovered, you can login to them, and fully use them. So as a workaround, you can discover the targets using IPoIB, change the target to iSER, make the 3 changes (filename, and two setting values) that open-iscsi -m discovery would make using iSER on the initiator, and proceed as normal.

  • On the target system, follow the iSCSI Over IPoIB instructions, without the changes for Configuring iSER devices.
  • On the initiator system, follow the iSCSI Over IPoIB instructions, up to and including discovering online targets, without the changes for Configuring iSER devices. Then:
    • systemctl stop open-iscsi を実行。
    • Rename each /etc/iscsi/nodes/iqn/ip-port/default file to iser, and edit each of these files.
      • Where iqn is the randomly generated target name in targetcli, i.e. iqn.2003-01.org.linux-iscsi.hostname.x8664:sn.3d74b8d4020a.
      • Where ip-port-etc is a directory in the form "192.168.2.1,3260,1".
      • iface.iscsi_ifacename = defaultiface.iscsi_ifacename = iser に変更。
      • iface.transport_name = tcpiface.transport_name = iser に変更。
  • ターゲット側で、iSER デバイスの設定の手順に従って iSER を有効にしてください。
  • イニシエータ側で以下を実行してください:
    • systemctl start open-iscsi を実行。
    • 探知したターゲットにログインするときに、iscsiadm -m node -L all -I iser を実行。

診断やベンチマークに使える InfiniBand プログラム

ibstat - コンピュータの InfiniBand GUID を表示

ibstat はコンピュータに接続されている InfiniBand アダプタの詳しい情報を表示します。モデル番号、ポートの数、ファームウェアやハードウェアのバージョン、ノード、システムイメージ、ポートの GUID、ポートの状態、物理状態、ベース LID、LMC、SM LID、ケイパビリティマスク、リンク層などが表示されます。

$ ibstat
CA 'mlx4_0'
        CA type: MT25418
        Number of ports: 2
        Firmware version: 2.9.1000
        Hardware version: a0
        Node GUID: 0x0002c90300002f78
        System image GUID: 0x0002c90300002f7b
        Port 1:
                State: Active
                Physical state: LinkUp
                Rate: 20
                Base lid: 3
                LMC: 0
                SM lid: 3
                Capability mask: 0x0251086a
                Port GUID: 0x0002c90300002f79
                Link layer: InfiniBand
        Port 2:
                State: Down
                Physical state: Polling
                Rate: 10
                Base lid: 0
                LMC: 0
                SM lid: 0
                Capability mask: 0x02510868
                Port GUID: 0x0002c90300002f7a
                Link layer: InfiniBand

上記は Mellanox Technologies (MT) アダプタの例です。モデル番号の代わりに PCI デバイス ID が報告されています (25418)。状態が "Active" となっているのは、サブネットマネージャに正しく接続されていることを意味します。物理状態が "LinkUp" なのは、ケーブルによる電気接続が確立されていることを意味しますが、必ずしもサブネットマネージャに正しく接続されているわけではありません。合計レートは 20 Gb/s となっています (5.0 Gb/s の信号レートと4つの仮想レーンが使われています)。サブネットマネージャは lid が3のポートが割り当てられています。

ibhosts - InfiniBand ネットワークの全てのホストを表示

ibhosts は InfiniBand ネットワーク上の各ホストの Node GUID、ポートの数、デバイス名を表示します。

# ibhosts
Ca      : 0x0002c90300002778 ports 2 "MT25408 ConnectX Mellanox Technologies"
Ca      : 0x0002c90300002f78 ports 2 "hostname mlx4_0"

ibswitches - InfiniBand ネットワークの全てのスイッチを表示

ibswitches は InfiniBand ネットワーク上の各スイッチの Node GUID、ポートの数、デバイス名を表示します。直接接続している場合、何も表示しません。

# ibswitches

iblinkinfo - InfiniBand ネットワークのリンク情報を表示

iblinkinfo はデバイス名, Port GUID, 仮想レーンの数, 信号伝送速度, ポート状態, 物理状態, 接続先などを表示します。

# iblinkinfo
CA: MT25408 ConnectX Mellanox Technologies:
      0x0002c90300002779      4    1[  ] ==( 4X           5.0 Gbps Active/  LinkUp)==>       3    1[  ] "kvm mlx4_0" ( )
CA: hostname mlx4_0:
      0x0002c90300002f79      3    1[  ] ==( 4X           5.0 Gbps Active/  LinkUp)==>       4    1[  ] "MT25408 ConnectX Mellanox Technologies" ( )

上記の例では2つのアダプタが直接接続されており通信速度は 5.0 Gb/s で、4つの仮想レーン (4X) が使われていることがわかります。

ibping - 他の InfiniBand デバイスに Ping

ibping は他の InfiniBand GUID に ping を実行します。ibping を使うときは片方のコンピュータでサーバーモードで起動しておき、他のコンピュータでクライアントモードで実行する必要があります。

ibping をサーバーモードで起動するには:

# ibping -S

特定のポートに ping するので CA 名や Node あるいは System GUID を使うことはできません。クライアントモードで実行するときは -G で Port GUID を指定するか、-L で Lid を指定します:

# ibping -G 0x0002c90300002779
-or-
# ibping -L 1
Pong from hostname.(none) (Lid 1): time 0.053 ms
Pong from hostname.(none) (Lid 1): time 0.074 ms
^C
--- hostname.(none) (Lid 4) ibping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1630 ms
rtt min/avg/max = 0.053/0.063/0.074 ms

IPoIB を使っている場合、通常の ping で TCP/IP スタックを使用して ping できます。ibping は InfiniBand インターフェイスを使うため TCP/IP スタックは使用されません。

ibdiagnet - サブネットの診断情報を表示

ibdiagnet はサブネットについて潜在的な問題を表示します。オプションを付けずに実行できます。-lw <1x|4x|12x> でコンピュータのアダプタの期待されるリンク幅 (仮想レーンの数) を指定することができ、アダプタが適切に動作しているかどうか確認することが可能です。また、-ls <2.5|5|10> でコンピュータのアダプタの期待されるリンク速度 (信号レート) を指定して正しく動作しているか確認できますが、FDR+ デバイスで 10 よりも大きいオプションを指定することはできません。-c <count> で送信されるパケットのデフォルト数が上書きされます。

# ibdiagnet -lw 4x -ls 5 -c 1000
Loading IBDIAGNET from: /usr/lib/ibdiagnet1.5.7
-W- Topology file is not specified.
    Reports regarding cluster links will use direct routes.
Loading IBDM from: /usr/lib/ibdm1.5.7
-I- Using port 1 as the local port.
-I- Discovering ... 2 nodes (0 Switches & 2 CA-s) discovered.


-I---------------------------------------------------
-I- Bad Guids/LIDs Info
-I---------------------------------------------------
-I- No bad Guids were found

-I---------------------------------------------------
-I- Links With Logical State = INIT
-I---------------------------------------------------
-I- No bad Links (with logical state = INIT) were found

-I---------------------------------------------------
-I- General Device Info
-I---------------------------------------------------

-I---------------------------------------------------
-I- PM Counters Info
-I---------------------------------------------------
-I- No illegal PM counters values were found

-I---------------------------------------------------
-I- Links With links width != 4x (as set by -lw option)
-I---------------------------------------------------
-I- No unmatched Links (with width != 4x) were found

-I---------------------------------------------------
-I- Links With links speed != 5 (as set by -ls option)
-I---------------------------------------------------
-I- No unmatched Links (with speed != 5) were found

-I---------------------------------------------------
-I- Fabric Partitions Report (see ibdiagnet.pkey for a full hosts list)
-I---------------------------------------------------
-I-    PKey:0x7fff Hosts:2 full:2 limited:0

-I---------------------------------------------------
-I- IPoIB Subnets Check
-I---------------------------------------------------
-I- Subnet: IPv4 PKey:0x7fff QKey:0x00000b1b MTU:2048Byte rate:10Gbps SL:0x00
-W- Suboptimal rate for group. Lowest member rate:20Gbps > group-rate:10Gbps

-I---------------------------------------------------
-I- Bad Links Info
-I- No bad link were found
-I---------------------------------------------------
----------------------------------------------------------------
-I- Stages Status Report:
    STAGE                                    Errors Warnings
    Bad GUIDs/LIDs Check                     0      0     
    Link State Active Check                  0      0     
    General Devices Info Report              0      0     
    Performance Counters Report              0      0     
    Specific Link Width Check                0      0     
    Specific Link Speed Check                0      0     
    Partitions Check                         0      0     
    IPoIB Subnets Check                      0      1     

Please see /tmp/ibdiagnet.log for complete log
----------------------------------------------------------------
 
-I- Done. Run time was 0 seconds.

qperf - RDMA や TCP/IP のパフォーマンスを測定

qperf は RDMA (SDP, UDP, UD, UC) や TCP/IP (IPoIB) における帯域幅や遅延を測定できます。

qperf を使う場合はまずどれかのコンピュータでサーバーモードで実行してください:

$ qperf

そして別のコンピュータでクライアントモードで起動してください (SERVERNODE はホストネーム (IPoIB の場合は TCP/IP アドレス) に、TESTS はテストの名前に置き換えてください):

$ qperf SERVERNODE [OPTIONS] TESTS

TCP/IP over IPoIB

$ qperf 192.168.2.2 tcp_bw tcp_lat
tcp_bw:
    bw  =  701 MB/sec
tcp_lat:
    latency  =  19.8 us

iperf - TCP/IP のパフォーマンスを測定

iperf は InfiniBand 用のプログラムではなく、TCP/IP や UDP をテストするためのプログラムです。IPoIB を使用した場合の InfiniBand の TCP/IP のパフォーマンスは qperf でテストできますが、iperf を使うこともできます。

どれかのコンピュータで iperf をサーバーモードで起動してください:

$ iperf3 -s

そして別のコンピュータでクライアントモードで実行してください:

$ iperf3 -c 192.168.2.2
[  4] local 192.168.2.1 port 20139 connected to 192.168.2.2 port 5201
[ ID] Interval           Transfer     Bandwidth
[  4]   0.00-1.00   sec   639 MBytes  5.36 Gbits/sec                  
...
[  4]   9.00-10.00  sec   638 MBytes  5.35 Gbits/sec                  
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth
[  4]   0.00-10.00  sec  6.23 GBytes  5.35 Gbits/sec                  sender
[  4]   0.00-10.00  sec  6.23 GBytes  5.35 Gbits/sec                  receiver

iperf Done.

iperf shows Transfer in base 10 GB's, and Bandwidth in base 2 GB's. So, this example shows 6.23GB (base 10) in 10 seconds. That's 6.69GB (base 2) in 10 seconds. (6.23 * 2^30 / 10^9) That's 5.35 Gb/s (base 2), as shown by iperf. (6.23 * 2^30 / 10^9 * 8 / 10) That's 685 MB/s (base 2), which is roughly the speed that qperf reported. (6.23 * 2^30 / 10^9 * 8 / 10 * 1024 / 8)

トラブルシューティング

接続できない

リンク, 物理状態, ポート状態

  • InfiniBand のハードウェアモジュールが認識されているか確認してください:
$ dmesg | egrep -i "Mellanox|InfiniBand|QLogic|Voltaire" # If you have an Intel adapter, you'll have to use Intel here and look through a few lines if you have other Intel hardware
[    6.287556] mlx4_core: Mellanox ConnectX core driver v2.2-1 (Feb, 2014)
[    8.686257] <mlx4_ib> mlx4_ib_add: mlx4_ib: Mellanox ConnectX InfiniBand driver v2.2-1 (Feb 2014)

または:

$ ls -l /sys/class/infiniband
mlx4_0 -> ../../devices/pci0000:00/0000:00:03.0/0000:05:00.0/infiniband/mlx4_0

何も表示されない場合、カーネルがアダプタを認識していません。(mlx4_0 カーネルモジュールを使用する) Mellanox の ConnectX アダプタを使用している場合に上記のように出力されます。

  • ポートや物理状態を確認してください:
$ ibstat
(look at the port shown you expect to be connected)

または:

$ cat /sys/class/infiniband/<kernel module>/ports/<port number>/phys_state
 5: LinkUp
$ cat /sys/class/infiniband/<kernel module>/ports/<port number>/state
 4: ACTIVE

物理状態が "LinkUp" になっているか確認してください。なっていない場合、ケーブルが接続されていないか、ケーブルが壊れているかです。ポートの状態は "Active" になっていなければなりません。"Initializing" や "INIT" になっている場合、サブネットマネージャが存在しないか、ネットワークのルーティングテーブルにポートを追加できていません。

  • InfiniBand を直接使用している場合 ibping が通るか確認する。IPoIB を使っている場合は ping が成功するか確認する。

getaddrinfo failed: Name or service not known

  • ibhosts を実行して各行の末尾に表示される CA 名を確認してください。

速度がでない

  • まずは期待値を確認してください。

How have you determined you have a speed problem? Are you using qperf or iperf, which both transmit data to and from memory rather than hard drives. Or, are you benchmarking actual file transfers, which relies on your hard drives? Unless you're running RAID to boost speed, even with the fastest SSD's available in mid 2015, a single hard drive (or sometimes even multiple ones) will be bottlenecking your InfiniBand transfer speeds. Are you using RDMA or TCP/IP via IPoIB? If so, there is a performance hit for using IPoIB instead of RDMA.

  • リンク速度を確認する:
$ ibstat
(look at the Rate shown on the port you are using.)

または:

# iblinkinfo
(look at the middle part formatted like "4X     5.0 Gbps")

または:

$ cat /sys/class/infiniband/<kernel module>/ports/<port number>/rate
20 Gb/sec (4X DDR)

帯域幅や仮想レーンの数が正しいか確認してください。

  • サブネットの診断情報を確認する。-ls帯域幅を指定して ibdiagnet を実行してください:
# ibdiagnet -lw <expected number of virtual lanes -ls <expected signaling rate> -c 1000

ネットワークの分割

InfiniBand のサブネットは使用者やアプリケーションごとに分割することができ、サービスのセキュリティや品質を上げることができます。各パーティションは PKEY (Partition Key) で識別されます。

libsdp で SDP (Sockets Direct Protocol) を使用する

代わりに librdmacmAUR を使ってください (開発当初の名前は rsockets でした)。

librdmacm (and formerly libsdp) use LD_PRELOAD to intercept non-Infiniband programs' socket calls, and transparently (to the program) send them over RDMA over InfiniBand. That is, it can dramatically speed up programs built for TCP/IP, more than you can achieve by using them with IPoIB. It avoids the need to change a program's source code to work with InfiniBand, and can even be used on programs without the user having the source code. It does not work on programs that statically linked in socket libraries.

libsdp was deprecated. The ib_sdp kernel module is no longer maintained or distributed.