PIVOT AI LAB
PROJECT PIVOT AI INFRASTRUCTURE ARTICLE 04
FIELD NOTES / ROCE CONGESTION / ARTICLE 04

RoCE Congestion: PFC, ECN, CNP, and DCQCN

Inside the physical 100GbE experiment: proven switch marking and NIC feedback, measured RDMA latency, and the DCQCN limit that matters.

October 2026 physical labZ9100-ON OS10 • ConnectX-5 • RoCEv2Editorial preview / no publication
100 GbEPhysical Ethernet ports
+136,874Matched ECN / CE deltas
3,016Matched PFC frames
63.57 µsCongested RDMA latency

A 100GbE link can remain operational while a small RDMA message takes dozens of times longer to complete. During Project Pivot, I measured average 64-byte RDMA SEND latency of 1.53 microseconds unloaded, 63.57 microseconds under deliberate congestion, and 1.69 microseconds after recovery. The links did not need to fail for application-facing performance to deteriorate.

That result pushed the investigation well beyond interface speed and packet loss. I wanted to see how the switch classified RoCEv2 traffic, where that traffic queued, whether priority-specific pause frames reached the adapter, whether the switch actually marked congestion, and whether the receiving adapter generated feedback to the sender. Those are different observations. Treating one as proof of another is an easy way to claim a working congestion-control loop that nobody has actually measured.

The physical work also exposed an important limitation. I proved switch ECN marking and end-host CNP feedback, but did not independently prove DCQCN sender-rate reduction and recovery. The distinction is central to this article.

01 / Start with the actual path

The physical testbed used a Dell PowerEdge R430 running Proxmox VE 9.1.9, one dual-port NVIDIA ConnectX-5 100GbE adapter, and a Dell Z9100-ON switch running SmartFabric OS10 10.5.0.6C1. The ConnectX-5 firmware was 16.35.1012, with Linux mlx5_core driver 7.0.2-2-pve. Two Linux network namespaces separated the test contexts:

The path used 100GbE QSFP28 DACs and VLAN 100. The hosts used MTU 9000 and the switch MTU 9216. Both ports were on the same physical adapter in the same server. The labels gpu-a and gpu-b refer to simulated endpoint namespaces, not installed GPUs and not independent physical compute nodes.

Physical testbed with one Dell R430, one dual-port ConnectX-5, two Linux namespaces, and two Z9100-ON switch ports
Figure 01. The measured path crossed two physical Ethernet ports and the OS10 switch, but shared a host, PCIe path, and NIC. No two-server incast or GPU-to-GPU communication is implied.

Earlier physical validation established a useful RoCE bandwidth baseline: approximately 76.8 Gb/s RDMA WRITE, 67.3 Gb/s READ, and 47.7 Gb/s SEND, under the recorded same-host conditions. That baseline did not settle the congestion questions. I then introduced intentional egress queue-3 shaping to make the hardware's signaling behavior observable.

02 / Get the traffic into the intended queue

Congestion experiments are nearly meaningless if the traffic never enters the queue being controlled. On the Z9100, the documented and observed mapping was DSCP 26 → traffic class 3 → egress queue 3. The network-QoS policy matched qos-group 3 and applied priority-3 PFC where configured. Queue 3 was also associated with the controlled shaping and ECN-enabled WRED experiment.

On the sender, the traffic-class value used in the RoCE test was 106, representing DSCP 26 in the upper six IP traffic-class bits with ECN-capable transport bits included. It would be incorrect to call the decimal value 106 the DSCP value. The DSCP value was 26.

Physical classification chain from RoCEv2 UDP/IP packet through DSCP 26 to traffic class 3 and queue 3, with separate PFC priority
Figure 02. The tested egress classification chain. The exact internal ASIC ingress priority-group selection was not conclusively established; an observed egress queue does not, by itself, prove the ingress PG mapping.

I verified the mapping through the switch's QoS state and the adapter's priority accounting. Before the host Data Center Bridging change, the comparison showed traffic counted against priority 0. After the change, priority-3 byte accounting increased while priority-0 growth became negligible for the tested workload. That is more useful than pointing at a policy name and assuming the packets obey it.

The rule I carried forward was to establish the transmitted traffic class, the switch classification, and the observed queue counters as distinct checkpoints. A misclassified RoCE stream can bypass the carefully tuned queue entirely.

03 / PFC: validate the frame, not just the setting

Priority Flow Control is an Ethernet mechanism that pauses an individual traffic priority on an adjacent link. It is local, hop-by-hop backpressure, not an end-to-end instruction to the RDMA sender to reduce its offered rate. That difference matters because PFC can stop a queue temporarily while ECN/CNP feedback provides a separate congestion signal farther up the communication path.

