Mellanox ConnectX-5でNVMe-ofプロトコルを使ってストレージのI/Oの検証しました
1.検証の目的
本レポートでは、ターゲットエミュレーション装置を用い、Mellanox ConnectX-5 がサポートしているNVMe over Fabric (NVMe-oF)プロトコルでのストレージI/Oのパフォーマンスを計測することにより、Mellanox ConnectX-5のドライバの設定とストレージへの接続手順を確認しました。
2.検証環境
使用機器:
■ SuperMirco サーバ OS: CentOS7.6.1810 Linux version 3.10.0-957.el7.x86_64
● 4 CPUs x Intel(R) Xeon(R) CPU E5-1620 v3 @ 3.50GHz
● Memory 16GB
● PC ExpressスロットのSR-IOV有効化
● MellanoxConnectX-5 を搭載
NVMe-oF 用のドライバにて、RDMA(Port4420)にてターゲットへ接続
■ SANBLaze ターゲットエミュレーション装置(https://www.sanblaze.com/nvme-over-fabrics)
● ConnectX-4を搭載したターゲットエミュレーション装置
NVMe-oF ターゲットを作成してマウント
■ パフォーマンス測定方法:
Linuxの代表的なfio(Flexible I/O Teste)を使用してベンチマークを測定
3.NVMe-oF
NVMe-oF は、SSD の登場によりそれまで主流だったSATAやSASで使用しているプロトコルに代わって採用されているSSD用のブロックアクセスプロトコルであるNVMeプロトコルをPCI-Expressバスの制限から解き放ち、SAN(ストレージネットワーク)を構成するための技術です。
NVMe (Non-Volatile Memory Express)プロトコルは、それまでのSATA、SASで使用されているプロトコル と比較すると膨大なキューサイズを持ち、ストレージIOの向上と多重化,遅延減少に劇的な進歩をもたらしました。しかしながら、NVMe プロトコルはPCI-Expressバス上を通るプロトコルであるため、接続距離、台数に制限がありました。
NVMe-oF 技術は Ethernet、Fibre Channel、InifiniBand という物理層、RDMAやiWARP などのリモートメモリアクセス技術を使って通信することで NVMe プロトコルを制限から解放します。
ちょうど1998年にSCSIプロトコルが FC(ファイバチャネル)によりSAN(ストレージエリアネットワーク)へと発展したのと同じように、共有ストレージへのアクセス、ストレージのネットワークを構築することによる接続デバイスの一元管理などの恩恵を得ることができます。
なぜNVMe?
現在主流となってきたSSD(ソリッドステートドライブ)は、それまでのHDD(回転ディスク)と比べて大幅にパフォーマンスの向上をもたらしただけでなく、大幅に並列処理を可能にしています。しかしながら広くストレージIOに使われているSCSIプロトコルはHDDとともに発展した(パラレル→シリアル)プロトコルであるため、コマンドのキューサイズはおおむね32~64個程度であり、残念ながらSSDの処理能力を有効に活用することができません。
NVMeは、メモリディスク用としてて開発されたプロトコルであり、先に述べたように膨大な(6万5535個)キューサイズを持ち、SSD の能力をフルに発揮することができます。
4.NVMe ドライバインストール
4.1 OFEDドライバのインストール
NVMe-oF 環境で使用するドライバは通常の-ENドライバではなく-OFEDドライバを使用します。
(1) ドライバのダウンロード
https://www.mellanox.com/page/products_dyn?product_family=26&mtag=linux_sw_drivers
(2) ドライバの解凍
(3) 指示にしたがい不足パッケージをインストールする
(4) ドライバインストール
4.2 ドライバのロード
(1) ConnectX-5 ドライバのロードと確認
(2) NVMeドライバのロード
(3) ドライバのモジュール確認
5.NICの設定
(1) デバイス名の確認
6.NVMe Client(Initiator)の設定
6.1 NVMeツール(nvme-cli)のインストール
(1)ツールのダウンロード ※ダウンロード先ディレクトリから実行
(2) Make
(3) Install
7.NVMe-oF ターゲットとの接続
※ NVMe-oF ターゲットとIP通信ができることをpingで確認しておく
(1) Initiator Suenqnの表示 NVMeコマンド
(2) Initiator Subnqnの確認
以下のファイルにIDが設定されていない場合には、追記すること
(3) Targetの検索
(4) Targetのマウント(コネクト)
Discoverにて表示されたターゲットのsubnqnを使ってターゲットをマウントします
nvme connect -t rdma -n nvme-subsystem-name -a 192.168.100.113 -s 442
(5) 接続確認
lsblkコマンドにて、接続されているか?確認します。
(6) デバイスの確認
/dev 配下にマウントされているか?確認します。
SANBLazeのNVMe-oFターゲットに作成した100GBのLUNを認識して、/dev/nvme1n1にマウントできました。
8.パフォーマンス測定
fio(Flexible I/O Teste)を使用してベンチマークを測定します。
8.1 fioインストール
(1) ダウンロード
グラフは、左縦軸がパフォーマンス(KB/秒)、右縦軸がCPUの使用率(%)
IOのDepth数とIO-Threads数を変えて計測した。
最大値は前述したRead=11.4GB(92Gbps)、Write=10.9GB(87.2Gbps)
CUP使用率は、最大でも17%以下であった。
Thread数を増やすとパフォーマンスは向上してもCPUの使用率の傾向はほとんど変わらなかった。
9.Appendix
9.1 fioのコマンドオプション
100MBのファイルを60秒間ランダムに読み書きし値を計測する
ブロックサイズ4KB、jobの数は1つで計測する
読み込み書き込の比率は書き込み50%、読み込み50%