NVMe Native多路径
存储侧
使用NVMe Native多路径时,存储侧无需额外配置,参考6.1.1.1节中存储侧配置,保证主机访问模式为均衡即可。
主机侧
检查多路径状态
当前支持的系统中,NVMe Native多路径默认开启,可使用如下方法确认:
[root@localhost /]# cat /sys/module/nvme_core/parameters/multipath Y
查看多路径状态策略
使用如下命令查看当前多路径策略:
[root@localhost /]# ls /sys/class/nvme-subsystem/ | grep subsys nvme-subsys0 [root@localhost /]# [root@localhost /]# cat /sys/class/nvme-subsystem/nvme-subsys0/iopolicy numa
可以看到多路径默认策略为numa,该策略下多路径只会选用一条路径下发IO,如果要实现负载均衡,需要修改多路径策略。
修改多路径策略
临时修改多路径策略为round-robin,可使用如下方法:
[root@localhost /]# echo round-robin > /sys/class/nvme-subsystem/nvme-subsys0/iopolicy [root@localhost /]# cat /sys/class/nvme-subsystem/nvme-subsys0/iopolicy round-robin
如果想永久生效,可参考下面的步骤配置:
- 在系统服务目录/etc/systemd/system下新建一个服务,服务名可自定义,如nvme_aa_round-robin.service。
[root@localhost /]# cat /etc/systemd/system/nvme_aa_round-robin.service [Unit] Description=Add active/active support to native NVMe multipath [Service] Type=oneshot ExecStart=/bin/sh -c "echo round-robin > /sys/class/nvme-subsystem/nvme-subsys0/iopolicy" [Install] WantedBy=default.target
- 验证服务功能正常。
[root@localhost /]# cat /sys/class/nvme-subsystem/nvme-subsys0/iopolicy numa [root@localhost /]# [root@localhost /]# systemctl start nvme_aa_round-robin.service [root@localhost /]# cat /sys/class/nvme-subsystem/nvme-subsys0/iopolicy round-robin
- 设置服务开机启动。
[root@localhost /]# systemctl enable nvme_aa_round-robin.service Created symlink /etc/systemd/system/default.target.wants/nvme_aa_round-robin.service → /etc/systemd/system/nvme_aa_round-robin.service.
配置检查
执行nvme list查看磁盘,当使用NVMe Native多路径时,不论每个NameSpace有多少条物理路径,nvme list下都只会对应一个盘符
[root@localhost /]# nvme list Node SN Model Namespace Usage Format FW Rev ---------------- -------------------- ---------------------------------------- --------- -------------------------- ---------------- -------- /dev/nvme0n1 2102352TSB10L3000020 Huawei-XSG1 1 0.00 B / 107.37 GB 512 B + 0 B 1000001 /dev/nvme0n2 2102352TSB10L3000020 Huawei-XSG1 2 0.00 B / 107.37 GB 512 B + 0 B 1000001
执行multipath -ll观察路径状态,如下所示场景存储映射了两个NameSpace,对应主机两个NameSpace,每个NameSpace两条物理路径,状态均为live
[root@localhost /]# multipath -ll eui.71008e272305366ef03f95ce00000008 [nvme]:nvme0n1 NVMe,Huawei-XSG1,1000001 size=209715200 features='n/a' hwhandler='n/a' wp=rw |-+- policy='n/a' prio=n/a status=n/a | `- 0:24704:1 nvme0c24704n1 0:0 n/a n/a live `-+- policy='n/a' prio=n/a status=n/a `- 0:24578:1 nvme0c24578n1 0:0 n/a n/a live eui.71008e272305366ff03f956a00000009 [nvme]:nvme0n2 NVMe,Huawei-XSG1,1000001 size=209715200 features='n/a' hwhandler='n/a' wp=rw |-+- policy='n/a' prio=n/a status=n/a | `- 0:24704:1 nvme0c24704n1 0:0 n/a n/a live `-+- policy='n/a' prio=n/a status=n/a `- 0:24578:1 nvme0c24578n1 0:0 n/a n/a live
1、部分新版本操作系统(如SuSE12 SP5/15SP2、CentOS 8.3及后续版本)中默认禁用了外部动态库,其中包括libforeign-nvme.so动态库,没有加载libforeign-nvme.so动态库会导致无法查询nvme-multipath生成的设备参数,所以执行multipath -ll命令无回显。可以编辑multipath.conf并在defaults字段中添enable_foreign参数解决,举例如下:
2、截至当前最新版本,由于multipath自身bug,multipath -ll查看到不同NameSpace下面的逻辑路径相同,可以使用ls /sys/class/nvme/nvme*查看所有逻辑路径,如下图所示nvme1c2n1、nvme1c130n1、nvme1c258n1、nvme1c0n1分别为NameSpace nvme1n1下面的4条逻辑路径,以此类推。