NVMe-oF 高性能外接儲存 · 100G QSFP28 , 搭配本次開箱測試 另外購買的 MSI EdgeXpert ( DGX-Spark)
GP-Spark 是一款 JBOF(Just a Bunch of Flash)NVMe-oF 儲存目標,內建 RDMA / NVMe-oF 硬體卸載引擎(專用 ASIC),以 100GbE(4 × 25G NRZ)QSFP28 介面透過 RoCEv2 連接 DGX Spark 等主機,把外接 NVMe SSD 提供給主機使用。搭配主機端的 SupremeRAID™ AEC,可由主機 GPU 執行 RAID,組成 SupremeJBOF 儲存方案。
※ 管理 IP 與帳密以機身標籤為準(見下方標籤照片)。管理介面需先連上 GP-Spark 的 Wi-Fi,再開啟 http://192.168.10.1;它與 NVMe-oF 儲存 IP(預設 10.10.10.12/24)是分開的。非隔離網路部署前,建議先變更出廠帳密。
(電源供應器為選配,請另行購買原廠核可、符合安規的 Type-C 20V / 3.25A 以上電源供應器)。
請依訂單與裝箱單核對內容,選配品可能不包含在內:
GP-Spark 透過 100G QSFP28 介面,採用 QSFP28 DAC 線或光纖模組,連接 DGX Spark 的 ConnectX-7 兩個介面中任一介面,或相容的 100GbE 主機網卡/交換器埠。連線需符合 100GbE / 4 × 25G NRZ 與 RoCEv2;四條 25G 通道組成一條 100GbE 連線,不是四個獨立埠。設備預設網路模式為 RS-FEC,請與對接端設定相容。
以下作業系統可連線至 GP-Spark(JBOF):
將 DGX-Spark 主機的儲存網卡 IP 設為與 GP-Spark 同網段( GP-Spark 出廠預設
10.10.10.12)。本次開箱 使用 DGX-Spark
背面左埠 enP2p1s0f0np0 = 10.10.10.1
# 設定埠位址(只用 ip addr add,不對儲存網卡做 ip link down/up) sudo ip addr add 10.10.10.1/24 dev enP2p1s0f0np0 # DGX-Spark 背面左埠 -> GP-Spark # 確認位址已生效 ip -4 addr show enP2p1s0f0np0 # 測試連通(-I 指定從哪一條線送) ping -c3 -I enP2p1s0f0np0 10.10.10.12 # 走左埠測 GP-Spark-1
※ GP-Spark 是 10.10.10.12,靠「哪個實體埠」區分;埠 IP(10.10.10.1)
之後即用作 nvme … -w 的 --host-traddr。
用完可 sudo ip addr del 10.10.10.2/24 dev enp1s0f1np1 移除;
若要開機自動生效,寫進 netplan/networkd(勿放 /etc/fstab)。
安裝 nvme-cli 以管理與連接 GP-Spark(可線上安裝或用本地源):
# CentOS sudo yum install -y nvme-cli # Ubuntu sudo apt-get install -y nvme-cli
sudo modprobe nvme-fabrics sudo modprobe rdma_cm sudo modprobe nvme sudo modprobe -v nvme-core multipath=0 sudo modprobe -v nvme-rdma register_always=0
MTU 依「對接的 GP-Spark 機型」而定。本機實測時, 搭配 另外購買的 MSI EdgeXpert ( DGX-Spark) 背面左埠 連接 GP-Spark, MTU 先依照主機(預設值) 與 GP-Spark(預設值) 能列出 subsystem 才算對; 偵測不到就把該埠 MTU 降到 1500 再試 ( ping 會過不代表 MTU 對,RDMA 建不起來時 ping 仍通)。 User Guide 以 MTU 5000 為設定範例;請確認主機、交換器(若有)與 GP-Spark 整條路徑都支援所設定的 MTU。
sudo nvme discover -t rdma -a 10.10.10.12 -s 4420 -w 10.10.10.1
# 偵測不到就把該埠 MTU 降到 1500 再試
sudo ip link set dev enP2p1s0f0np0 mtu 1500
探測 GP-Spark 提供的 NVMe-oF subsystem。目標位址(--traddr/-a)
固定是 GP-Spark 的 10.10.10.12, 主機自己的IP;
用 --host-traddr(-w)綁定要走哪一條線
(左埠 10.10.10.1)
# DGX-Spark 左埠 ( GP-Spark ) sudo nvme discover -t rdma -a 10.10.10.12 -s 4420 -w 10.10.10.1 # 會出現結果如下 ... Discovery Log Number of Records 4, Generation counter 0 =====Discovery Log Entry 0====== trtype: rdma adrfam: ipv4 subtype: nvme subsystem treq: not specified portid: 0 trsvcid: 4420 subnqn: nqn.2015-09.com.wdc:nvme.1 traddr: 10.10.10.12 eflags: none rdma_prtype: roce-v2 rdma_qptype: connected rdma_cms: rdma-cm rdma_pkey: 0x0000 # 摘錄 , 中間省略 ... =====Discovery Log Entry 3====== trtype: rdma adrfam: ipv4 subtype: nvme subsystem treq: not specified portid: 0 trsvcid: 4420 subnqn: nqn.2015-09.com.wdc:nvme.4 traddr: 10.10.10.12 eflags: none rdma_prtype: roce-v2 rdma_qptype: connected rdma_cms: rdma-cm rdma_pkey: 0x0000
※ 常見錯誤:把 --traddr 填成主機埠 IP(10.10.10.1)會得到
Connection reset by peer / failed to add controller——那是「連到自己」。目標一律 10.10.10.12。
$nqn 對應上一步探測到的 subnqn;目標同樣是
10.10.10.12,並用 -w 綁同一條線。連接成功無返回值,
可用 lsblk 或 nvme list 查看:
# 連接測試 , 先查看 要連接的 裝置名稱 與 uuid cat /etc/nvme/hostnqn # 會顯示如下: nqn.2014-08.org.nvmexpress:uuid:9d400c12-d2e8-af54-b9d8-fc9d05013b1f # 指令: 連線第 1 個 Subsystem (nvme.1) sudo nvme connect -t rdma -a 10.10.10.12 -s 4420 -w 10.10.10.1 \ -n nqn.2015-09.com.wdc:nvme.1 \ -q nqn.2014-08.org.nvmexpress:uuid:9d400c12-d2e8-af54-b9d8-fc9d05013b1f # 指令: 連線第 2 個 Subsystem (nvme.2) sudo nvme connect -t rdma -a 10.10.10.12 -s 4420 -w 10.10.10.1 \ -n nqn.2015-09.com.wdc:nvme.2 \ -q nqn.2014-08.org.nvmexpress:uuid:9d400c12-d2e8-af54-b9d8-fc9d05013b1f # 指令: 連線第 3 個 Subsystem (nvme.3) sudo nvme connect -t rdma -a 10.10.10.12 -s 4420 -w 10.10.10.1 \ -n nqn.2015-09.com.wdc:nvme.3 \ -q nqn.2014-08.org.nvmexpress:uuid:9d400c12-d2e8-af54-b9d8-fc9d05013b1f # 指令: 連線第 4 個 Subsystem (nvme.4) sudo nvme connect -t rdma -a 10.10.10.12 -s 4420 -w 10.10.10.1 \ -n nqn.2015-09.com.wdc:nvme.4 \ -q nqn.2014-08.org.nvmexpress:uuid:9d400c12-d2e8-af54-b9d8-fc9d05013b1f # 出現結果 connecting to device: nvme1 connecting to device: nvme2 connecting to device: nvme3 connecting to device: nvme4 # 查看連上的遠端 NVMe nvme list # 結果如下: ( 下列 NVME 需另外購買 ) Node Generic SN Model Namespace Usage Format FW Rev --------------------- --------------------- -------------------- ---------------------------------------- ---------- -------------------------- ---------------- -------- /dev/nvme0n1 /dev/ng0n1 S8C2NG0YA27605 SAMSUNG MZALC4T0HBL1-00B07 0x1 223.88 GB / 4.10 TB 512 B + 0 B NXHB202Q /dev/nvme1n1 /dev/ng1n1 41100768072400043575 PCIe SSD 0x1 512.11 GB / 512.11 GB 512 B + 0 B EJFMC0.0 /dev/nvme2n1 /dev/ng2n1 DE7F0768082100024250 PCIe SSD 0x1 512.11 GB / 512.11 GB 512 B + 0 B EJFMC0.0 /dev/nvme3n1 /dev/ng3n1 41100768072400043576 PCIe SSD 0x1 512.11 GB / 512.11 GB 512 B + 0 B EJFMC0.0 /dev/nvme4n1 /dev/ng4n1 41100768072400043577 PCIe SSD 0x1 512.11 GB / 512.11 GB 512 B + 0 B EJFMC0.0
※ 用完卸除:sudo nvme disconnect -n $nqn(勿用 disconnect-all)。
此步只是把遠端 NVMe 接成區塊裝置,不含建檔案系統;
GP-Spark 為 RAID 陣列成員碟時,切勿格式化或寫入!
此 nvme disconnect 僅適用於單獨以 nvme-cli 連線;SupremeRAID™ AEC 的 RAID 使用中時不可直接下 nvme disconnect,請依 User Guide 4.2 的關機程序。
前面的步驟是單獨用 nvme-cli 連線。若要使用 GPU 加速 RAID,需在每一台支援的 DGX 主機上安裝 SupremeRAID™ AEC,再由 AEC 連接 GP Spark 並建立 RAID。依部署方式選擇起點:
| 部署方式 | 起點 | 接著 |
|---|---|---|
| 單台主機、自動安裝 | 自動設定腳本(6.1) | create_raid=false 時接著建立 PD / DG / VD;否則直接驗證建好的磁碟區 |
| 單台主機、手動安裝 | 安裝程式步驟(6.2) | 連接目標並建立 PD / DG / VD(6.3) |
| 多台 DGX 主機 | 多主機部署順序(6.6,見下一章) | 以 create_raid=false 安裝 → 切 Namespace → 分配給各主機 → 各自建 RAID |
AEC 透過 Remote NVMe-oF Target 功能管理 GP Spark 連線(graidctl),連線資訊會保存並在重開機後自動重連,不需要另外設定 nvme-cli 自動連線服務。
先執行 pre-installer(含 NVIDIA 驅動與相依套件),再執行 installer。--productline 請用安裝包接受的值(目前為 ae),--yes 允許自動重開機。
PRE_INSTALLER='/absolute/path/to/pre-installer.run' sudo chmod +x "$PRE_INSTALLER" sudo "$PRE_INSTALLER" --productline=ae --yes INSTALLER='/absolute/path/to/installer.run' sudo chmod +x "$INSTALLER" sudo "$INSTALLER" --accept-license
https://<DGX 管理 IP>:50060(需開放 TCP 50060)。這是 DGX 上的 AEC 管理介面,和 GP Spark 的網頁介面 http://192.168.10.1 不同。sudo graid-mgr host_token gen
腳本會檢查 NVIDIA 驅動、執行 pre-installer 與 installer、在必要的重開機之間自動續跑,並驗證 AEC 服務。它不會設定網路、修改 Secure Boot 或簽署模組,這些要先自行完成。安裝包需放在設定檔 [supremeraid] package_dir 指定的目錄(預設 /opt/graid/packages)。
wget https://download.graidtech.com/misc/tools/gpspark_setup/gpspark_setup.zip unzip gpspark_setup.zip sudo python3 gpspark_setup.py --dry-run # preflight only, no changes sudo python3 gpspark_setup.py # install (resumes after reboots) sudo python3 gpspark_setup.py --status # current stage / next action sudo python3 gpspark_setup.py --verify # check AEC services
預設 create_raid=false 只安裝軟體,完成後要再手動建立 PD / DG / VD。設成 true 會建立 RAID 並格式化磁碟,只能用在確認過、已備份的新磁碟。失敗時看 /var/lib/gpspark-setup/setup.log,不要把 --reset 當重試用(會清掉進度)。
sudo graidctl list remote_target sudo graidctl list physical_drive sudo graidctl list drive_group sudo graidctl list virtual_drive findmnt -M /mnt/graid df -h /mnt/graid
一台 GP Spark 可以把每顆 SSD 切成多個 NVMe Namespace,分配給多台 DGX Spark。每台主機用分配到的 Namespace 建立自己的 AEC Drive Group 與 Virtual Drive,各自擁有獨立容量;這不是共享檔案系統,也不能多台同時存取同一個 VD。
| 主機 | 每顆 SSD 各取一個 Namespace | 該主機上的 AEC 儲存 |
|---|---|---|
| DGX 0 | SSD 0、1、2、3 的 NS 1 | 4 個 PD → 本機 DG / VD |
| DGX 1 | SSD 0、1、2、3 的 NS 2 | 4 個 PD → 本機 DG / VD |
| DGX 2 | SSD 0、1、2、3 的 NS 3 | 4 個 PD → 本機 DG / VD |
| DGX 3 | SSD 0、1、2、3 的 NS 4 | 4 個 PD → 本機 DG / VD |
graidctl connect remote_target 連線或建立 PD / DG / VD。create_raid=false 安裝 AEC,完成授權啟用與 GPU 綁定;先不要用 AEC 連接 GP Spark,也不要建立任何 RAID。探測 GP Spark 的儲存子系統(選 storage subsystem,不是 discovery subsystem),把 4 顆 SSD 的 subnqn 填進下方清單後全部連上。務必確認每個 NQN 與序號對應到正確的 SSD,絕對不要選到本機開機碟。
TARGET_IP=10.10.10.12
TARGET_PORT=4420
sudo nvme discover -t rdma -a "$TARGET_IP" -s "$TARGET_PORT"
SSD_NQNS=(
'replace-with-ssd0-nqn' 'replace-with-ssd1-nqn'
'replace-with-ssd2-nqn' 'replace-with-ssd3-nqn'
)
for SSD_NQN in "${SSD_NQNS[@]}"; do
sudo nvme connect -t rdma -a "$TARGET_IP" -s "$TARGET_PORT" \
-n "$SSD_NQN" --nr-io-queues=8 || break
done
nvme list-subsys
nvme list
在 gpspark_setup.conf 設定每顆 SSD 要切出的大小(以下範例:4 顆 SSD 各切 4 個 100 GiB,共 16 個)。每顆 SSD 需有至少 400 GiB 未配置容量與 4 個空的 Namespace 位置;現有 Namespace 會保留。
[raid] create_raid = false namespace_manifest = nvmf_address = 10.10.10.12 nvmf_svcid = 4420 nvmf_transport = rdma [namespace] nqn = ssd_serial = sizes_gib = 100,100,100,100 lba_bytes = 512
先存成計畫檔並檢查(不會改動任何 Namespace),停止所有相關主機的 I/O 後再套用;套用時要輸入畫面上的確認字串。批次是逐顆執行、不會回復:若中途失敗,保留同一份計畫檔與 journal,用 --namespace-resume 繼續,絕對不要刪 journal。
sudo python3 gpspark_setup.py --namespace-plan --namespace-batch \ --plan-file batch-plan.json sudo python3 gpspark_setup.py --namespace-apply --namespace-batch \ --plan-file batch-plan.json # Type "APPLY BATCH 4 SSDS" to continue sudo python3 gpspark_setup.py --namespace-apply --namespace-batch \ --plan-file batch-plan.json --namespace-resume # only after a failure
完成後從 journal 記下每個 Namespace 的 NSID、UUID 與容量,填寫每台 DGX 的分配記錄(SSD 序號 / 子系統 NQN、NSID、UUID、容量),交給 JBOF 管理者做主機分配。
主機分配與交接完成後,在該台 DGX 執行以下指令,逐一比對看到的 Namespace 是否和分配記錄一致。若看到不屬於自己的 Namespace、重複或歸屬不清,不要建立 PD,先修正分配並和技術支援確認隔離。
sudo graidctl connect remote_target rdma 10.10.10.12 ipv4 4420 sudo graidctl list nvme_drive nvme list-subsys nvme list
確認無誤後,只用這台的 4 個 Namespace(各來自不同 SSD)依手冊 6.3.2 建立 PD → DG → VD 並建立檔案系統,絕對不要選取全部探測到的 Namespace。完成後檢查:
sudo graidctl list physical_drive sudo graidctl list drive_group sudo graidctl list virtual_drive
容量估算:4 個 100 GiB 組成 RAID 5,約 300 GiB 可用(未扣系統開銷)。請在每台主機測試讀寫完整性,並量測共用 100GbE 連線下的總吞吐量。
查看服務狀態與記錄,排除原因後依序重啟 graid、graid-mgr,再檢查一次狀態(重啟成功通常沒有輸出,不代表一定正常)。
systemctl status graid.service graid-mgr.service journalctl -u graid.service -u graid-mgr.service -b systemctl restart graid.service systemctl restart graid-mgr.service
通常是 GP Spark 連線不穩定:網路短暫中斷 → Namespace 掉線 → 恢復後狀態不一致而重新同步。優先檢查線材、連接埠、RoCEv2 設定與 GP Spark 網路穩定度。不要為了消除 RESYNC 重建現有的 Drive Group。
graidctl list physical_drive graidctl list remote_target nvme list-subsys dmesg | grep -i nvme
-17(EEXIST)代表物件或資源衝突,常見原因是 VD 仍被掛載或被程式占用。先停止應用程式、I/O 與 automount,釋放 VD 後再確認是否已留下 DG / VD,再決定是否重試。
mount | grep gdg lsof /dev/gdg0n1 umount /mnt/graid graidctl list drive_group graidctl list virtual_drive
先確認主機不透過 AEC 也能用 RDMA 探測到目標;探測不到就檢查位址、連接埠、網路與 RDMA。探測成功後再重試連線,若仍看不到 Namespace,檢查目標存取權限與 Host NQN。
nvme discover --transport=rdma --traddr=10.10.10.12 --trsvcid=4420 graidctl connect remote_target rdma 10.10.10.12 ipv4 4420
完整內容(進階手動切割、單顆 SSD 更換與回復、解除安裝等)請參考《SupremeJBOF User Guide V1.1.1》。
若已誤操作導致系統無法正常啟動:進入單使用者模式,修改 /etc/fstab 刪除該硬碟掛載項,
讓系統先正常啟動,再以 nvme-cli 手動掛載 SSD。
※ 以上限制針對單獨連線的 NVMe-oF namespace。使用 SupremeRAID™ AEC 時,由服務管理目標連線,RAID 虛擬磁碟可依 User Guide 4.1 / 6.3.2 使用網路/服務相依的 fstab 與 automount 設定;但仍不可把底層 NVMe-oF namespace 當成本機硬碟加入 fstab。