Status: Draft (Updated 2026-10-06). Based on descriptions verified with official documentation, and only the parts directly observed with software RoCE (rxe) (section "Field Measurement" at the end of Section 10) are values measured in a disposable virtual machine. There are no measurements using actual RDMA hardware and GPUs. Please read "Verified Versions and Dates" and "Unverified Items" at the end of this article first. Writing Rules: Field measurement data is the default, and items that could not be measured are marked as "Unmeasured".
Table of Contents
- Summary
- 1. Why TCP Is Not Enough
- 2. InfiniBand and RoCE v2
- 3. Layers and Bandwidth
- 4. GPUDirect RDMA and GPUDirect Storage
- 5. NCCL
- 6. How to Measure
- 7. Common Failures
- 8. RDMA in Kubernetes
- 9. Where RDMA Is Needed in Inference (Connected to Part 6)
- 10. Try It Yourself
- External Evidence: Verified with papers and official materials
- 11. Interview Questions
- 12. Common Misconceptions
- References (Actually Opened)
- Verified Versions and Dates, and Unverified Items
Summary
When multiple GPUs compute a single model together, communication equals performance. Inside the server, NVLink handles this, while outside the server, InfiniBand or RoCE (RDMA over Converged Ethernet) networks supporting RDMA (Remote Direct Memory Access) take charge. NCCL (NVIDIA Collective Communications Library) detects this layer and orchestrates collective communications (such as all-reduce). This post covers layer-by-layer bandwidth differences, why RoCE is difficult, NCCL environment variables and measurement tools, troubleshooting sequences, and Kubernetes configurations.
What You Can Explain in an Interview After Reading This Post
- Why TCP is insufficient and the differences between InfiniBand and RoCE v2 (specifically, what PFC and ECN do in RoCE and symptoms when configurations are incorrect).
- How NCCL performs collective communication,
nccl-testshow to read its busbw, and the troubleshooting sequence when multi-node performance drops. - The components required for pods to use RDMA in Kubernetes, and the points where RDMA is needed in inference (KV transfer, expert parallelism, model loading).
Author's Background. I am experimenting in a standard Ethernet (1-2.5GbE class) environment and have no experience with RDMA, InfiniBand, NVLink, or VAST. This post is compiled from reading official documentation and is not a record of operational experience. The hands-on section is limited to what is feasible, and unexecuted parts are marked as such.
1. Why TCP Is Not Enough
According to the Dynamo documentation, RDMA allows network adapters to move data from one host's memory to another host's memory (or GPU-to-GPU when using GPUDirect RDMA) without going through the CPU, kernel, or TCP/IP stack. TCP typically involves copying between user buffers and kernel buffers, system calls, and interrupts. RDMA enables kernel bypass and zero-copy because the NIC directly reads and writes to memory whose pages are pinned in advance through pre-registration (ibv_reg_mr). The speed difference is also mathematically massive. 1GbE is 0.125GB/s, and a 400Gb/s NIC is 50GB/s, which is 400 times faster. Therefore, TCP serves as a fallback path when RDMA is absent (NCCL_IB_DISABLE=1 NCCL falls back to IP sockets if this occurs).
2. InfiniBand and RoCE v2
| Item | InfiniBand | RoCE v2 |
|---|---|---|
| Network | Dedicated RDMA network | Operates on top of standard Ethernet switches |
| Protocol | Proprietary transport layer | Runs on top of UDP/IP destination port 4791, enabling L3 routing |
| Management | Subnet Manager (SM) required | Ethernet configurations such as PFC, ECN, and DSCP are key |
| Diagnostics | ibstat, perfquery, ibdiagnet, sminfo |
ethtool -S, switch counters, rping |
RoCE v1 uses only the Ethernet link layer for a single broadcast domain, whereas v2 adds UDP/IP to enable routing (Wikipedia).
Why RoCE Is Difficult. Because RDMA is vulnerable to packet loss, loss must be prevented or mitigated in Ethernet. NVIDIA Cumulus documentation explains two methods. PFC (Priority Flow Control) applies hop-by-hop pauses per priority to prevent buffer overflows, while ECN (Explicit Congestion Notification) marks congested packets at the switch so the receiving NIC sends back a CNP (Congestion Notification Packet) to lower the transmission rate. By default, RoCE data uses priority 3 and CNP uses strict priority queue 6. Onyx documentation distinguishes between lossless (PFC across the entire network), semi-lossless (PFC only between hosts and top-of-rack switches), and lossy (no PFC) modes. DCQCN (SIGCOMM 2015) is an ECN-based RoCE v2 congestion control designed to reduce the side effects of PFC; according to the abstract, it is implemented in Mellanox NICs and deployed in Microsoft datacenters. DCQCN does not replace PFC. Section 7 of the paper notes that when the loss rate exceeds 0.1%, throughput plummets, making PFC still necessary. PFC can cause network-wide deadlocks (a 2016 Microsoft paper reports an actual deadlock caused by a combination of PFC and packet flooding for unknown MAC addresses in a test cluster, along with an incident where a single NIC continuously sent PAUSE frames, blocking the entire network; see "External Evidence" below), and it is noted that Ethernet DCB configurations are more complex than InfiniBand (Wikipedia).
Failures appear silently. The MinIO MemKV runbook (third-party material, not NVIDIA documentation) notes that PFC priority, DSCP mapping, and MTU must match, and if the Ethernet MTU is 1500, the active RoCE MTU is negotiated down to 1024, and if misconfigured, it ends with IBV_WC_RETRY_EXC_ERR , which only becomes apparent between nodes.
3. Layers and Bandwidth
노드(예: 8 GPU)
GPU0 ... GPU7 ══ NVLink / NVSwitch ══ (노드 안 전체 연결)
│PCIe │PCIe
NIC0 ... NIC7 ──> 같은 번호 NIC 끼리 같은 리프 스위치 (rail)
| Layer | Bandwidth | Source and Unit |
|---|---|---|
| NVLink 4th Gen (H100) | 900GB/s per GPU | NVIDIA specifications, bidirectional total |
| NVLink 5th Gen (Blackwell) | 1,800GB/s per GPU | Same notation as above |
| PCIe 5.0 x16 | 32GT/s per lane, approx. 63GB/s per direction | 32GT/s from Rambus documentation, 63GB/s calculated by the author assuming 128b/130b encoding |
| Single ConnectX-7 | 400Gb/s, 50GB/s per direction | NVIDIA. DGX H100 features 8 compute InfiniBand cards |
| Standard Ethernet | 0.125~0.31GB/s | Theoretical values for 1GbE, 2.5GbE |
Converting NVLink 4th Generation per direction (half) yields about 450GB/s, which is roughly 9 times that of a single NIC (author's conversion). The H800 cluster in the DeepSeek-V3 report also had NVLink at 160GB/s versus InfiniBand at 50GB/s, and this gap drives the trend from Part 6 where "TP is inside the node, while PP and EP are between nodes." Systems like NVL72 change the boundary as 72 GPUs form a single NVLink domain. The rail structurewas confirmed in the DGX SuperPOD reference architecture, where identically numbered NICs in each server are connected to the same leaf switch so that servers on the same rail traverse only a single switch.
4. GPUDirect RDMA and GPUDirect Storage
GPUDirect RDMA allows NICs to directly read and write GPU memory, eliminating the host memory hop. Official documentation prerequisites state that it is optimal when two devices share the same PCIe root complex with only PCIe switches in between (performance degrades if crossing QPI/UPI), and IOMMU must be disabled or set to 1:1 passthrough. NCCL documentation guides users to load the nvidia-peermem module on every boot or use the open-source driver's DMA-BUF path (unloaded modules and ACS are also common causes), and restricts the maximum distance (LOC, PIX, PXB, PHB, SYS) between the NIC and GPU using NCCL_NET_GDR_LEVEL .
GPUDirect Storage (GDS) eliminates CPU bounce buffers via DMA between storage and GPU memory, supporting cuFile APIs along with local NVMe, NVMe-oF, Lustre, WekaFS, and NFS over RDMA. If conditions are not met, it falls back to a compatibility mode that passes through CPU memory, destroying the performance benefit.
5. NCCL
Operations. Collective operations in the NCCL 2.32.3 documentation include AllReduce, Broadcast, Reduce, AllGather, ReduceScatter, AlltoAll, Gather, and Scatter, along with point-to-point send/recv. All ranks must call them with the same count and datatype; mismatches lead to undefined behavior such as hangs, crashes, or data corruption.
Algorithms and Topologies. NCCL_ALGO Algorithms listed in the documentation are Ring, Tree, CollnetChain, CollnetDirect, NVLS, NVLSTree, and PAT (NVLS is NVLink SHARP offload). According to the NCCL 2.4 blog, the ring utilizes full bandwidth but latency is proportional to the number of GPUs, whereas the double binary tree maintains bandwidth while latency increases logarithmically, improving latency by up to 180 times compared to the ring on Summit with 24,576 GPUs (NVIDIA's claimed measurement). NCCL detects NVLink, PCIe, and NIC connections during initialization to build a graph, and outputs the detection results via NCCL_TOPO_DUMP_FILE .
| Variable | Role (per documentation) |
|---|---|
NCCL_DEBUG |
VERSION, WARN, INFO, TRACE(Added in 2.32). ATTN . Filter subsystems using NCCL_DEBUG_SUBSYS . |
NCCL_SOCKET_IFNAME |
IP interfaces to use. List of prefixes, ^ to exclude, = for exact match. |
NCCL_IB_HCA |
RDMA adapters to use. <hca>[:<port>] list, ^ to exclude, = for exact match. |
NCCL_IB_DISABLE |
If 1, disables IB/RoCE and falls back to IP sockets, etc. |
NCCL_NET_GDR_LEVEL |
Maximum allowed GPUDirect RDMA distance between NIC and GPU. |
NCCL_IB_GID_INDEX, NCCL_IB_TC |
RoCE GID and traffic class. Do not set for 2.21 or higher as GID is auto-selected. |
NCCL_CROSS_NIC |
Whether to allow rings and trees to use different NICs. Dependent on whether the network is rail-optimized. |
The documentation warns against leaving debugging and tuning variables in production settings, noting that a gain in one benchmark may be a loss elsewhere. In inference, NCCL is used for layer-wise all-reduce in TP, and EP routes differ depending on the backend (allgather_reducescatter, DeepEP, etc.). KV transfer is handled by NIXL/UCX, so NCCL variables do not apply (Part 6).
6. How to Measure
./build/all_reduce_perf -b 8 -e 128M -f 2 -g 8 # 노드 안 GPU 8장
mpirun -np 64 -N 8 ./build/all_reduce_perf -b 8 -e 8G -f 2 -g 1 # 8노드 x 8 GPU (MPI=1 빌드)
ib_write_bw -d mlx5_0 -a # perftest 서버
ib_write_bw -d mlx5_0 <서버주소> -a # 클라이언트. --use_cuda=0 을 더하면 GPU 메모리 경로
ib_write_lat -d mlx5_0 <서버주소> # 꼬리 지연 확인
nccl-tests outputs time, algbw(크기/시간), and busbw. busbw is a value multiplied by an operation-specific correction factor to compare against hardware limits regardless of the number of ranks; for AllReduce, it is algbw × 2(n−1)/n, and for ReduceScatter, AllGather, and AlltoAll, it is algbw × (n−1)/n . You look at how close the busbw of large messages is to the NVLink or NIC theoretical limits, and for small messages, you look at time (latency). The order in the NCCL documentation is to look at intra-node nvbandwidth and nvidia-smi topo -m, and inter-node ib_write_bw/ib_write_lat first, and if these values match expectations but NCCL alone is slow, then suspect the NCCL configuration.
7. Common Failures
| Symptom | Check | Basis |
|---|---|---|
| IB Link Downgrade | ibstat Rate and Active status, and mlxlink width and speed |
NCCL documentation |
| Incorrect HCA/Interface | Selecting an interface that is UP but incapable of communication results in initialization failure or hanging. NCCL_SOCKET_IFNAME, NCCL_IB_HCA configuration. In the logs, NET/IB/GDRDMA instead of NET/Socket if it is TCP |
NCCL, vLLM Documentation |
| Pinned Memory Limit | ibv_create_qp, ibv_reg_mr unlimited memlock if it fails. Kubernetes uses IPC_LOCK or node-level lifting |
NCCL, vLLM, Dynamo Documentation |
| RoCE GID Error | ibv_modify_qp ... Invalid argument. If less than 2.21, show_gids to check RoCE v2 GID |
NCCL Documentation |
| MTU Mismatch | ibv_devinfo 's active_mtu. Fails only between nodes |
Third-Party Runbook |
| PFC/ECN Misconfiguration | Tail latency, unstable throughput. ethtool -S pause/PFC counters and rdma statistic retry counters, and investigate congestion control before NCCL |
NCCL Documentation |
| One slow link | Because collective operations involve all ranks, the slowest segment slows down the entire process (author's explanation). If even a single rail is slow, ibdiagnet |
NCCL documentation |
8. RDMA in Kubernetes
flowchart TB
subgraph Node[GPU 노드]
OFED[MOFED 드라이버<br/>ofedDriver]
PEER[nvidia_peermem<br/>GPU Operator]
DP[RDMA 공유 디바이스 플러그인]
MUL[Multus + NetworkAttachmentDefinition]
end
OFED --> DP
DP -->|rdma/hca_shared_devices_a 광고| KL[kubelet]
KL --> Pod[파드: GPU + rdma 자원 + 보조 인터페이스 net1]
MUL --> Pod
PEER --> Pod
NVIDIA Network Operator (latest v26.4.2, 2026-09-16) enables sub-configurations with a single NicClusterPolicy(README notation is NICClusterPolicy, name is nic-cluster-policy fixed as). The items include the MOFED driver container (ofedDriver), rdmaSharedDevicePlugin, sriovDevicePlugin, secondaryNetwork(Multus, containernetworking plugin, IPoIB CNI), nvIpam, nicConfigurationOperator and others, and the MacvlanNetwork, HostDeviceNetwork, IPoIBNetwork CRD is converted NetworkAttachmentDefinition into.
- RDMA shared device plugin(v1.5.4) uses
resourceNameand the default prefixrdmato advertise resources likerdma/hca_shared_devices_a, andrdmaHcaMaxpods share a single HCA. Because it is a shared method, isolation or bandwidth guarantees are difficult to expect (author's interpretation). SR-IOV device plugin advertises network resources such as VFs (Virtual Functions), and VFs must be created in advance. - Host network vs. auxiliary interfaces.
hostNetworkuses the node's NIC directly, making it simple, but since it shares the node network, port conflicts can occur (author's note). Multus addseth0external interfaces (net1, etc.) to separate the RDMA network from the default CNI. - GPU side. Dynamo's AKS guide installs the GPU Operator via
driver.rdma.enabled=true,driver.rdma.useHostMofed=trueto bring upnvidia_peermemand requestsrdma/hca_shared_devices_a: 1for pods. This guide states that setting memlock to unlimited on the nodes eliminates the need forIPC_LOCK, whereas the vLLM documentation recommends addingIPC_LOCK, so choose the approach that fits your environment. - Topology-aware placement. Dynamo guides the use of Grove and KAI Scheduler for topology-aware gang scheduling, and allows you to
kvTransferPolicy(experimental) prefer decodes in the same zone or rack as prefill. The reason why a GPU and its nearby NIC must be provisioned together is due toNCCL_NET_GDR_LEVELdistance limitations and the rail-optimized architecture, though we were unable to confirm how to allocate them as a matched pair in Kubernetes.
9. Where RDMA is Needed in Inference (Connecting to Part 6)
| Point | Communication | Rationale |
|---|---|---|
| KV Cache Transfer | GPU-to-GPU from prefill to decode via NIXL (UCX), not NCCL | Dynamo RDMA, vLLM NixlConnector documentation |
| Expert Parallelism | all-to-all per layer. DeepSeek-V3 reduces latency in decode using IB point-to-point and IBGDA | DeepSeek-V3, vLLM EP documentation |
| Cross-node TP | Because it is an all-reduce per layer, a high-speed adapter like InfiniBand is desirable (vLLM documentation uses "preferably"). There are also measurements indicating that cross-node TP has poor scalability (see "External Evidence" below) | vLLM Parallelism Documentation, Singhania et al. 2026 |
| Large Model Loading | Shared storage and GDS. Dynamo warns that downloading models exceeding 70B per pod takes several hours | Dynamo installation, GDS documentation |
NVIDIA's Dynamo documentation states that moving KVs over TCP results in a TTFT of about 98 seconds, and over RDMA, 200–500 ms. There are conditions mentioned within the document set. The 98-second figure is for Llama-3.1-8B, 8,000 input tokens, on an AWS p5.48xlarge when NIXL on an EFA pod silently falls back to UCX's slow path,and the 200–500 ms value is marked by the same document as a "specification-based expectation" (the actual measured additional KV transfer overhead with EFA under the same conditions was 37 ms). It should not be read as a general comparison between TCP and RDMA (Part 6 "External Evidence").
10. Hands-on Tryout
Since there is no RDMA hardware, this is in the realm of software and TCP. Items 1 and 2 were not run directly, and item 3 (software RoCE) records the results executed directly in "Actual Measurement" below.
iperf3to check Ethernet limits. Runiperf3 -sandiperf3 -c <서버> -P 4 -t 10on two servers and compare them with the 1GbE and 2.5GbE theoretical values in the table above. Avoid control plane (etcd) nodes and perform this during off-peak hours. Direct execution result: Across three different node pairs (pod network, 10 seconds), a single stream was 894–902 Mbit/s and 4 streams were 901–912 Mbit/s, both being identical (0 retransmissions), which is about 90–91% of 1GbE wire speed (about 112 MB/s). Moving KVs over this network takes about 8 seconds for 8,000 tokens (about 917 MB for a 1.7B model at 114,688 bytes per token), and about 19 seconds for about 2.1 GB for a 32B model at 256 KiB per token (calculated). Since the same 1.7B model takes about 1 second (8.2k tok/s, Part 21) to process an 8,000-token input on an 8GB-class GPU, In this network, recomputing KVs is faster than transferring them(comparison between measurements in parts 14 and 21, and this calculation).- TCP socket NCCL. On two servers with a single GPU each (e.g., hostA, hostB),
MPI=1built withnccl-testsdirectly on the hosts. Make sure no other workloads are using the GPUs first.mpirunCheck first that no other workloads are using the GPUs.
The expectation is that socket transfers will appear in the logs and the busbw for large messages will not exceed the link speed (0.125GB/s for 1GbE), rather than actual measurements. A single node with one GPU has no communication partner, so it is meaningless.mpirun -np 2 -H hostA:1,hostB:1 -x NCCL_IB_DISABLE=1 -x NCCL_SOCKET_IFNAME=<인터페이스> \ -x NCCL_DEBUG=INFO ./build/all_reduce_perf -b 8 -e 256M -f 2 -g 1 - Observing verbs flow with Soft-RoCE (rxe). According to RHEL documentation, Soft-RoCE is a Technology Preview and is scheduled for removal in RHEL 10. Performance is bottlenecked by the CPU so the numbers are meaningless; it is used for checking concepts like device enumeration, port states, and MTU. Since it creates kernel modules and RDMA devices, do this on a disposable VM rather than a production node.
sudo rdma link add rxe0 type rxe netdev <이더넷 인터페이스> rdma link show; ibv_devices; ibv_devinfo -d rxe0 | grep -E "state|active_mtu" ib_write_bw -d rxe0 -a # VM 두 대에 rxe 를 만들고 서버/클라이언트로 sudo rdma link delete rxe0 # 정리 (man rdma-link 로 확인)
Measurement: Reproducing both verbs flow and failures using Soft-RoCE (rxe)
Environment. Both server and client were run within a single disposable virtual machine (4 vCPU, 4GiB, Linux 6.8, virtual NIC MTU 1500) by connecting to its own address. rdma-core, ibverbs-utils, perftest(ib_write_bw, ib_write_lat), iperf3 was installed. The default cloud kernel image did not include the rdma_rxe module, so modprobe could not find the module; installing the additional module package (linux-modules-extra-<커널 버전>) brought it up. Since performance numbers are CPU-bound, this is strictly for verifying concepts.
| Verified Items | Results |
|---|---|
| Creating Devices | rdma link add rxe0 type rxe netdev <인터페이스> in a single line ACTIVE, LINK_UP. ibv_devinfo has transport: InfiniBand, link_layer: Ethernet, max_mtu 4096, active_mtu 1024 |
| GID table | 4 entries, all of them RoCE v2. Link-local IPv6, mapped IPv4 ::ffff:a.b.c.d, and even the address of another interface (overlay network) on the same machine ended up in one device's GID table (the kernel source says it registers the addresses of the device with RDMA and its upper device; the overlay interface flannel.1 is a VXLAN device and shows up in sysfs as an upper device of enp1s0 (upper_flannel.1), which matches this explanation) |
| MTU | The device over the 1500 Ethernet MTU is active_mtu 1024, and the device over the loopback with MTU 65536 is 4096. The write throughputs are 533 MB/s and 1,643 MB/s respectively, showing a 3.1x difference (not a strict comparison due to different paths) |
| Write Throughput by Size | 2B at 0.30 MB/s (message rate of about 0.16 Mpps), 1KiB at 208 MB/s, 64KiB at 536 MB/s, and 2MiB at 529 MB/s, saturating at around 0.53 GB/s. The message rate for small messages is capped at about 0.24 Mpps |
| TCP over the Same Path | iperf3 Single stream at 34.7 Gbit/s (about 4.3 GB/s), 4 streams at 137 Gbit/s. About 8 times faster than rxe write |
| Write Latency | 2B typical value 2.09µs (since it is within the same machine and has no network round-trip, it cannot be compared with hardware values) |
| Statistical counters | rdma statistic show link rxe0/1 include sent_pkts, rcvd_pkts, duplicate_request, out_of_seq_request, rcvd_rnr_err, retry_exceeded_err, completer_retry_err, link_downed , etc. Confirmed that the "Retry Counter" in the table of Section 7 actually exists |
| Non-existent device name | ib_write_bw -d rxe9 → IB device rxe9 not found, Unable to find the Infiniband/RoCE device, exit code 1 |
- The warning that "software implementations have no meaning in numbers" was correct. On the same machine, TCP was 8 times faster than RDMA writes. The benefits of RDMA (bypassing the kernel and CPU) occur when hardware handles the transmission, but in a software implementation, the CPU works for every packet, making it disadvantageous instead. This test is for visually observing concepts such as verbs flow, GID, and MTU.
- Reproduced the "pinned memory limit" failure from the table in Section 7. As a regular user, if you lower
ulimit -land write a 1MiB message, it fails withFailed to create MR,Couldn't allocate MRat 64KiB and 1,024KiB (server sidefailed to create mr) and succeeds at 8,192KiB and above. A 4KiB message succeeds under the same 64KiB limit, meaning that what triggers the limit is the size of the memory to register. As root, it also succeeded at 64KiB. This is explained by the Linux kernel source (drivers/infiniband/core/umem.c) failing user memory registration whenRLIMIT_MEMLOCKis exceededCAP_IPC_LOCKonly when there is no (in this test, capabilities were not checked directly, but verified via source descriptions). - MTU is determined by the device. At Ethernet MTU 1500
active_mtubecame 1024 (the rxe source code rounds down the Ethernet MTU minus the 80-byte header to the nearest power of 2 below, between 256 and 4096; 1500 minus 80 is 1420, which rounds down to 1024. The mlx5 device example in the NVIDIA documentation also showsactive_mtu 1024, so this is not a phenomenon unique to software implementations), when investigating issues where MTU mismatches occur between nodes, you must look at not only the Ethernet MTU but alsoibv_devinfo'sactive_mtu. - The reason why there are multiple GIDs becomes clearly visible in practice. Because link-local, mapped IPv4, and addresses from other interfaces are brought up together on a single device,
show_gidshelps you concretely understand the explanation in Section 7 that you must select the term corresponding to RoCE v2 using . The behavior when the GID selection is incorrect was tested separately usingib_write_bw. When the server and client used the same index, all three types (IPv4-mapped, link-local, and overlay address) succeeded, and throughputs were similar at 1,266, 1,322, and 1,299 MB/s (accessed via self-address within a single VM). If the server and client used different indices (1 to 0, 1 to 3) or provided a non-existent index (9), it failed with exit code 1. Omitting the index defaulted to index 1 (IPv4-mapped). However, this test was conducted withperftestrather than NCCL, and because error messages could not be collected, it was not verified whether theibv_modify_qp ... Invalid argumentmentioned in the NCCL documentation occurs in the same situation (unmeasured).
The limitations of this test are a single virtual machine, a software implementation, and no GPUs. RDMA between two nodes, the throughput and latency of actual NICs, PFC and ECN, nccl-tests, and GPUDirect RDMA were not measured (unmeasured).
External Evidence: Findings verified through papers and official materials
RoCE congestion control, descriptions of NCCL and GPUDirect, and the performance of software RoCE, which could not be directly measured, were verified using primary sources. For external figures, because equipment and conditions varied, only the consistency of directions and structures was evaluated.
| Topic | Material and Verified Location | Verified Content and Conditions | Relationship to This Article |
|---|---|---|---|
| DCQCN | Zhu et al., "Congestion Control for Large-Scale RDMA Deployments", SIGCOMM 2015, Sections 1, 2, 6, and 7 | Implemented ECN-based end-to-end congestion control in the NIC. In a 40Gbps environment, average latency for 2KB transfers is 25.4µs for TCP and 1.7µs for RDMA reads and writes. Incast degree 10 results in over 6 million PAUSE messages without DCQCN, and about 3,000 with it. Section 7 specifies that throughput drops sharply when the loss rate exceeds 0.1%, and that PFC does not become unnecessary. | Supports. Consistent with the description "Congestion control to reduce the side effects of PFC". Corrected "deployed" in our article to "being deployed" from the abstract. |
| PFC Deadlock and PAUSE Storms | Guo et al., "RDMA over Commodity Ethernet at Scale", SIGCOMM 2016, Sections 4.2, 4.3, and 6.2 | In the test cluster, deadlock occurred due to the interaction between packet flooding with unknown MAC addresses and PFC, which persisted even after restarting servers. Due to a NIC bug, a single server generated over 2,000 PAUSE frames per second, affecting half of the customer servers. 99th percentile latency was 90µs for RDMA and 700µs for TCP (50/50 mixed traffic). | Supports. Provides actual incident evidence for "PFC misconfiguration becomes a network-wide issue". |
| Fine-Grained Congestion Control | Li et al., "HPCC", SIGCOMM 2019 | Rate control using in-band telemetry. 99th percentile completion time slowdown for flows under 3KB is 53.9 for DCQCN vs 2.70 for HPCC (Alibaba internal measurement, assuming FPGA NICs and P4 switches). | Related. Demonstrates the limitations of ECN-based methods and reliance on PFC. |
| Common NCCL Issues | NCCL 2.32.3 "Networking Troubleshooting", "GPU troubleshooting" | ibv_create_qp·ibv_reg_mr failure is an issue with the pinned memory limit (unlimited memlock). Incorrect GID selection causes ibv_modify_qp ... Invalid argument, while versions 2.21 and higher select GIDs dynamically. If ACS and IOMMU are enabled, GPUDirect P2P is bypassed, leading to performance degradation or hangs. |
Supports. Aligns with the table in Section 7 and this reproduction of memlock for the same solution. |
| memlock and Permissions | Linux kernel drivers/infiniband/core/umem.c(master, as of inspection date) |
Exceeding RLIMIT_MEMLOCK during user memory registration fails with CAP_IPC_LOCK when -ENOMEM is absent. |
Supports. Explains why root was not subject to the limit. |
| MTU | NVIDIA MLNX_OFED v5.9 "RoCE" documentation ibv_devinfo example, kernel rxe_param.h |
mlx5 devices with an Ethernet MTU of 1500 max_mtu 4096, active_mtu 1024. rxe subtracts an 80-byte header and rounds down. |
Supports. Corrects the MTU description above based on the source code. |
| GPUDirect RDMA | NVIDIA "GPUDirect RDMA" documentation, Sections 1 and 3.4 | The NIC and GPU must share the same PCIe root complex, optimal with only PCIe switches; traversing the CPU is slow, and traversing QPI causes performance limits or instability. Performance figures are not provided in the documentation. | Supports. Consistent with Section 4 description. Benefit figures can be found in the DCQCN 2016 paper (CPU cycles 20% vs under 3%). |
| Software RoCE | linux-rdma mailing list (2019, maintainer diagnosis), kernel rxe_icrc.c, Red Hat RHEL 9 documentation |
Reports soft-RoCE at around 2Gbps versus TCP at 20Gbps, with the CPU calculating ICRC (CRC32) for every packet. RHEL documentation notes it as a Technology Preview scheduled for removal in RHEL 10. | Partially supports. Aligned with our results (rxe write around 4.2Gbit/s, same-machine TCP around 34Gbit/s). No controlled measurement papers were found within accessible scope. |
| Cross-Node Parallelization | DeepSeek-V3 Technical Report (arXiv 2412.19437) Sections 3.2 and 3.4. Singhania et al., arXiv 2511.09557. vLLM Parallelization Documentation | Expert parallelism sends tokens up to a maximum of 4 nodes, transmitting via IB then NVLink; decode uses IB point-to-point and IBGDA (NVLink 160GB/s vs IB 50GB/s). Cross-node TP has poor scalability, and there are cases in heavy-decode batches where PP underperforms TP. vLLM documentation describes high-speed adapters as "desirable". | Supports. Consistent with the table in Section 9, while softening "necessary" to "desirable". |
Figures from materials that could not be opened due to access restrictions (IEEE Network 2019 paper, Kernel Bugzilla 190951, SoftRDMA) were omitted.
11. Potential Interview Questions
- Why use RDMA instead of TCP? Because the NIC directly reads and writes to fixed memory without kernel copies or CPU involvement, latency and CPU overhead are reduced. GPUDirect RDMA further eliminates traversing host memory.
- How do you choose between InfiniBand and RoCE v2, and what are the risks of RoCE? IB offers simple configuration with dedicated fabrics and an SM, whereas RoCE uses existing Ethernet and L3 routing but requires aligning PFC, ECN, DSCP, and MTU all together. Misconfigurations manifest as tail latency or failures exclusively between nodes, which are verified via switch counters.
all_reduce_perfIf busbw is half of the NIC line rate, where should you check first?ib_write_bwCheck whether the NIC itself achieves line rate usingnvidia-smi topo -m, inspect the GPU-NIC distance usingNCCL_DEBUG=INFO, and verify the selected transport (NET/IB, GDRDMA usage) and rail configuration using- . What is the diagnostic sequence if multi-node training suddenly slows down?
ibstatCheck link degradation (ibdiagnetRate), port error counters, specific rail imbalance ( ), and in the case of RoCE, PFC and ECN counters, in that order. Adjust NCCL variables only when the hardware is verified to be healthy. - What is required for a Kubernetes pod to use RDMA? MOFED and the device plugin (Network Operator), pod resource requests for
rdma/...,nvidia_peermem, memlock limits, Multus secondary interfaces or SR-IOV if needed, and placement that assigns a NIC close to the GPU.
12. Common Misconceptions
- "RDMA is InfiniBand." RoCE and AWS EFA also provide RDMA (Dynamo RDMA documentation).
- "NCCL environment variables apply to all GPU communication." They do not apply to KV transfers going through NIXL/UCX.
- "busbw is the reciprocal of processing time." It is algbw multiplied by a correction factor and is a metric meant to be compared against hardware limits.
- "Since we have NVLink, communication between servers is also fast." In standard 8-GPU servers, NVLink connects only within the server, with NVL72 being an exception.
- "The more tuning variables you set, the better." NCCL documentation does not recommend constant settings.
References (Actually Accessed)
- NCCL 2.32.3 Documentation (overview, usage/collectives, env, troubleshooting networking·performance_and_tuning·gpu_troubleshooting): https://docs.nvidia.com/deeplearning/nccl/user-guide/docs/
- https://github.com/NVIDIA/nccl, https://github.com/NVIDIA/nccl-tests (README, doc/PERFORMANCE.md), https://github.com/linux-rdma/perftest
- NCCL 2.4 Blog: https://developer.nvidia.com/blog/massively-scale-deep-learning-training-nccl-2-4/
- https://github.com/Mellanox/network-operator, https://github.com/Mellanox/k8s-rdma-shared-dev-plugin, https://github.com/k8snetworkplumbingwg/multus-cni, https://github.com/k8snetworkplumbingwg/sriov-network-device-plugin
- Dynamo Installation & RDMA Documentation: https://github.com/ai-dynamo/dynamo (release/1.5.0
docs/fern/pages/kubernetes/installation) - vLLM: https://docs.vllm.ai/en/latest/serving/parallelism_scaling/, https://docs.vllm.ai/en/latest/usage/troubleshooting/
- GPUDirect: https://docs.nvidia.com/cuda/gpudirect-rdma/, https://docs.nvidia.com/gpudirect-storage/overview-guide/index.html
- RoCE: https://docs.nvidia.com/networking-ethernet-software/cumulus-linux-44/Layer-1-and-Switch-Ports/Quality-of-Service/RDMA-over-Converged-Ethernet-RoCE/ , https://networking-docs.nvidia.com/onyxum/3.10.4800/rdma-over-converged-ethernet-roce , https://en.wikipedia.org/wiki/RDMA_over_Converged_Ethernet , https://docs.min.io/memkv/operate/rocev2/ , https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/9/html/configuring_infiniband_and_rdma_networks/configuring-roce_configuring-infiniband-and-rdma-networks
- Specs: https://www.nvidia.com/en-us/data-center/nvlink/ , https://docs.nvidia.com/dgx/dgxh100-user-guide/introduction-to-dgxh100.html , https://docs.nvidia.com/dgx-superpod/reference-architecture/scalable-infrastructure-rubinx86/latest/network-fabrics.html , https://www.rambus.com/blogs/pci-express-5-vs-4/
- Papers: https://arxiv.org/abs/2412.19437 , https://conferences.sigcomm.org/sigcomm/2015/pdf/papers/p523.pdf (DCQCN, abstract level of search results only)
Checked versions, dates, and unverified items
The verification date is 2026-10-05. NCCL v2.32.3-1 (2026-09-17), perftest 26.07.8 (2026-09-28), Network Operator v26.4.2 (2026-09-16), RDMA Shared Device Plugin v1.5.4 (2026-07-28), Multus v4.3.1 (2026-09-08), and SR-IOV Device Plugin v3.11.0 (2025-12-16) were verified via the GitHub Releases API, while nccl-tests was read from master (commit of 2026-10-02) without a release.
Unverified items: (1) The main text of the DCQCN paper has now been read directly (see "External Evidence" below). (2) The system requirements in the Network Operator README (ConnectX-5, Ubuntu 20.04) appear outdated, and the current support matrix was not verified. (3) How to match and allocate GPU-NIC pairs in Kubernetes. (4) rdma link delete and the expected output of nccl-tests were not executed. (5) MTU negotiation rules are based on third-party runbooks. (6) InfiniBand link-layer flow control and NVLink 6th-generation details were not covered. (7) All three practical exercises in Section 10 remain unexecuted.