InfiniBand - Arch Linux 中文维基

跳至內容

# InfiniBand

出自 Arch Linux 中文维基
翻譯狀態：

- 本文（或部分內容）譯自 InfiniBand，最近一次同步於 2025-05-03，若英文版本有所更改，則您可以幫助同步與翻譯更改的內容。
- 您可以在 ArchWiki 的對應頁面找到本文翻譯的原始修訂歷史。
- 本文可能與英文原文存在出入。

本頁介紹了如何設置、診斷和測試 InfiniBand 網絡。

## 簡介

### 概述

InfiniBand（簡稱 IB）是以太網和光纖通道的替代方案。IB 提供高帶寬和低延遲。IB 可以將數據直接從一台機器上的存儲設備傳輸到另一台機器的用戶空間，從而繞過並避免系統調用的開銷。IB 適配器可以處理的網絡協議與在 CPU 上運行的以太網協議不同，它允許作業系統和 CPU 在進行高帶寬傳輸時保持低占用。這在10Gb+以太網中是個重要問題。

IB 硬體由邁絡思（Mellanox，與 Voltaire 合併，並得到 Oracle 的大力支持）和英特爾（2012 年收購了 QLogic 的 IB 部門）製造。邁絡思於 2019 年被英偉達收購。IB 最常用於超算、集群和數據中心。IBM、惠普和 Cray 也是 InfiniBand 委員會的成員。Facebook、Twitter、eBay、YouTube 和 PayPal 都是 IB 用戶。

IB 軟體的開發基於 OpenFabrics Open Source Alliance。

### 實惠的二手設備

由於大型企業從使用更新的設備中獲益，無源 IB 線纜的最大長度限制，有源 IB 線纜的高成本，以及比以太網更複雜的技術設置，二手 IB 市場已經嚴重供大於求。因此，在家庭或小型企業的內部網絡中使用二手 IB 設備性價比很高。

### 帶寬

#### 信號傳輸速率

IB 傳輸速率一開始與 PCI Express（簡稱 PCIe）支持的最大速率一致。後來隨著 PCIe 的發展，傳輸速率與其他 I/O 技術一樣，每個埠的 PCIe 通道數也隨之增加。IB 推出的 SDR（單數據速率）每通道信號傳輸速率為 2.5Gb/s（與 PCIe v1.0 相對應），後來又增加了：5Gb/s 的 DDR（雙數據速率，PCIe 2.0）；10Gb/s 的 QDR（四數據速率，與 PCIe 3.0 的吞吐量相匹配，改進了 PCIe 3.0 的編碼而非信號傳輸速率）；以及 14.0625 Gbps 的 FDR（十四數據速率，與 16G FC 光纖通道相匹配）。IB 目前正在提供 25Gb/s 的 EDR（增強數據速率，與 25Gb 以太網相匹配）。計劃在 2017 年左右推出 50Gb/s 的 HDR（高數據速率）。

#### 有效吞吐量

由於 SDR、DDR 和 QDR 版本使用 8/10 編碼（8 位數據需要 10 位信令），這些版本的有效吞吐量降低到 80% 。 SDR 為 2Gb/s/link；DDR 為 4Gb/s/link；QDR 為 8Gb/s/link。從 FDR 開始，IB 使用 64/66 編碼，使有效吞吐量與信令速率的比率提高到 96.97% 。 FDR 為 13.64Gb/s/link；EDR 為 24.24Gb/s/lane；HDR 為 48.48Gb/s/link。

IB 設備能夠通過多個鏈路發送數據，不過商用標準是每條線纜大約 4 個鏈路。

使用普通 4X 鏈路設備時，總有效吞吐量可達 SDR 為 8Gb/s；DDR 為 16Gb/s；QDR 為 32Gb/s；FDR 為 54.54Gb/s；EDR 為 96.97Gb/s；HDR 為 193.94Gb/s。

### 延遲

