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とかエラーとか出たのを記録してたはずなのになくなっちゃいました。