2017-04-28 23:19:05 +00:00
|
|
|
# NVMe over Fabrics Target {#nvmf}
|
|
|
|
|
|
|
|
@sa @ref nvme_fabrics_host
|
|
|
|
|
|
|
|
|
2017-09-25 23:26:56 +00:00
|
|
|
# NVMe-oF Target Getting Started Guide {#nvmf_getting_started}
|
2016-06-06 23:32:22 +00:00
|
|
|
|
2016-08-04 20:18:12 +00:00
|
|
|
The NVMe over Fabrics target is a user space application that presents block devices over the
|
|
|
|
network using RDMA. It requires an RDMA-capable NIC with its corresponding OFED software package
|
|
|
|
installed to run. The target should work on all flavors of RDMA, but it is currently tested against
|
|
|
|
Mellanox NICs (RoCEv2) and Chelsio NICs (iWARP).
|
|
|
|
|
|
|
|
The NVMe over Fabrics specification defines subsystems that can be exported over the network. SPDK
|
|
|
|
has chosen to call the software that exports these subsystems a "target", which is the term used
|
|
|
|
for iSCSI. The specification refers to the "client" that connects to the target as a "host". Many
|
|
|
|
people will also refer to the host as an "initiator", which is the equivalent thing in iSCSI
|
|
|
|
parlance. SPDK will try to stick to the terms "target" and "host" to match the specification.
|
|
|
|
|
2018-01-22 22:20:01 +00:00
|
|
|
The Linux kernel also implements an NVMe-oF target and host, and SPDK is tested for
|
|
|
|
interoperability with the Linux kernel implementations.
|
2016-06-06 23:32:22 +00:00
|
|
|
|
2017-07-13 05:14:57 +00:00
|
|
|
If you want to kill the application using signal, make sure use the SIGTERM, then the application
|
|
|
|
will release all the share memory resource before exit, the SIGKILL will make the share memory
|
|
|
|
resource have no chance to be released by application, you may need to release the resource manually.
|
|
|
|
|
2017-04-28 23:19:05 +00:00
|
|
|
## Prerequisites {#nvmf_prereqs}
|
2016-06-06 23:32:22 +00:00
|
|
|
|
2016-08-04 20:18:12 +00:00
|
|
|
This guide starts by assuming that you can already build the standard SPDK distribution on your
|
2016-08-08 23:35:11 +00:00
|
|
|
platform. By default, the NVMe over Fabrics target is not built. To build nvmf_tgt there are some
|
|
|
|
additional dependencies.
|
2016-06-06 23:32:22 +00:00
|
|
|
|
|
|
|
Fedora:
|
2017-01-04 21:47:02 +00:00
|
|
|
~~~{.sh}
|
2016-06-06 23:32:22 +00:00
|
|
|
dnf install libibverbs-devel librdmacm-devel
|
2017-01-04 21:47:02 +00:00
|
|
|
~~~
|
2016-06-06 23:32:22 +00:00
|
|
|
|
|
|
|
Ubuntu:
|
2017-01-04 21:47:02 +00:00
|
|
|
~~~{.sh}
|
2016-06-06 23:32:22 +00:00
|
|
|
apt-get install libibverbs-dev librdmacm-dev
|
2017-01-04 21:47:02 +00:00
|
|
|
~~~
|
2016-06-06 23:32:22 +00:00
|
|
|
|
2018-01-22 22:20:01 +00:00
|
|
|
Then build SPDK with RDMA enabled:
|
2016-06-08 23:34:15 +00:00
|
|
|
|
2017-01-04 21:47:02 +00:00
|
|
|
~~~{.sh}
|
2018-01-22 22:20:01 +00:00
|
|
|
./configure --with-rdma <other config parameters>
|
|
|
|
make
|
2017-01-04 21:47:02 +00:00
|
|
|
~~~
|
2016-06-06 23:32:22 +00:00
|
|
|
|
2016-08-04 20:18:12 +00:00
|
|
|
Once built, the binary will be in `app/nvmf_tgt`.
|
|
|
|
|
2017-04-28 23:19:05 +00:00
|
|
|
## Prerequisites for InfiniBand/RDMA Verbs {#nvmf_prereqs_verbs}
|
2017-02-09 16:32:10 +00:00
|
|
|
|
|
|
|
Before starting our NVMe-oF target we must load the InfiniBand and RDMA modules that allow
|
|
|
|
userspace processes to use InfiniBand/RDMA verbs directly.
|
|
|
|
|
|
|
|
~~~{.sh}
|
|
|
|
modprobe ib_cm
|
|
|
|
modprobe ib_core
|
|
|
|
modprobe ib_ucm
|
|
|
|
modprobe ib_umad
|
|
|
|
modprobe ib_uverbs
|
|
|
|
modprobe iw_cm
|
|
|
|
modprobe rdma_cm
|
|
|
|
modprobe rdma_ucm
|
|
|
|
~~~
|
|
|
|
|
2017-04-28 23:19:05 +00:00
|
|
|
## Prerequisites for RDMA NICs {#nvmf_prereqs_rdma_nics}
|
2017-02-09 16:32:10 +00:00
|
|
|
|
|
|
|
Before starting our NVMe-oF target we must detect RDMA NICs and assign them IP addresses.
|
|
|
|
|
|
|
|
### Mellanox ConnectX-3 RDMA NICs
|
|
|
|
|
|
|
|
~~~{.sh}
|
|
|
|
modprobe mlx4_core
|
|
|
|
modprobe mlx4_ib
|
|
|
|
modprobe mlx4_en
|
|
|
|
~~~
|
|
|
|
|
|
|
|
### Mellanox ConnectX-4 RDMA NICs
|
|
|
|
|
|
|
|
~~~{.sh}
|
|
|
|
modprobe mlx5_core
|
|
|
|
modprobe mlx5_ib
|
|
|
|
~~~
|
|
|
|
|
2017-04-28 23:19:05 +00:00
|
|
|
### Assigning IP addresses to RDMA NICs
|
2017-02-09 16:32:10 +00:00
|
|
|
|
|
|
|
~~~{.sh}
|
|
|
|
ifconfig eth1 192.168.100.8 netmask 255.255.255.0 up
|
|
|
|
ifconfig eth2 192.168.100.9 netmask 255.255.255.0 up
|
|
|
|
~~~
|
|
|
|
|
2018-01-22 22:20:01 +00:00
|
|
|
## Configuring the SPDK NVMe over Fabrics Target {#nvmf_config}
|
2016-06-06 23:32:22 +00:00
|
|
|
|
2016-08-08 23:35:11 +00:00
|
|
|
A `nvmf_tgt`-specific configuration file is used to configure the NVMe over Fabrics target. This
|
2016-08-04 20:18:12 +00:00
|
|
|
file's primary purpose is to define subsystems. A fully documented example configuration file is
|
|
|
|
located at `etc/spdk/nvmf.conf.in`.
|
|
|
|
|
|
|
|
You should make a copy of the example configuration file, modify it to suit your environment, and
|
|
|
|
then run the nvmf_tgt application and pass it the configuration file using the -c option. Right now,
|
|
|
|
the target requires elevated privileges (root) to run.
|
|
|
|
|
2017-01-04 21:47:02 +00:00
|
|
|
~~~{.sh}
|
2016-08-04 20:18:12 +00:00
|
|
|
app/nvmf_tgt/nvmf_tgt -c /path/to/nvmf.conf
|
2017-01-04 21:47:02 +00:00
|
|
|
~~~
|
2017-01-25 06:59:22 +00:00
|
|
|
|
2018-01-22 22:20:01 +00:00
|
|
|
### Subsystem Configuration {#nvmf_config_subsystem}
|
2017-02-09 16:32:10 +00:00
|
|
|
|
2018-01-22 22:20:01 +00:00
|
|
|
The `[Subsystem]` section in the configuration file is used to configure
|
|
|
|
subysystems for the NVMe-oF target.
|
2017-02-09 16:32:10 +00:00
|
|
|
|
2018-01-22 22:20:01 +00:00
|
|
|
This example shows two local PCIe NVMe devices exposed as separate NVMe-oF target subsystems:
|
2017-02-09 16:32:10 +00:00
|
|
|
|
|
|
|
~~~{.sh}
|
2017-06-27 18:26:19 +00:00
|
|
|
[Nvme]
|
|
|
|
TransportID "trtype:PCIe traddr:0000:02:00.0" Nvme0
|
|
|
|
TransportID "trtype:PCIe traddr:0000:82:00.0" Nvme1
|
|
|
|
|
2017-02-09 16:32:10 +00:00
|
|
|
[Subsystem1]
|
|
|
|
NQN nqn.2016-06.io.spdk:cnode1
|
|
|
|
Listen RDMA 192.168.100.8:4420
|
2017-08-30 20:21:12 +00:00
|
|
|
AllowAnyHost No
|
2017-02-09 16:32:10 +00:00
|
|
|
Host nqn.2016-06.io.spdk:init
|
2017-06-27 18:26:19 +00:00
|
|
|
SN SPDK00000000000001
|
2017-08-30 23:55:48 +00:00
|
|
|
Namespace Nvme0n1 1
|
2017-02-09 16:32:10 +00:00
|
|
|
|
|
|
|
[Subsystem2]
|
|
|
|
NQN nqn.2016-06.io.spdk:cnode2
|
|
|
|
Listen RDMA 192.168.100.9:4420
|
2017-08-30 20:21:12 +00:00
|
|
|
AllowAnyHost Yes
|
2017-06-27 18:26:19 +00:00
|
|
|
SN SPDK00000000000002
|
2017-08-30 23:55:48 +00:00
|
|
|
Namespace Nvme1n1 1
|
2017-02-09 16:32:10 +00:00
|
|
|
~~~
|
2017-03-10 12:43:58 +00:00
|
|
|
|
2018-01-22 22:20:01 +00:00
|
|
|
Any bdev may be presented as a namespace.
|
|
|
|
See @ref bdev for details on setting up bdevs.
|
|
|
|
For example, to create a virtual controller with two namespaces backed by the malloc bdevs
|
|
|
|
named Malloc0 and Malloc1 and made available as NSID 1 and 2:
|
2017-03-10 12:43:58 +00:00
|
|
|
~~~{.sh}
|
2018-01-22 22:20:01 +00:00
|
|
|
[Subsystem3]
|
|
|
|
NQN nqn.2016-06.io.spdk:cnode3
|
2017-03-10 12:43:58 +00:00
|
|
|
Listen RDMA 192.168.2.21:4420
|
2018-01-22 22:20:01 +00:00
|
|
|
AllowAnyHost Yes
|
|
|
|
SN SPDK00000000000003
|
2017-08-30 23:55:48 +00:00
|
|
|
Namespace Malloc0 1
|
|
|
|
Namespace Malloc1 2
|
2017-03-10 12:43:58 +00:00
|
|
|
~~~
|
2018-01-22 22:20:01 +00:00
|
|
|
|
|
|
|
### Assigning CPU Cores to the NVMe over Fabrics Target {#nvmf_config_lcore}
|
|
|
|
|
|
|
|
SPDK uses the [DPDK Environment Abstraction Layer](http://dpdk.org/doc/guides/prog_guide/env_abstraction_layer.html)
|
|
|
|
to gain access to hardware resources such as huge memory pages and CPU core(s). DPDK EAL provides
|
|
|
|
functions to assign threads to specific cores.
|
|
|
|
To ensure the SPDK NVMe-oF target has the best performance, configure the RNICs and NVMe devices to
|
|
|
|
be located on the same NUMA node.
|
|
|
|
|
|
|
|
The `-m` core mask option specifies a bit mask of the CPU cores that
|
|
|
|
SPDK is allowed to execute work items on.
|
|
|
|
For example, to allow SPDK to use cores 24, 25, 26 and 27:
|
|
|
|
~~~{.sh}
|
|
|
|
app/nvmf_tgt/nvmf_tgt -m 0xF000000
|
|
|
|
~~~
|
|
|
|
|
|
|
|
## Configuring the Linux NVMe over Fabrics Host {#nvmf_host}
|
|
|
|
|
|
|
|
Both the Linux kernel and SPDK implement an NVMe over Fabrics host.
|
|
|
|
The Linux kernel NVMe-oF RDMA host support is provided by the `nvme-rdma` driver.
|
|
|
|
|
|
|
|
~~~{.sh}
|
|
|
|
modprobe nvme-rdma
|
|
|
|
~~~
|
|
|
|
|
|
|
|
The nvme-cli tool may be used to interface with the Linux kernel NVMe over Fabrics host.
|
|
|
|
|
|
|
|
Discovery:
|
|
|
|
~~~{.sh}
|
|
|
|
nvme discover -t rdma -a 192.168.100.8 -s 4420
|
|
|
|
~~~
|
|
|
|
|
|
|
|
Connect:
|
|
|
|
~~~{.sh}
|
|
|
|
nvme connect -t rdma -n "nqn.2016-06.io.spdk:cnode1" -a 192.168.100.8 -s 4420
|
|
|
|
~~~
|
|
|
|
|
|
|
|
Disconnect:
|
|
|
|
~~~{.sh}
|
|
|
|
nvme disconnect -n "nqn.2016-06.io.spdk:cnode1"
|
|
|
|
~~~
|