Link test: download series (bulk sampled, warm bursts, paced) and burst-vs-idle; car results
CI / Analyze & Test (push) Successful in 10s
CI / Debug APK (push) Successful in 15s

Orin -> tablet over NCM: paced streams up to 4 MB/s are clean; unpaced
bursts and bulk hit multi-second holds that inflate the RTO to 10-16 s.

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:33:55 +09:00
parent 66eab916bc
commit 8f4e34d956
6 changed files with 330 additions and 12 deletions
+58
View File
@@ -61,3 +61,61 @@ adb -s localhost:15555 shell am start -n dev.yukart.display/.MainActivity --es l
The host defaults to the gateway's. A run takes about 75 s and reports each
result to the Orin as it goes.
## Download in the car setup (PD hub + charger)
Two identical download series (`dl:`), then a burst-vs-idle series (`bi:`). Raw
records under the labels `car-dl1`, `car-dl2`, `car-bi1`.
**Paced streams are clean.** 30 frames/s at 0.5, 1, 2 and 4 MB/s, 10 s each, in
both series: every frame arrived, the full rate was delivered, and queueing never
exceeded 44 ms. A camera-like stream up to 4 MB/s (32 Mbit/s) fits.
**Unpaced traffic is not:**
| | Series 1 | Series 2 |
|---|---|---|
| Bulk, 5 × 10 s: rate while flowing | 5.6 MB/s | 5.6 MB/s |
| Bulk: longest stall per run | 1.8, 14.0, 3.6, 0.3, 0.8 s | 0.2, 3.7, 0.8, 0.8, 14.4 s |
| Bulk: Orin retransmits | 0 | 0 |
| Burst 64 KB after 1 s idle, p50 | 17 ms | 18 ms |
| Burst 256 KB, p50 | 12.1 s | 14.1 s |
| Burst 1 MB, p50 | 14.8 s | 13.8 s |
| Burst 4 MB, p50 | 4.5 s | 4.6 s |
| Burst connection: Orin retransmits, smoothed RTT, RTO | 50, 2.35 s, 10.8 s | 49, 2.39 s, 11.0 s |
**Not idle-related.** 256 KB bursts on fresh connections, 8 each:
| Idle before each burst | p50 | Bursts over 1 s | Orin retransmits, smoothed RTT |
|---|---|---|---|
| 0 | 12.6 s | 7 of 8 | 15, 1.6 s |
| 50 ms | 61 ms | 1 of 8 | 8, 1.8 s |
| 200 ms | 14.3 s | 6 of 8 | 13, 1.8 s |
| 1 s | 56 ms | 0 of 8 | 0, 16 ms |
| 1 s, 50/s UDP keepalive | 56 ms | 0 of 8 (3 near 0.5 s) | 5, 21 ms |
| 0 (repeat) | 13.6 s | 8 of 8 | 14, 1.5 s |
**Reading.** A fresh connection's first burst is fast. Then a few segments go
missing, and the Orin measures round trips of 1.5–2.4 s on a 3 ms link: packets
are being *held* for seconds, not only dropped. The smoothed RTT and the RTO
(10–16 s) inflate, and every later burst on that connection waits out the RTO.
Bulk stalls of up to 14 s with zero retransmits are the same holding, seen
without loss. Paced traffic at ≤ 4 MB/s never triggers it.
Nothing on the Orin's side records it: no kernel messages, `tx_dropped` and
`tx_errors` 0 on `usb1`. The packets vanish or wait inside the USB layer, in the
Orin's NCM gadget or the tablet's NCM host driver; the tablet's sysfs is not
readable without root.
**Consequences:**
- Anything the Orin sends to the tablet should be **paced**, not dumped at line
rate: video at a steady frame rate is fine; a TTS utterance should stream in
chunks rather than be written in one go (the protocol already plans chunks).
- A connection that has hit this is poisoned for many seconds (inflated RTO).
The heartbeat timeout will see it as a dead link and reconnect, which resets it.
- `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.