Introduction to Lossless RoCEv2
RDMA over Converged Ethernet (RoCE) allows high-throughput, low-latency data transfers between compute nodes at the memory-to-memory level, bypassing the CPU and OS network stack. While the original RoCE (v1) was restricted to a single Layer 2 broadcast domain, RoCEv2 enables routing across Layer 3 environments.
RoCEv2 achieves routability by encapsulating the InfiniBand (IB) transport protocol within standard Ethernet, IP, and UDP headers. A specific UDP destination port (4791) is used to identify RoCEv2 traffic, allowing standard IP routers to handle the packets.
Comparison of RoCE and RoCEv2 Frame Formats
Feature | RoCE (v1) | RoCEv2 |
|---|---|---|
Layer | Layer 2 (Ethernet) | Layer 3 (IP/UDP) |
Header Additions | Ethernet Header + IB Payloads | Ethernet + IP + UDP (Port 4791) |
Routability | Non-routable (Local Subnet) | Routable (via IP L3 Routers) |
Congestion Control | Layer 2 Pause | ECN and PFC |
The Three Pillars of RoCEv2 Flow Control
RoCEv2 employs a "Data Center Quantized Congestion Notification" (DCQCN) triad to maintain a lossless environment:
DSCP (Traffic Classification): Marks IP headers with a QoS label to ensure packets are mapped to the correct traffic class across all switches.
ECN (Congestion Signaling): A proactive mechanism that signals endpoints to "slow down" transmission before buffers overflow.
PFC (Buffer Protection): A reactive "safety net" that pauses specific traffic classes on a hop-by-hop basis to prevent buffer exhaustion.
Congestion Management: AFD vs. WRED
Weighted Random Early Detection (WRED): Marks traffic with ECN bits based on general buffer occupancy. It treats all traffic in a queue equally.
Approximate Fair Drop (AFD): A more granular mechanism that distinguishes between "Elephant" (high-bandwidth) and "Mice" (low-bandwidth) flows. AFD is used to trigger ECN marking specifically on elephant flows, allowing short-lived "mice" communications to complete without being penalized by large data transfers.
Detailed Mechanism: Priority Flow Control (PFC)
PFC enables lossless Ethernet by managing congestion on a per-priority basis. Unlike standard Ethernet PAUSE frames, which halt all traffic on a link, PFC pauses only the specific Class of Service (CoS) assigned to RDMA (typically Priority 3), allowing management or heartbeat traffic to continue.
Threshold Logic: xOFF and xON
xOFF: When a switch buffer reaches this high-water mark, it sends a PFC pause frame upstream.
Buffer Headroom: This is the dedicated portion of the buffer that absorbs packets already "in flight" between when the pause is signaled and when the upstream sender halts. It is essentially a buffer for packet flight time over the wire.
xON: Once the buffer drains below this lower threshold, the switch signals the upstream device to resume transmission.
PFC Storms & Watchdog: A "PFC Storm" occurs when a misbehaving host continuously transmits PFC frames, potentially deadlocking the fabric. The PFC Watchdog Interval monitors queues; if a queue is not drained within a specified timeout, the watchdog detects the deadlock and drops the undrained packets to restore network flow.
Detailed Mechanism: Explicit Congestion Notification (ECN)
ECN allows switches to signal congestion to end hosts without dropping packets by using the two least significant bits of the IP Header Type of Service (TOS) field.
ECN Bit Values
Bit Value | Meaning |
|---|---|
00 | Non-ECN Capable |
10 | ECN Capable Transport (0) |
01 | ECN Capable Transport (1) |
11 | Congestion Encountered (CE) |
The ECN Interaction Loop
Marking (Switch): When buffer occupancy exceeds the WRED/AFD minimum threshold, the switch marks packets with 0x11 (CE).
Notification (Receiver NIC): The Receiver detects the 0x11 mark and generates a Congestion Notification Packet (CNP).
Throttling (Sender NIC): The Sender receives the CNP and reduces its transmission rate for that flow.
Contrast: ECN is a proactive, end-to-end mechanism, whereas PFC is a reactive, hop-by-hop link-level mechanism.
Step-by-Step RoCEv2 Packet Journey (DCQCN)
Lifecycle of an RDMA write operation across the fabric:
Classification (Sender NIC): The application initiates a write; the NIC sets the IP packet's DSCP value (e.g., 26).
Priority Mapping (Switch): The switch receives the packet and maps the DSCP to a Lossless Queue (e.g., Priority 3).
Buffer Monitoring (Switch Queue): The switch monitors buffer occupancy against WRED/AFD thresholds.
ECN Marking (Switch): If the AFD threshold for an elephant flow is reached, the switch sets the packet ECN bits to 0x11.
PFC Trigger (Switch/Sender): If congestion hits the xOFF threshold, the switch sends a PFC frame upstream to pause Priority 3 traffic.
Congestion Detection (Receiver NIC): The receiver detects the ECN 0x11 mark in the arrival packet.
CNP Generation (Receiver NIC): The receiver generates a CNP and sends it back to the sender.
Rate Reduction (Sender NIC): The sender receives the CNP and throttles its transmission rate, allowing fabric buffers to drain.
NVIDIA Cumulus Linux NVUE Configuration
Configuration on NVIDIA Spectrum ASICs is managed via the NVUE CLI.
Enable Lossless RoCE (Default Mode)
Command:
nv set qos roce
nv config apply -yNVUE defaults to roce mode lossless. The commands nv set qos roce and nv set qos roce mode lossless are equivalent.
Verify:
nv show qos roceExpected Result (key fields):
mode : lossless
enabled : on
traffic-class : 3
pfc : enabled
ecn : enabledLossless Single Ingress Pool
Command:
nv set qos roce mode lossless-single-ipool
nv config apply -yCombines lossy/lossless pools for better absorption during burst traffic.
v5.16: Lossy Multi-TC with Packet Trimming
Command:
nv set qos roce mode lossy-multi-tc
nv set qos remark dscp-on-trim port-level
nv config apply -ySpecific Remarking Values (Standardized for AI POD):
DSCP 21: Applied to host-downlinks (
lossy-multi-tc-host-group).DSCP 11: Applied to network uplinks (
lossy-multi-tc-network-group).
Verify DSCP Remarking:
nv show qos remarkExpected Result:
lossy-multi-tc-host-group : dscp 21
lossy-multi-tc-network-group : dscp 11
dscp-on-trim : port-levelTechnical Note: Spectrum-4 ASIC Reporting Engineers may notice a reporting discrepancy on Spectrum-4 switches. nv show qos roce may report an ECN threshold of 146.48 KB, while interface-level commands report 156 KB (159,744 bytes). The latter is the actual hardware-programmed value; this is expected behavior and does not indicate a configuration error.
Switch Verification Checklist
Check | Command | Expected Result |
|---|---|---|
Global RoCE config |
|
|
DSCP remarking |
| DSCP 21 (hosts) / DSCP 11 (network) |
Buffer allocation |
| Lossless pool mapped to Priority 3 |
PFC/ECN counters |
| Counters increment only under congestion |
Example - Interface Counters:
nv show interface swp1 qos roce countersExpected Result (healthy fabric):
pfc_rx_prio3 : 0
pfc_tx_prio3 : 0
ecn_marked : 0
cnp_rx : 0
cnp_tx : 0Operational Summary Table
Feature | Component Responsibility | Key Parameter / Value |
|---|---|---|
MTU | Switch & NIC | 9216 (Jumbo Frames) |
Traffic Class (RoCE) | Switch | Priority 3 (Lossless) |
PFC | Switch & NIC | Enabled on CoS 3 |
ECN Marking | Switch | AFD Thresholds (marked 0x11) |
CNP Generation | Receiver NIC | UDP Port 4791 |
v5.16 Remarking | Switch | DSCP 21 (Hosts) / DSCP 11 (Network) |
PFC Watchdog | Switch | Enabled for Deadlock Prevention |
RoCE Mode | Switch (Cumulus) |
|
NFS over RDMA (NFSoRDMA) on VAST
NFS over RDMA (also called RPC-over-RDMA) layers the NFS protocol on top of the RDMA transport instead of TCP. On VAST, this is the primary storage access method for AI/HPC workloads that require low latency and high throughput over a lossless RoCEv2 fabric.
How it works:
Client sends an initial MOUNT request over TCP to discover the NFS service.
Client then establishes an RDMA connection (RPC-over-RDMA) for data path I/O.
Data transfers bypass the CPU/kernel network stack via zero-copy RDMA operations.
Prerequisite: The lossless RoCEv2 fabric (PFC + ECN on Priority 3) described in the sections above must be configured end-to-end across client NICs, switches, and VAST CNodes before NFSoRDMA will perform reliably.
NFSoRDMA vs. NFS over TCP
Feature | NFS over RDMA | NFS over TCP |
|---|---|---|
Transport | RDMA (RoCEv2 / InfiniBand) | TCP/IP |
CPU overhead | Low (zero-copy) | Moderate to high |
Latency | Very low | Higher |
Throughput | Higher (parallel connections) | Lower |
Network requirement | Lossless fabric (PFC/ECN) | Standard Ethernet |
Best use case | AI/HPC, parallel I/O | General-purpose storage |
Prerequisites
Requirement | Verification Command | Expected Result |
|---|---|---|
RDMA-capable NIC |
| ConnectX-6/7 detected |
|
| Module loaded |
RDMA link active |
| State: ACTIVE, Rate: 200/400 |
Lossless network |
|
|
VAST NFS client |
| VAST NFS package installed |
NIC trust mode |
|
|
Load rpcrdma Module
Command:
modprobe rpcrdma
lsmod | grep rpcrdmaExpected Result:
rpcrdma 131072 0
rdma_cm 36864 3 rpcrdma,ib_iser,rdma_ucmVAST NFS RDMA Mount (Example)
Command:
sudo mkdir -p /mnt/vast
sudo mount -t nfs -o \
rw,noatime,nodiratime,vers=3,\
rsize=1048576,wsize=1048576,namlen=255,\
acregmin=60,acdirmin=60,soft,noacl,\
forcerdirplus,proto=rdma,port=20049,nconnect=4,timeo=600,\
remoteports=10.100.100.1-10.100.100.100,\
spread_reads,spread_writes \
10.100.100.1:/nfs3 /mnt/vastKey VAST mount option for RDMA:
Parameter | Value | Purpose |
|---|---|---|
| Required | Selects RDMA transport |
Verify NFSoRDMA Mount
Command:
findmnt /mnt/vast
mount | grep vastExpected Result:
TARGET SOURCE FSTYPE OPTIONS
/mnt/vast 10.100.100.1:/nfs3 nfs4 rw,noatime,...,proto=rdma,nconnect=4,...
10.100.100.1:/nfs3 on /mnt/vast type nfs (rw,...,proto=rdma,nconnect=4,...)Pass criteria:
proto=rdmaappears in mount options.
Basic NFSoRDMA I/O Test
Command:
ls -la /mnt/vast/
touch /mnt/vast/qa-test-$$ && rm /mnt/vast/qa-test-$$
dd if=/dev/zero of=/mnt/vast/qa-write-test bs=1M count=100 oflag=direct
rm /mnt/vast/qa-write-testExpected Result:
(total) ...
100+0 records in
100+0 records out
104857600 bytes (105 MB, 100 MiB) copied, 0.12 s, 873 MB/sVerify RDMA Transport is Active
Command:
rdma link
rdma statistic show | egrep "np_cnp_sent|rp_cnp_handled|roce_adp_retrans"Expected Result (healthy):
link mlx5_0/1 state ACTIVE physical_state LINK_UP netdev enp225s0f0
rate 200 Gb/sec
np_cnp_sent: 0
rp_cnp_handled: 0
roce_adp_retrans: 0Client NIC QoS (Required for RDMA)
Command:
sudo mlnx_qos -i enp225s0f0Expected Result:
Priority trust state: dscp
PFC configuration:
priority 0 1 2 3 4 5 6 7
enabled 0 0 0 1 0 0 0 0PFC must be enabled on Priority 3 (Traffic Class 3).
Priority trust state: pcpindicates a configuration mismatch.
NFSoRDMA Troubleshooting
Symptom | Check | Command |
|---|---|---|
Mount fails "Protocol error" | Verify TCP mount first, then RDMA |
|
Server not responding | Check rpcrdma module |
|
Intermittent hangs | PFC/ECN counters |
|
High latency / retrans | RDMA congestion stats |
|
RPC debugging | Enable NFS/RPC trace |
|
Enable RPC debug (triage):
rpcdebug -m nfs -s all
rpcdebug -m rpc -s all
echo -n 'module rpcrdma +pflmt' > /sys/kernel/debug/dynamic_debug/controlCollect logs:
dmesg -T | grep -iE "nfs|rpc|rdma" > nfsordma_debug.outDisable debug after collection:
rpcdebug -m nfs -c all
rpcdebug -m rpc -c all
echo -n 'module rpcrdma -pflmt' > /sys/kernel/debug/dynamic_debug/controlRoCEv2 Diagnostic and Troubleshooting Cheat Sheet on Server
Use this checklist to verify the RoCEv2 environment on ConnectX-based Linux systems.
Mellanox RoCEv2 Health Checklist
Check Type | Command | Healthy Result |
|---|---|---|
NIC Detection |
| ConnectX-6/7/BlueField detected. |
RDMA Devices |
| Active |
Ethernet Link |
| Link layer reports "Ethernet". |
RoCE Version |
| GID Type 2 (RoCEv2) present. |
Mapping |
| Verify RDMA device ↔ Linux interface mapping. |
Firmware |
| Driver/firmware versions current. |
MTU |
| Jumbo Frames: 9000 or 9216. |
Example: NIC Detection
Command:
lspci | grep MellanoxExpected Result:
e1:00.0 Ethernet controller: Mellanox Technologies MT2910 Family [ConnectX-7]
e1:00.1 Ethernet controller: Mellanox Technologies MT2910 Family [ConnectX-7]Example: RDMA Devices
Command:
ibv_devicesExpected Result:
device node GUID
------ ----------------
mlx5_0 e46dab03005db966
mlx5_1 e46dab03005db967Example: RoCE Version (GID Type)
Command:
show_gidsExpected Result:
DEV PORT INDEX GID IPv4 VER DEV
--- ---- ----- --- ------------ --- ---
mlx5_0 1 0 fe80:0000:0000:0000:e66d:abff:fe5d:b966 v1 enp225s0f0
mlx5_0 1 1 fe80:0000:0000:0000:e66d:abff:fe5d:b966 v2 enp225s0f0
mlx5_0 1 10 0000:0000:0000:0000:0000:ffff:ac15:5214 172.21.82.20 v2 enp225s0f0GID Type 2 (v2) confirms RoCEv2 is active.
Example: Device-to-Interface Mapping
Command:
ibdev2netdevExpected Result:
mlx5_0 port 1 ==> enp225s0f0 (Up)
mlx5_1 port 1 ==> enp225s0f1 (Up)Performance Verification and Statistics
Validate throughput and monitor hardware counters to distinguish between a healthy fabric and one experiencing "PFC Storms" or buffer exhaustion.
Critical Congestion Counters
Command:
rdma statistic showExpected Result (healthy fabric):
np_cnp_sent: 0
rp_cnp_handled: 0
roce_adp_retrans: 0
roce_slow_restart: 0Counter | Meaning | Healthy State |
|---|---|---|
np_cnp_sent | CNPs generated by this node as receiver | Near zero |
rp_cnp_handled | CNPs sender reacted to by throttling | Near zero |
roce_adp_retrans | RoCE adaptive retransmissions (packet loss) | Near zero |
roce_slow_restart | Congestion recovery events (slow-start) | Near zero |
Continuous increases in
np_cnp_sentindicate active congestion. Increasingroce_adp_retranssuggests the lossless path is failing.
Bandwidth Test
Command (server):
ib_write_bw -d mlx5_0 -aCommand (client):
ib_write_bw -d mlx5_0 -a <server_ip>Expected Result (200G link):
************************************
* Waiting for client to connect... *
************************************
---------------------------------------------------------------------------------------
RDMA_Write BW Test
Dual-port : OFF Device : mlx5_0
Number of qps : 1 Transport type : IB
Connection type : RC Using SRQ : OFF
Link type : Ethernet
GID index : 6
---------------------------------------------------------------------------------------
#bytes #iterations BW peak[MB/sec] BW average[MB/sec] MsgRate[Mpps]
8388608 5000 22825.74 19233.22 0.002404
---------------------------------------------------------------------------------------PFC Counters on Host NIC
Command:
ethtool -S enp225s0f0 | egrep "pfc|pause|prio"Expected Result (healthy fabric):
rx_prio3_pause: 0
rx_prio3_pause_duration: 0
tx_prio3_pause: 0
tx_prio3_pause_duration: 0Quick One-Liner Health Check
Command:
echo "=== RDMA Devices ==="; ibv_devices; \
echo; echo "=== Mapping ==="; ibdev2netdev; \
echo; echo "=== Link Layer ==="; ibstat | grep "Link layer"; \
echo; echo "=== RoCE GIDs ==="; show_gids; \
echo; echo "=== Congestion Counters ==="; rdma statistic show | egrep "roce_adp_retrans|np_cnp_sent|rp_cnp_handled"; \
echo; echo "=== PFC Counters ==="; ethtool -S eth0 | egrep "pfc|pause|prio"Expected Result (summary):
=== RDMA Devices ===
device node GUID
mlx5_0 248a070300a0b1c2
=== Mapping ===
mlx5_0 port 1 ==> eth0 (Up)
=== Link Layer ===
Link layer: Ethernet
=== RoCE GIDs ===
mlx5_0 1 2 ... 10.0.0.100 v2
=== Congestion Counters ===
np_cnp_sent: 0
rp_cnp_handled: 0
roce_adp_retrans: 0
=== PFC Counters ===
rx_prio3_pause: 0
tx_prio3_pause: 0