During the October 10 synchronized comparison, the switch and adapter recorded aligned changes:

Synchronized observation Delta
Z9100 Eth1/1/3 priority-3 PFC transmitted +3,016
GPU-A adapter priority-3 PFC received indication +3,016
GPU-A adapter physical PAUSE received +3,016
Measured priority-3 PFC frame signaling between Z9100 Ethernet 1/1/3 and GPU-A ConnectX-5 port with matched counter deltas
Figure 03. The matched switch-transmit and NIC-receive counter increases support delivery of priority-3 pause signaling in the tested direction. They do not show pause duration, a full lossless domain, or equivalent configuration on the other NIC port.

I was careful not to describe the two adapter ports as identically configured. GPU-A had priority-3 PFC enabled for this exercise; GPU-B did not have a corresponding verified enabled configuration. The evidence supports one tested direction. It does not establish bidirectional lossless operation or a production-ready PFC headroom design.

PFC also has operational risks: insufficient headroom can still result in drops, while excessive or uncontrolled pause propagation can create head-of-line blocking and deadlock conditions. I did not establish a vendor-supported PFC watchdog/deadlock recovery mechanism on this installed OS10 build, and did not inject a deadlock. That capability remains a documented limitation rather than an asserted hardware deficiency.

04 / ECN and CNP: the complete observed signaling chain

RoCEv2 uses IP ECN bits to communicate congestion without requiring the congested switch to discard an ECN-capable packet. When the switch marks an IP packet CE (Congestion Experienced), the receiving RDMA adapter can generate a Congestion Notification Packet (CNP) toward the transmitting adapter. The transmitter can then use that signal as input to rate control. Seeing CE marks and CNP handling is proof of feedback; sender-rate adaptation requires another measurement.

On October 12, I ran a controlled physical RDMA WRITE experiment from GPU-A to GPU-B over the Z9100, using 65,536-byte messages and GID index 3. Queue 3 was shaped to approximately 6 Gb/s. The recorded transfer operated around 5.5–5.9 Gb/s in that congested configuration.

The strongest evidence came from synchronized before/after counter captures:

Device and counter Before After Difference
Z9100 Eth1/1/5 ASIC ECN-marked packets 361,573 498,447 +136,874
GPU-B CE-marked RoCE packets received 107,000 243,874 +136,874
GPU-B CNP transmitted 59,034 131,302 +72,268
GPU-A CNP handled 59,256 131,804 +72,548
GPU-A CNP ignored 0 0 0
Measured sequence showing switch ECN marking delta 136874, receiver CE delta 136874, receiver CNP transmitted 72268, and sender CNP handled 72548
Figure 04. Actual hardware counter deltas. The identical +136,874 switch and receiver CE deltas strongly support cross-device marking correlation, but are not a packet-by-packet trace. The two CNP counters are different observations and are not expected to equal the number of marked data packets.

The switch and receiver CE differences matched exactly within that comparison. WRED and queue-3 drop counters remained at zero in the observed sample. This supported the conclusion that the physical fabric marked congestion and the two NIC roles processed corresponding feedback.

There were also test-harness imperfections: one receiver process expired before its sender started, and another produced a socket-exchange error on shutdown. Those events must remain in the test record. Neither can be presented as evidence of an ECN transport failure. And I cannot infer packet loss from the modest difference between the sender and receiver CNP deltas without synchronized packet-level attribution.

05 / Why the 6 Gb/s test did not prove DCQCN

The experiment separated the congestion feedback signal from the more difficult question of what independently controlled the sending rate. DCQCN is a RoCE congestion-control mechanism in which adapter rate control can react to congestion notification, reducing and later recovering the offered sending rate. The relevant measurements are the sender's adapter rate-control behavior and actual offered rate while other constraints are controlled.

The physical experiment intentionally used a hardware queue shaper. Across three conditions, I measured approximately 5.82 Gb/s with shaping attached, 48.08 Gb/s after removing it, and 6.00 Gb/s when shaping was restored. ECN marking and CNP feedback appeared during congestion. That sequence demonstrated the shaper's effect and the signaling path, but the shaper itself was an independent limit on observed throughput.

Three-phase throughput comparison with 5.82 Gbps shaped, 48.08 Gbps unshaped, and 6.00 Gbps reshaped, marked as not proving DCQCN
Figure 05. These are measured workload rates during controlled queue shaping, not a graph of NIC DCQCN rate registers. The return to approximately 6 Gb/s when the shaper was reattached does not independently demonstrate DCQCN rate reduction or recovery.