IB 的延遲小得令人難以置信：SDR（5us）；DDR（2.5us）；QDR（1.3us）；FDR（0.7us）；EDR（0.5us）；HDR（< 0.5us）。相比之下，10Gb 以太網的延遲為 7.22us，是 FDR 延遲的 10 倍。

### 向後兼容性

IB 設備幾乎總是向後兼容的。連接應建立在最小帶寬上。用於 PCIe 8x 插槽的 DDR 適配器應能在 PCIe 4x 插槽中使用（帶寬減半）。

### 線纜

IB 無源銅纜使用 QDR 時最長可達 7 米，使用 FDR 時最長可達 3 米。

IB 有源光纖（光）電纜使用 FDR 時最長可達 300 米（FDR10 僅為 100 米）。

Mellanox MetroX 設備可提供長達 80 公里的連接。延遲每公里增加約 5us。

IB 線纜可用於直接連接兩台計算機，無需交換機；不存在 IB 交叉線纜。

## 術語解釋

### 硬體

適配器、交換機、路由器和網橋/網關必須專為 IB 而設計。

HCA (主機通道適配器)
  類似以太網 NIC（網絡接口卡）。它將 IB 電纜連接到 PCIe 總線上，如果使用的是適當型號的 HCA，則可達到總線的全速。IB 網絡的終端節點，執行傳輸級功能，並支持 IB verbs接口。
交換機
  與以太網網卡類似。在同一 IB 子網中將數據包從一個鏈路傳送到另一個鏈路。
路由器
  類似以太網路由器。在不同 IB 子網之間傳輸數據包。
網橋/網關
  一個獨立的硬體或執行此功能的計算機。橋接 IB 和以太網網絡。

### GUID

與以太網 MAC 地址類似，但一個設備有多個 GUID。由硬體製造商分配，重啟後保持不變。64 位地址（24 位製造商前綴和 40 位設備標識符）。分配給適配器、交換機、路由器和網橋/網關。

Node GUID
  標識 HCA、交換機或路由器
Port GUID
  標識 HCA、交換機或路由器上的埠（即使一個 HCA 通常也有多個埠）
System GUID
  允許將多個 GUID 視為一個實體
LID（本地標識符）
  子網管理器接收時分配的 16 位地址。用於路由數據包。重啟後不能持久使用。

### 網絡管理

SM（子網管理器）
  主動管理 IB 子網。可以作為連接到 IB 網絡的計算機上的一個軟體程序、內置到 IB 交換機中或作為專門的 IB 設備來實現。初始化和配置子網中的其他一切，包括分配 LID（本地標識符）。建立通過子網的流量路徑。隔離故障。防止其他未經授權的子網管理器。一個子網管理器下可以有多個交換機。一個子網中可以有多個子網管理器，但同時只能有一個處於活動狀態。
MAD（管理數據報）
  子網管理器與 IB 設備之間通信的標準信息格式，由 UD（不可靠數據報）承載。
UD（不可靠數據報）

## 安裝

首先安裝 rdma-core包 其中包含所有核心庫和守護進程。

### 更新固件

使用最新固件可顯著提高性能，並修復連接問題。

警告：請小心操作，設備可能會損壞！

#### 適用於 Mellanox

