NVMe over TCPを試す

NVMe over TCPとは

NVMeをネットワーク経由で使うNVMe over FabricsというiSCSIのNVMe版のような仕組みがあります。TCP以外にFC、RDMA、InfiniBandを選択することができる documentation.suse.com www.purestorage.com

環境

NVMeのスロットを持った物理マシンが2台あればいいが、手元にないのでVMを使用する。QEMU1.6からNVMeエミュレーションに対応していてアタッチしているディスクをNVMeのディスクとして認識させることができる。(実態はSATA SSD上のqcow2)

VMスペック

CPU 4Core
メモリ 4GB
Disk 50GB
OS CentOS Stream8

同じスペックのVMを2台作成してイニシエータとターゲットにした。

構築

KVMでNVMeのディスクを作成

最初は普通にqcow2のディスクを作成する

qemu-img create -f qcow2 nvme.qcow2 50G

virsh editでVMの設定を変更する。 最上部の行を変更する

<domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>

最後のの前に以下を追加

  <qemu:commandline>
    <qemu:arg value='-drive'/>
    <qemu:arg value='file=/var/lib/libvirt/images/nvme.qcow2,format=qcow2,if=none,id=NVME1'/>
    <qemu:arg value='-device'/>
    <qemu:arg value='nvme,drive=NVME1,serial=nvme-1'/>
  </qemu:commandline>

この状態で起動すると権限エラーで失敗してしまう。/etc/apparmor.d/abstractions/libvirt-qemuに以下を追記してapparmorを再起動

ターゲットの設定

Mellanoxのコミュニティを参考にして設定した。ターゲットは設定方法は煩雑で値をechoで該当するファイルに書き込んでいく。 https://community.mellanox.com/s/article/NVMe-over-TCP-Test-Report

最初にモジュール読み込み

modprobe nvme
modprobe nvmet-tcp

サブシステムを作成

cd /sys/kernel/config/nvmet
mkdir subsystems/mysubsystem
cd subsystems/mysubsystem
echo 1 > attr_allow_any_host

namespaceを作成

mkdir namespaces/1
cd namespaces/1
echo -n /dev/nvm

IPアドレスとポートを設定

cd /sys/kernel/config/nvmet
mkdir ports/1
cd ports/1
echo "ipv4" > addr_adrfam
echo "tcp" > addr_trtype
echo 0.0.0.0 > addr_traddr
echo 4420 > addr_trsvcid

作成したサブシステムのリンクをport配下に設定する

ln -s /sys/kernel/config/nvmet/subsystems/mysubsystem 
/sys/kernel/config/nvmet/ports/1/subsystems

リンク作成した時にエラーが出ることがある

[root@hoge kernel]# ln -s /sys/kernel/config/nvmet/subsystems/mysubsystem /sys/kernel/config/nvmet/ports/1/subsystems
ln: failed to create symbolic link '/sys/kernel/config/nvmet/ports/1/subsystems/mysubsystem': Cannot assign requested address
nvmet_tcp: failed to bind port socket -99

なぜかアドレスを変えたら治った

イニシエータの設定

モジュールをターゲットと同じ方法で読み込んだらiscsiと同じようにつなぐだけ

nvme discover -t tcp -a 192.168.11.36 -s 4420
nvme connect -t tcp -a 192.168.11.36 -s 4420 -n mysubsystem -i 14

nvme listとかで見ると/dev/nvme1n1などデバイスが見えるようになる

まとめ

ほんとはベンチマーク取ってローカルとiSCSIとの比較とかしてたんですが、これをやったのが2月の話で書かないで放置していたらデータを紛失してしまったのでこれで終わりです。構築のところもログがあって実際にnvme listとかエラーとか出たのを記録してたはずなのになくなっちゃいました。