NVMe over Fabrics on ONTAP
NVMe-oF carries the NVMe command set across a fabric, preserving its parallel queues and leaner I/O path beyond the server. ONTAP supports NVMe/FC for Fibre Channel estates and NVMe/TCP for routable Ethernet designs, presenting namespaces through host-authorized subsystems with ANA multipathing.
1. Why NVMe-oF
SCSI transports were designed around comparatively shallow device queues and a command translation layer. NVMe exposes many submission/completion queue pairs, allowing CPU cores to drive I/O with less shared locking. That does not make media or the network disappear: at modest queue depth, controller ownership, fabric congestion, host scheduling, and application sync writes often dominate. Choose NVMe-oF for a measured latency or concurrency requirement—not because its protocol name is newer.
| Transport | Fabric | Host stack | Strength | Trade-off |
|---|---|---|---|---|
| NVMe/FC | Lossless FC, FC-NVMe-capable HBA/switch | Native NVMe + FC transport | Predictable latency; reuses engineered dual fabrics | Hardware, zoning, and compatibility discipline |
| NVMe/TCP | Standard routed Ethernet/IP | nvme-cli + kernel TCP transport | Operational reach and Ethernet economics | More CPU and network jitter; design loss/ECMP carefully |
| iSCSI | Standard Ethernet/IP | SCSI, iSCSI, DM-Multipath | Mature, broad interoperability | Legacy SCSI queueing and a different multipath stack |
2. ONTAP support reality
- NVMe/FC: available from ONTAP 9.4, using supported FC-NVMe initiators, HBAs, switches, firmware, and host OS combinations.
- NVMe/TCP: available from ONTAP 9.10.1. Initial qualification centered on AFF; current eligibility varies across AFF, ASA, FAS, ONTAP release, adapter, and host stack. Validate the exact design in NetApp IMT.
- NVMe/RDMA: ONTAP does not expose NVMe/RDMA targets. Do not confuse an RDMA-capable Ethernet adapter with a supported ONTAP target transport.
- Mixed protocol: newer ONTAP releases can serve NVMe alongside other protocols on an SVM; early NVMe releases imposed tighter SVM rules. Upgrade guidance and the IMT are authoritative.
3. Namespaces, subsystems, LIFs, and ANA
A namespace is the block device carved inside a volume or qtree. A subsystem is the access-control and discovery boundary: it owns an ONTAP-generated NQN, contains permitted host NQNs, and has mapped namespaces. A namespace maps to one subsystem, while a subsystem can expose multiple namespaces to multiple authorized hosts.
Data LIFs provide target paths. For NVMe/FC, create FC-NVMe LIFs on physical FC target ports and zone each host initiator to target ports across independent fabrics. For NVMe/TCP, create NVMe/TCP data LIFs on dedicated IP networks, normally at least one path per HA node and per fault domain. ONTAP reports path preference with ANA: the host uses optimized paths and retains non-optimized paths for takeover or topology changes.
4. ONTAP CLI provisioning runbook
# Confirm NVMe is allowed, then create/verify the SVM NVMe service
vserver show -vserver svm_nvme -fields allowed-protocols
vserver nvme create -vserver svm_nvme
vserver nvme show -vserver svm_nvme
# Create the namespace at the root of an existing volume
vserver nvme namespace create -vserver svm_nvme \
-path /vol/vol_nvme_db/ns1 -size 2TB -ostype linux
# Create the host access boundary and authorize its NQN
vserver nvme subsystem create -vserver svm_nvme \
-subsystem db_hosts -ostype linux
vserver nvme subsystem host add -vserver svm_nvme \
-subsystem db_hosts -host-nqn nqn.2014-08.org.nvmexpress:uuid:HOST-UUID
# Map the namespace (a namespace can map to one subsystem)
vserver nvme subsystem map add -vserver svm_nvme \
-subsystem db_hosts -path /vol/vol_nvme_db/ns1# Parameter names can vary by ONTAP release; verify with tab completion
network interface create -vserver svm_nvme -lif nvme_tcp_a1 \
-service-policy default-data-nvme-tcp -home-node cluster1-01 \
-home-port e1a -address 10.40.1.21 -netmask 255.255.255.0
network interface create -vserver svm_nvme -lif nvme_tcp_b1 \
-service-policy default-data-nvme-tcp -home-node cluster1-02 \
-home-port e1a -address 10.40.2.22 -netmask 255.255.255.0
network interface show -vserver svm_nvme -data-protocol nvme-tcp
vserver nvme namespace show -vserver svm_nvme -instance
vserver nvme subsystem show -vserver svm_nvme5. Linux discovery and native multipathing
# Read the host identity and enable native NVMe multipathing
cat /etc/nvme/hostnqn
cat /sys/module/nvme_core/parameters/multipath
# Discover through each fault domain, then connect all advertised paths
nvme discover -t tcp -a 10.40.1.21 -s 4420
nvme connect-all -t tcp -a 10.40.1.21 -s 4420
nvme connect-all -t tcp -a 10.40.2.22 -s 4420
# Validate controllers, namespaces, ANA state, and path count
nvme list
nvme list-subsys
nvme id-ns /dev/nvme0n1
nvme smart-log /dev/nvme0n1Use the distribution’s supported persistent discovery/autoconnect mechanism rather than a boot-time shell loop. Native NVMe multipath must combine controllers for one namespace; if separate devices appear, fix host multipath configuration before creating a filesystem or volume manager.
6. Performance tuning without folklore
| Control | Starting point | Measure before changing |
|---|---|---|
| Queue depth | Use the NetApp host utility/IMT default; raise gradually only when queues saturate | Application latency, outstanding I/O, controller CPU, QoS throttling |
| MSI-X / CPU affinity | Keep enough vectors and spread busy queues across NUMA-local CPUs | Per-CPU softirq, interrupts, and NUMA misses |
| TCP MTU | 1500 is valid; use 9000 only end-to-end across host, switches, VLAN, and ONTAP | Drops, retransmits, PMTU failures, throughput per path |
| Path count | Two independent fault domains; avoid path multiplication without a reason | ANA state, load balance, failover time, switch oversubscription |
As planning—not a guarantee—well-tuned all-flash NVMe/FC commonly operates in the low hundreds of microseconds for small reads, while NVMe/TCP may add tens to a few hundred microseconds depending on NICs, switches, CPU load, distance, and queueing. End-to-end application latency can be much higher. Establish a baseline at queue depth 1 and under the intended concurrency, then compare FCP/iSCSI and NVMe-oF on identical media and QoS.
7. Troubleshooting matrix
| Symptom | Likely fault | Commands / evidence | Resolution |
|---|---|---|---|
| Discovery returns no records | Wrong transport/IP/port, LIF down, FC zoning, or SVM service absent | vserver nvme show; network interface show; nvme discover | Restore target reachability and service first; then validate discovery parameters. |
| Subsystem visible, namespace absent | Host NQN mismatch or missing map | vserver nvme subsystem host show; vserver nvme namespace show -instance | Copy the host NQN exactly and add the namespace map. |
| One path only | Missing LIF/zoning/route or autoconnect record | nvme list-subsys; LIF and switch tables | Build a path through every intended independent fault domain. |
| Duplicate namespace devices | Native multipath disabled or kernel/udev mismatch | cat /sys/module/nvme_core/parameters/multipath | Apply the supported host configuration and reconnect before use. |
| TCP latency spikes | Drops/retransmits, MTU mismatch, CPU/IRQ imbalance, congestion | ip -s link; ethtool -S; switch counters; ss -ti | Fix loss and MTU consistency, then tune queues/IRQ placement. |
| I/O survives but is slow after takeover | Only non-optimized ANA paths remain | nvme list-subsys; storage failover show | Restore the owning node/path and confirm optimized ANA paths republish. |
vserver nvme show -vserver svm_nvme
vserver nvme namespace show -vserver svm_nvme -instance
vserver nvme subsystem show -vserver svm_nvme -instance
vserver nvme subsystem host show -vserver svm_nvme
network interface show -vserver svm_nvme -data-protocol nvme-tcp,fc-nvme
event log show -time >1h -severity ERROR