Link test: per-socket pacing (SO_MAX_PACING_RATE) at 5 MB/s removes the NCM holds

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DDwfd6Ki8UfG4hK6W5YpJz
This commit is contained in:
2026-10-11 16:46:19 +09:00
parent 8f4e34d956
commit 7f967340b6
2 changed files with 33 additions and 3 deletions
+25 -2
View File
@@ -117,5 +117,28 @@ readable without root.
- `adb push`/`install` is exactly an unpaced bulk transfer, which explains its
0.14 MB/s.
Open: whether RNDIS instead of NCM avoids it, and whether pacing all egress on
the Orin (`tc` `fq` with `maxrate`) fixes unpaced senders too.
## Pacing fixes it
The Tegra kernel (5.15.148-tegra) ships without `fq`, `tbf`, `htb` or `fq_codel`,
so egress cannot be shaped per interface with `tc`. TCP's own pacing needs no
qdisc: the server capped each download socket with `SO_MAX_PACING_RATE` at
5 MB/s (`LINKTEST_PACE=5000000`), just under the ~5.6 MB/s the link carries
when it flows. Labels `pace5-bi`, `pace5-dl`:
| | Unpaced | Paced to 5 MB/s |
|---|---|---|
| Bulk, 5 × 10 s | 2.3–5.4 MB/s, stalls up to 14 s | 4.96–4.99 MB/s every run, longest stall 94 ms |
| Bulk, 250 ms windows | min 0, up to 56 empty | min 4.1 MB/s, none empty |
| Burst 256 KB, p50 | 12–14 s | 58–78 ms |
| Burst 1 MB / 4 MB, p50 | 14 s / 4.5 s | 225 ms / 863 ms |
| Burst-connection retransmits | ~50 | 0–1 |
| Idle gap before burst | erratic | no effect |
| Paced 30 fps streams, ≤ 4 MB/s | clean | clean |
**Every Orin → tablet sender should cap its socket at ~5 MB/s**
(`SO_MAX_PACING_RATE`, one `setsockopt`). For svc-gw that is the WebSocket
socket; for a camera relay, its stream socket. Senders that cannot be changed
(sshd for the adb tunnel) stay affected.
Open: whether RNDIS instead of NCM avoids the holding in the first place (not
tested: changing the live gadget configuration needs a root action on the Orin).