PFC could also affect the path during the experiment. Without a controlled and supported measurement that isolates NIC rate-control transitions from shaping, pause, host placement, and other effects, I cannot attribute the observed throughput change specifically to DCQCN.

The purchase-objective register therefore records P09 as USER-DEFERRED. No further DCQCN experiment was required after the October 12 hardware closeout decision. It is possible to establish that a sender received CNPs while leaving its independent rate-reaction mechanism unproven. That is the correct disposition for this lab.

06 / Buffer visibility and the part I could not map

The Z9100 provided useful ASIC buffer and queue visibility. I captured an ingress PG0 reserved buffer value of 183,040, XOFF 37,440, and XON 9,360 in the recorded switch output. Historical observations included an ingress PG0 shared peak of 681,824, a headroom peak of 145,600, and an egress queue-3 peak of 864,864 reported units. The switch also reported system-level lossless buffer allocations.

Those are not automatically interchangeable numbers. They came from different ASIC counter and configuration views, with different meanings and potentially different reporting units. Historical peaks could not be assigned exclusively to a single test window. Most importantly, the exact internal TC3-to-ingress-PG relationship was not proven from the available evidence.

This is one reason I do not use the phrase “lossless fabric validated” based solely on queue configuration, PFC frames, and an absence of sampled drops. Headroom sizing depends on link speed, pause reaction time, frame size, topology, and traffic patterns. A two-port, one-host trial cannot demonstrate the behavior of a multi-host training cluster under incast.

07 / Latency showed the operational consequence

The most immediately understandable performance measurement came from a three-phase 64-byte RDMA SEND latency exercise with 2,000 iterations per phase. During the congested phase, background RDMA WRITE traffic ran at approximately 5.9 Gb/s. The averages were:

Condition Average 64-byte RDMA SEND latency
Unloaded 1.53 µs
Deliberately congested 63.57 µs
After recovery 1.69 µs
Three-phase RDMA SEND latency chart showing 1.53 microseconds unloaded, 63.57 congested, 1.69 recovered
Figure 06. Physical measurements of 64-byte RDMA SEND latency in the recorded test configuration. They are not isolated ASIC latency measurements, a GPU-to-GPU performance result, or a forecast for a production training fabric.

That is approximately a 42-fold increase from the unloaded average to the congested average. The recovered value returned close to baseline. It shows why a link can appear healthy in a conventional availability dashboard while a latency-sensitive workload is under pressure.

I would not generalize the result to every packet size, traffic mix, or hardware platform. The endpoints shared CPU, memory, PCIe, and NIC resources, and the small-message test had a bounded sample size. Within that scope, the experiment clearly demonstrated application-visible RDMA latency sensitivity to controlled congestion.

08 / What I would check on an AI fabric incident bridge

If a production GPU workload began stalling while all Ethernet interfaces stayed up, I would start by establishing the affected traffic class, time window, endpoints, and switch path. From there I would compare the transmitted DSCP/ECN values with the actual switch TC and queue mapping, confirm egress queue and buffer counters, and examine whether physical PFC pause frames are being sent and received on the intended priority.

Next I would correlate switch CE-marking deltas with receiver RoCE CE observations, receiver CNP transmission, and sender CNP handling. If the incident required a claim about DCQCN, I would ask for independent sender-rate evidence, not substitute switch shaping or a CNP counter for it. Finally I would line those network and adapter signals up with RDMA retry, completion, and workload-latency measurements before deciding whether a network correction improved the application.

The same investigation also has a security and operational boundary: controlled PFC, shaping, or WRED changes can affect other tenants and traffic classes. In production I would require an approved change window, known class-to-queue intent, baseline counters, rollback criteria, and checks for pause storms or unintended congestion propagation. A congestion test that destabilizes unrelated workloads is not an acceptable validation strategy.

The engineering conclusion: Project Pivot demonstrated physical priority-3 PFC signaling in one direction, ECN marking with directly correlated receiver CE counts, and CNP feedback across the adapter ports. It documented measurable RDMA latency inflation during congestion. It did not demonstrate independent DCQCN sender-rate control, full bidirectional losslessness, or multi-host GPU incast. Those boundaries are what make the measurements useful to another engineer.

Evidence trail

The original physical acceptance records and supporting reports are maintained under /home/bryan/pivot/fabric/sonic-clos/ on fabric-lab-1, with hardware captures originally collected on proxmox-r430. Relevant documentation includes:

All six figures are original editorial reconstructions based on the recorded tests. They are not substituted device screenshots or packet captures. Technical records remained subject to GitLab evidence reconciliation at the time of the October 12 acceptance note; this article does not claim independent current repository verification.

Vendor and protocol references