The TX cliff that wasn't the NIC
One host's throughput cratered on every large model. We swapped NICs, cables, drivers, and reproduced it on all of them. The defect was somewhere we weren't looking.
The symptom
We had a cluster of Linux machines and one Windows host. The Windows box also ran the lab’s primary services, so we kept it in the inference ring. We were running large models across the cluster, synchronizing every token over a 10-gigabit fabric.
When the Windows host participated, the whole cluster crawled. Without it, the same cluster ran flat and healthy at about 40 tok/s on the reference model. Every configuration that hit the cliff included the Windows host.
We ran a bidirectional iperf3 test. The receive side sat at 9.3 Gbps, essentially line rate. The transmit side wedged at 3.5 to 4 Gbps. The wire was healthy in one direction and broken in the other. The defect was in the Windows host’s outbound path.
The elimination ladder
We started with the application layer. We ran a loopback test on the Windows box, with the RPC server talking to itself. No physical NIC involved. The throughput was flat at 49 to 55 tok/s, with a latency of about 20 ms per token. The inference software’s socket code was not the problem.
Next, we tuned the NIC. We disabled interrupt moderation, set static low latency, and switched to polling completion mode. No change.
Then came the false fix. We bumped the NIC’s send buffers from 2048 to 4096. The cliff appeared to flatten. Throughput jumped from 3.5 to 4 Gbps up to 8.67 Gbps. We wrote “FIX FOUND, mechanism solved” in the log. It felt good.
A fresh-eyes re-verification the next morning showed it was a false flag. The cliff was still there. The buffer bump had masked the symptom under different load conditions, but it was never the fix. We had been fooled by a temporary plateau.
We swapped the NIC. We replaced the Intel X520 with a Mellanox ConnectX-3. We swapped cables too. The A/B throughput results were identical to two decimal places: 16.86 and 17.10 tok/s on the Intel, 16.88 and 17.10 on the Mellanox. Two different cards, two different drivers, same cliff. The NIC was exonerated as a class.
We updated the BIOS, installed chipset drivers, and retrained the RAM to stability. The cliff persisted. The Windows host transmitted 4K messages at 3.58 Gbps while a Linux control machine hit 8.1 Gbps flat against the very same server.
The shape of the defect
We characterized the behavior. The cliff was per-flow, not per-host. Two or four parallel flows aggregated to 8.4 to 8.7 Gbps. Forcing a large 8 MB TCP window recovered a single flow to 6.6 Gbps. Disabling Nagle made it worse, dropping to 2.7 Gbps.
This shape pointed at Windows send autotuning under-windowing single connections, plus a high per-packet send cost. Single-connection RPC traffic is exactly the worst case for this behavior. It remained a characterization of the behavior, not a diagnosis of why this specific install did it.
The pivot
There was no fix. What remained was a theory: something inside this specific Windows installation. We arrived at it by eliminating everything else we could think of. That is a suspect, not a conviction.
A Windows reinstall might fix it. That experiment is pending, gated on migrating the services the box hosts. Even a planned motherboard swap is framed in the lab’s records as a diagnostic, not a cure. If the cliff rides the existing install onto new hardware, the theory holds. If it vanishes, the theory was wrong.
The resolution was architectural. We pulled the Windows host out of the cluster. We stopped needing its transmit path. The cluster went Linux-only for the deep model. The Windows box became a solo fast-chat endpoint, running single-host inference where the defect cannot bite.
This created a two-tier serving design. Deep and smart on the cluster, fast on the solo box. It is a pattern we still run today. We turned a quarantine into a feature.
Run the bidirectional asymmetry test on day one. The RX-healthy and TX-cliffed signature was sitting there the whole time. Weeks of NIC archaeology would have been scoped in an afternoon.
A fix is not a fix until it re-verifies cold. The send-buffer “fix” survived one evening of enthusiasm and zero mornings of scrutiny.
Process of elimination produces a suspect, not a conviction. Say “theory,” not “diagnosis,” and design so the suspect can’t hurt you while you wait to prove it.