- 安裝 mstflintAUR
- 確定適配器的 PCI device ID (在這個例子中, "05:00.0" 就是適配器的 PCI device 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's firmware download page（本指南採用了該連結的 "固件刻錄說明" ，使用的是 mstflint 選項）
  - 選擇您的設備類別
  - 在 mstflint 給您的列表中找到設備的 PSID
  - 檢查固件映像文件名是否比適配器的 FW 版本更新，比如 `fw-25408-2_9_1000-MHGH28-XTC_A1.bin.zip` 的版本就是 `2.9.1000`
- 如果有最新版本，請下載新固件並將其刻錄到適配器中。

    $ unzip <firmware .bin.zip file name>
    # mstflint -d <adapter PCI device ID> -i <firmware .bin file name> burn

#### 適用於 Intel/QLogic

在 Intel Download Center 上搜索型號（或子串），然後按說明操作。下載的軟體可能需要在 RHEL/CentOS 或 SUSE/OpenSUSE 中運行。

### 內核模塊

按照自己的喜好編輯 `/etc/rdma/modules/rdma.conf` 和 `/etc/rdma/modules/infiniband.conf` 。 然後加載這些文件中記錄的內核模塊，如 `ib_ipoib`, 或直接重啟系統。

提示：儘管通常不需要這樣操作，但如果內核模塊未正確加載，請啟動並啟用 `rdma-load-modules@rdma.service` 和 `rdma-load-modules@infiniband.service`，然後重啟系統。
注意：由於內核堆棧的處理方式，對 `/etc/rdma/modules/rdma.conf` 的修改只能在每次啟動時生效一次， 即首次啟動 `rdma-load-modules@*.service` 時， 重啟 `rdma-load-modules@*.service` 沒有任何作用。

### 子網管理器

每個 IB 網絡至少需要一個子網管理器。如果沒有子網管理器，設備可能會顯示有連結，但狀態永遠不會從 `Initializing` 變為 `Active`。子網管理器會經常（通常為每 5 或 30 秒）檢查網絡中是否有新適配器，並將其添加到路由表中。如果 IB 交換機內嵌子網管理器，則可以使用該管理器，或者將其禁用，改用軟體子網管理器。也有專用的 IB 子網管理器設備。

### 啟用埠

如果埠處於物理狀態 `Sleep`（可通過 `ibstat` 驗證）則首先需要運行 `ibportstate --Direct 0 1 enable` 來啟用埠。如果鏈路兩端的埠都處於睡眠狀態，可能需要在啟動時自動執行此操作。

#### 軟體子網管理器

在一個系統上:

- 安裝 opensmAUR
- 修改 systemd 文件 `/usr/lib/systemd/system/opensm.service` 為如下所示。
- 啟用並啟動 `opensm.service`

當前的 opensm 配置與 RDMA 的 systemd 配置不兼容。即編輯 `/usr/lib/systemd/system/opensm.service` 中的兩行（注釋為原始內容）。

    # /usr/lib/systemd/system/opensm.service

    Requires=rdma-load-modules@rdma.service # Requires=rdma.service
    After=rdma-load-modules@rdma.service # After=rdma.service

現在，所有連接的 IB 埠都應處於 `Active` 狀態，物理狀態應為 `LinkUp`。您可以通過運行 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 (IPoIB)

您可以創建一個在 HCA 上運行的虛擬以太網適配器。這樣，設計用於 TCP/IP 但不用於 IB 的程序就可以（間接）使用 IB 網絡。由於通過正常的 TCP 協議棧發送所有流量，需要在 CPU 而不是 HCA 上運行系統調用、內存拷貝和網絡協議，因此性能會受到負面影響。

IB 接口將在加載模塊 `ib_ipoib` 時出現。 使其出現的簡單配置是在 `/etc/rdma/modules/infiniband.conf` 添加 `ib_ipoib` 行，然後重啟系統。模塊 `ib_ipoib` 隨系統啟動後，應使用命令 `ip link` 確認名稱為 `ibp16s0` 的連結。

還可對 IB 接口進行詳細配置 (例如，將其重命名為 `ib0` 並分配 IP 地址就像傳統的以太網適配器一樣).

### 連接模式

IPoIB 可在 datagram（默認）或 connected 模式下運行。Connected 模式允許您設置更高的 MTU，但短報文的 TCP 延遲會比 datagram 模式增加5%.

查看當前使用的模式：

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

注意： ConnectX-6（或更新版本）的 Mellanox 卡不再支持 Connected 模式。

### MTU

在 datagram 模式下，使用 UD（不可靠數據報）傳輸，這通常會強制 MTU 為 2044 字節。從技術上講，IB L2 MTU 將 4 字節用於 IPoIB 封裝頭，2044 字節傳輸數據。

在 connected 模式下，使用 RC（可靠連接）傳輸，允許 MTU 達到最大 IP 數據包大小（65520 字節）。

查看您的 MTU：

    $ ip link show interface

### 調優 connection 模式和 MTU

只有更改默認 connection 模式 和/或 MTU 時，才需要 `ipoibmodemtu`。

- 安裝並設置 TCP/IP over IB (IPoIB)
- 安裝 ipoibmodemtuAUR
- 通過 `/etc/ipoibmodemtu.conf` 配置 `ipoibmodemtu`，其中包含相關說明。
  - 默認情況下，它將單個 IB 埠 `ib0` 設置為 `connected` 模式和 MTU `65520` 。
- 啟動並啟用 `ipoibmodemtu.service`

不同的設置會產生不同的結果。有些人通過使用 `connected` 模式和 MTU `65520` 看到了速度的大幅提升（雙倍以上），而有些人看到的速度則與之差不多，甚至更差。請使用 qperf 和 iperf 對系統進行微調。

使用本文給出的 qperf 示例，下面是一個 SDR 網絡（理論速度為 8 Gb/s）的示例結果，其中包含各種微調:

Mode | MTU | MB/s | us latency
--- | --- | --- | ---
datagram | 2044 | 707 | 19.4
connected | 2044 | 353 | 18.9
connected | 65520 | 726 | 19.6

提示：整個子網使用相同的 connection 模式和 MTU 設置。混用和匹配無法達到最佳效果。

## Soft RoCE (RXE)

Soft ROCE 是 RoCE 的軟體實現，可通過任何以太網適配器使用 Infiniband。

- 安裝 iproute2包
- 運行 `rdma link add rxe_eth0 type rxe netdev ethN` 以在以太網設備 ethN 上配置 RXE 實例。

現在應該有一個 rxe0 設備了:

    # rdma link

    link rxe_eth0/1 state ACTIVE physical_state LINK_UP netdev enp1s0

## 遠程數據存儲

您可以使用 iSCSI、帶有 iSER 的 iSCSI 或 SRP，通過 IB 網絡將物理或虛擬設備從target（主機/伺服器）共享到initiator（訪客/客戶端）系統。 這些方法與傳統的文件共享（Samba 或 NFS）不同，因為啟動程序系統會將共享設備視為自己的塊級設備，而不是傳統的掛載網絡共享文件夾。 例如 `fdisk /dev/block_device_id`, `mkfs.btrfs /dev/block_device_id_with_partition_number`

缺點是每個共享設備一次只能有一個系統使用；試圖在目標系統（target system）或其他發起系統（initiator system）上掛載共享設備會失敗（最初的發起系統當然可以在上面運行傳統的文件共享）。

這樣做的好處是帶寬更快、控制能力更強，甚至可以遠程物理定位發起系統的根文件系統（遠程啟動）。

### targetcli

`targetcli`是一個命令，將其複雜的（不值得手動創建的）`/etc/target/saveconfig.json` 作為虛擬文件系統的配置文件。

#### 安裝和使用

在目標系統上:

- 安裝 targetcli-fbAUR
- 啟動並啟用 `target.service`

在 `targetcli` 中：

- 在任意虛擬目錄中，運行 `help` 可查看「『』該偽目錄中可用的命令『』」或 `help command`（如 `help create`）以獲得更詳細的幫助。
- 許多命令還提供Tab補全
- 運行 `ls` 查看當前虛擬目錄及其下的整個虛擬文件系統

#### 創建後端存儲

輸入配置命令:

    # targetcli

在 `targetcli` 中，為每個要共享的設備或虛擬設備設置一個後端存儲:

- 要共享真實的塊設備，請運行 `cd /backstores/block` 和 `create name dev`
- 要將文件作為虛擬塊設備共享，請運行 `cd /backstores/fileio` 和 `create name file`
- 要以直通方式共享物理 SCSI 設備，請運行 `cd /backstores/pscsi` 和 `create name dev`
- 要共享內存檔，請運行 `cd /backstores/ramdisk` 和 `create name size`
- 其中 name 表示後端存儲的名稱
- 其中 dev 是要共享的塊設備（如 `/dev/sda`、`/dev/sda4`、`/dev/disk/by-id/XXX` 或一個 LVM 邏輯卷 `/dev/vg0/lv1`）
- 其中 file 是要共享的文件（如 `/path/to/file`）
- 其中 size 是要創建的內存檔的大小（如 512MB 或 20GB）

### iSCSI

iSCSI 允許通過網絡使用存儲設備和虛擬存儲設備。對於 IB 網絡，存儲設備可以通過 IPoIB 或 iSER 運行。

與 iSCSI Target、iSCSI Initiator 和 iSCSI Boot 文章有很多重疊之處，但由於很多內容需要根據 IB 的使用情況進行定製，因此將討論必要的內容。

#### Over IPoIB

首先執行模板系統指令，這將指導您何時臨時切換到發起系統指令。

- 在目標系統和發起系統上，安裝 TCP/IP over IB

- 在目標系統上，對於要共享的每個設備或虛擬設備，使用 `targetcli`：
  - 創建後端存儲
  - 為每個後備存儲創建一個 IQN（iSCSI 限定名稱）（其他系統配置將看到的存儲名稱）
    - 運行 `cd /iscsi` 和 `create`. 它將為您提供一個 randomly_generated_target_name, 例如 `iqn.2003-01.org.linux-iscsi.hostname.x8664:sn.3d74b8d4020a`
    - 設置 TPG（目標門戶組），在上一步中自動創建為 tpg1
      - 創建 lun（邏輯單元編號）
        - 運行 `cd randomly_generated_target_name/tpg1/luns` 和 `create storage_object`。其中 `storage_object` 是指向現有存儲對象的完整路徑，例如 `/backstores/block/name`
      - 創建 acl （訪問控制列表）
        - 運行: `cd ../acls`; 和 `create wwn`, 此處 `wwn` 是initiator系統的 IQN（iSCSI 合格名稱），又稱其（全局名稱）。
          - 在發起系統（'不是目標系統）上運行 `wwn` 獲取（在其上安裝 open-iscsi包 之後）`cat /etc/iscsi/initiatorname.iscsi`
  - 通過運行 `cd /`；`saveconfig`；`exit` 來保存並退出。

- 在發起系統上：
  - 安裝 open-iscsi包
  - 此時，您可以獲取發起系統的 IQN（iSCSI 合格名稱），又稱 wwn（全局名稱），用於設置目標系統的 `lun`：
    - `pacman` 應顯示 `>>> Setting Initiatorname wwn`
    - 否則，請運行 `cat /etc/iscsi/initiatorname.iscsi` 查看 `InitiatorName=wwn`
  - 啟動並啟用 `iscsid.service`
  - 要在啟動時自動登錄已發現的目標系統 ，請在發現目標系統前編輯 `/etc/iscsi/iscsid.conf` 設置 `node.startup = automatic`。
  - 要尋找在線的目標系統。請以 root 身份運行 `iscsiadm -m discovery -t sendtargets -p portal` 其中 portal 是 IPv4/IPv6 地址或主機名
    - 如果使用主機名，請確保它路由到 IB IP 地址而不是以太網 - 只使用 IB IP 地址可能更佳。
  - 要在啟動時自動登錄已發現的目標系統，啟動並啟用 `iscsi.service`
  - 要手動登錄已發現的目標，請以 root 身份運行 `iscsiadm -m node -L all`。
  - 查看每個登錄目標的塊設備 ID。以 root 身份運行 `iscsiadm -m session -P 3 | grep Attached` 塊設備 ID 將出現在每個目標樹中的最後一行（`-P` 是列印命令，其選項是冗餘級別，只有第 3 級才會列出塊設備 ID）

#### Over iSER

iSER（iSCSI Extensions for RDMA）利用 IB 的 RDMA 協議，而不是使用 TCP/IP。它消除了 TCP/IP 的開銷，提供了更高的帶寬、零拷貝時間、更低的延遲和更低的 CPU 利用率。

根據 iSCSI Over IPoIB 介紹， 並做出以下更改:

- 如果您願意，可以直接安裝 RDMA 以加載內核模塊，而不是安裝 IPoIB。
- 在目標系統上，完成其他設置後，仍在 `targetcli` 中啟用目標系統上的 iSER:
  - 對於每一個您希望使用 iSER 而不是 IPoIB的 iqn ，運行 `cd /iscsi/iqn/tpg1/portals/0.0.0.0:3260`
    - 其中 iqn 是隨機生成的目標名稱，例如 `iqn.2003-01.org.linux-iscsi.hostname.x8664:sn.3d74b8d4020a`
  - 運行 `enable_iser true`
  - 保存並退出: `cd /`; `saveconfig`; 和 `exit`
- 在 initiator 系統上，運行 `iscsiadm` 尋早在線 target 時，使用附加參數 `-Iiser`，登錄 target 時，應該會看到: `Logging in to [iface: iser...`

#### 添加到 /etc/fstab

您上次尋找目標系統時，自動登錄一定是打開的。

就像添加本地塊設備一樣在 `/etc/fstab` 中添加掛載項，只是需要添加 `_netdev` 選項，以避免在網絡初始化前嘗試掛載。

## 網絡劃分

這篇文章的某些內容需要擴充。

原因：用示例解釋更多細節 (在 Talk:InfiniBand 中討論)

一個 IB 子網可以為不同的客戶或應用分區，從而提供安全性和服務質量保證。每個分區由 PKEY（分區密鑰）標識。

## SDP (Sockets Direct Protocol)

使用 `librdmacm` 和 `LD_PRELOAD` (rsockets和libspd的後續版本）和`LD_PRELOAD`來攔截非IB程序的套接字調用，並通過RDMA以透明方式（對程序而言）將其發送到IB上。這大大加快了為 TCP/IP 構建的程序的運行速度，遠遠超過使用 IPoIB 所能達到的速度。它避免了為使用 IB 而修改程序原始碼，甚至可用於閉源程序。它不適用於靜態連結套接字庫的程序。

## 診斷和基準測試

所有 IB 專用工具都包含在 rdma-core包 和 ibutilsAUR 中。

### ibstat - 查看計算機的 IB GUIDs

ibstat 會顯示計算機上運行的每個 IB 適配器的詳細信息，包括：型號；埠數；固件和硬體版本；節點，系統映像和埠 GUID；埠狀態，物理狀態，速率，base lid，lmc，SM lid，capability mask，和鏈路層。

    $ 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 Device ID（25418），而不是產品型號。它顯示的狀態是 「Active」，這意味著它已正確連接到子網管理器。它顯示的物理狀態為 「LinkUp」，這意味著它通過線纜進行了電氣連接，但不一定與子網管理器正確連接。它顯示的總速率為 20 Gb/s（對該卡來說，它來自 5.0 Gb/s 信號速率和 4 個虛擬通道）。它顯示子網管理器為該埠分配了 3 個 Base lid 。

### ibhosts - 查看 IB 網絡上的所有主機

ibhosts 會顯示 IB 網絡上每台主機的節點 GUID、埠數量和設備名稱。

    # ibhosts

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

### ibswitches - 查看 IB 網絡上的所有交換機

ibswitches 會顯示 IB 網絡上每個交換機的節點 GUID、埠數量和設備名稱。如果只使用直接連接，則不會顯示任何內容。

    # ibswitches

### iblinkinfo - 查看 IB 網絡連結信息

iblinkinfo 將顯示設備名稱、埠 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" ( )

該示例展示了不使用交換機直接連接的兩個適配器，使用 5.0 Gb/s 信號傳輸速率和 4 個虛擬通道 (4X)。

### ibping - Ping 另一個 IB 設備

ibping 將嘗試 ping 另一個 IB GUID。 ibping 必須在一台計算機上以伺服器模式運行，在另一台計算機上以客戶端模式運行。

ibping 必須在一台計算機上以伺服器模式運行。

    # ibping -S

而在另一個埠上則是客戶端模式。它正在 ping 一個特定埠，因此不能使用 CA 名稱、節點或系統 GUID。它需要`-G`和埠 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，則可以使用通過 TCP/IP 協議棧 ping 的常規 `ping`。 ibping 使用 IB 接口，不使用 TCP/IP 協議棧。

### ibdiagnet - 顯示整個子網的診斷信息

ibdiagnet 會顯示子網中的潛在問題。您可以在不帶選項的情況下運行它。 `-lw <1x|4x|12x>` 指定適配器的預期鏈路寬度(虛擬通道數)，這樣它就能檢查是否按預期運行。 `-ls <2.5|5|10>` 指定計算機適配器的預期連結速度（信號傳輸速率），以便檢查其是否按預期運行，但對於 FDR+ 設備，它還不支持速度超過 10 的選項。 `-c <count>` 覆蓋默認發送 10 個數據包。

    # 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 地址。其中有許多測試。下面是一些最有用的測試。

    $ 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 不是一個 IB 感知的程序，它的目的是通過 TCP/IP 或 UDP 進行測試。儘管qperf 可以使用 IPoIB 測試 IB TCP/IP 性能，但 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 以 10 GB 為基準顯示傳輸量，以 2 GB 為基準顯示帶寬。因此，本例顯示 10 秒內傳輸 6.23GB（base 10）。也就是 10 秒內傳輸 6.69GB（base 2）。(6.23 * 2^30 / 10^9) 即 5.35 Gb/s（base 2），如 iperf 所示。 (6.23 * 2^30 / 10^9 * 8 / 10) 即 685 MB/s（base 2），與 qperf 報告的速度大致相同。(6.23 * 2^30 / 10^9 * 8 / 10 * 1024 / 8)

## 常見問題 / FAQ

### 連結問題

#### 鏈路、物理狀態和埠狀態

- 查看系統是否能識別 IB 硬體模塊。如果您有英特爾適配器，則必須在此處使用Intel，如果您有其他英特爾硬體，則需要查看幾行內容:

    # dmesg | grep -Ei "Mellanox|InfiniBand|QLogic|Voltaire"

    [    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 或檢查 `/sys`.

    $ ibstat

    (look at the port shown that 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" ，則說明子網管理器不存在、未運行或未將埠添加到網絡路由表中。

- 您能否成功 ibping 其他直接使用 IB 的設備而不是 IPoIB？ 如果運行 IPoIB，能否成功 `ping`？

- 考慮更新固件.

#### getaddrinfo failed: Name or service not known

- 運行 ibhosts ，查看每行末尾帶引號的 CA 名稱

### 速度問題

- 首先要仔細檢查您的期望值。

您是如何確定存在速度問題的？您使用的是qperf還是iperf，它們都是從內存而不是硬碟傳輸數據。或者，您是在對實際文件傳輸進行基準測試嗎？除非你運行 RAID 來提高速度，否則即使使用 2015 年中期可用的最快固態硬碟，單個硬碟（有時甚至是多個硬碟）也會對 IB 傳輸速度造成瓶頸。您是通過 IPoIB 使用 RDMA 還是 TCP/IP？如果是，使用 IPoIB 而不使用 RDMA 會影響性能。

- 檢查您的連結速度，運行 ibstat, iblinkinfo, 或者檢查 `/sys`.

    $ 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)

這是否符合您預期的帶寬和虛擬通道數？

- 檢查整個子網的診斷信息。 運行 #ibdiagnet - 顯示整個子網的診斷信息. 確保使用 `-ls` 和適當的信號傳輸速率，這可能是您 IB 卡的宣傳速度除以 4.

    # ibdiagnet -lw <expected number of virtual lanes -ls <expected signaling rate> -c 1000

- 考慮更新固件.

分類：​

- 網絡

InfiniBand
新增話題