diff --git a/docs/Disaggregated/CURRENT_STAGE_PROGRESS.md b/docs/Disaggregated/CURRENT_STAGE_PROGRESS.md index 6ca7cc28..deb42545 100644 --- a/docs/Disaggregated/CURRENT_STAGE_PROGRESS.md +++ b/docs/Disaggregated/CURRENT_STAGE_PROGRESS.md @@ -1,6 +1,6 @@ # 当前阶段:P12 — server 自己开窗口上屏 -> **更新 2026-09-28**(含五臂传输性能对比,见 [`notes/perf-five-arm-20260928`](notes/perf-five-arm-20260928/README.md))。这一页只有摘要;带裁定编号的明细、余项清单、证据位置在 [`notes/p12/README.md`](notes/p12/README.md)(计划与交接 [`PLAN-P12.md`](notes/p12/PLAN-P12.md))。P12 审查后的定向主机与真机复测已完成;两个收官验收门仍未打。上一阶段 P7 已于 2026-09-23 完成。 +> **更新 2026-09-28**(含五臂传输性能对比,见 [`notes/perf-five-arm-20260928`](notes/perf-five-arm-20260928/README.md))。这一页只有摘要;带裁定编号的明细、余项清单、证据位置在 [`notes/p12/README.md`](notes/p12/README.md)(计划与交接 [`PLAN-P12.md`](notes/p12/PLAN-P12.md))。P12 审查后的定向主机与真机复测已完成;验收 B 已于 2026-09-28 通过,验收 A 仍未打。上一阶段 P7 已于 2026-09-23 完成。 ## 目标 @@ -15,7 +15,7 @@ Android 上的 server 应用自己开一个全屏窗口,把收到的渲染流 | 主机门与单进程构建二进制不变(G1) | ✅ 原主机门 / G1 见 ID-P12-14/15;审查后 P12 定向 CTest **46/46**(`1fb18d9e`) | | 真机 7 项检查(两个后端上屏、排队与拒绝、窗口丢失、离屏不受影响……) | ✅ 审查后在 Redmi `2f7cbe2e` 复测通过(`1fb18d9e`);明细见 [`notes/p12/README.md`](notes/p12/README.md) | | 验收 A:同一台手机上用 FCL 以两个后端进游戏,杀掉 server 后干净报"设备丢失" | ❌ 未做 | -| 验收 B:另一台电脑经 TCP 连手机进游戏,并记录链路数据 | ❌ 未做 | +| 验收 B:另一台电脑经 TCP 连手机进游戏,并记录链路数据 | ✅ 2026-09-28:WSL client 经 Wi-Fi 重放 rd12 世界内 trace,ssim 0.999883、251/251 帧;必测数见 [`notes/p12/CROSSHOST-ACCEPTANCE.md`](notes/p12/CROSSHOST-ACCEPTANCE.md)(client 是 trace 重放器,不是活的 Minecraft) | ## 性能现状(2026-09-28,Redmi 未定频交错 A/B) @@ -26,16 +26,16 @@ Android 上的 server 应用自己开一个全屏窗口,把收到的渲染流 | spawn+shm | 178 fps(+36%) | 89 fps(−12%) | | spawn+tcp localhost | 21–23 fps | 77 fps(−24%) | | tcp localhost + `SPIN_US=2000` | 63.6 fps(2.9×) | — | -| tcp over Wi-Fi(WSL → 手机) | 17.4 fps(带宽约束) | 4.2 fps(RTT 约束) | +| tcp over Wi-Fi(WSL → 手机) | 稳态 17–22 fps(加载帧 52 s) | 稳态 105–133 fps | - inproc / shm 重负载比 monolith 快(run-ahead 并行 + 探针更少);轻负载只付固定握手成本。 - tcp 慢的主因:present credit=1 串行等待 ~74% + futex 唤醒税;不是带宽。 - 原先记录的「跨主机 TCP 在 `eglMakeCurrent` 挂死」**不是源码 bug**:WSL 流量被主机 v2rayN 的 `xray_tun` 终结后中继卡住。绕开后 rd12 / openra 都跑通;跨机测试前先跑 `tools/device_bench/disagg/tcp_path_check.sh`。 -- 直连 Wi-Fi 吞吐 14–20 MiB/s,所以 rd12 经 Wi-Fi 的上限 ~18–26 fps。 +- Wi-Fi 上加载帧(2.7 GB)受带宽约束(server 实测 52 MB/s 持续),稳态不受(20–24 MB/s,受往返延迟);`PRESENT_CREDIT` 1→2 稳态 +26%,2→3 +4%。此前的「带宽上限 18–26 fps」结论已撤回(`toybox nc` 汇点低估了链路)。 ## 下一步 -1. 打验收 B(另一台机器经 TCP 入世界;先过 `tcp_path_check.sh`)与验收 A(FCL 同机 spawn、双后端、杀 server 报 device-lost)。 +1. 打验收 A(FCL 同机 spawn、双后端、杀 server 报 device-lost)。 2. 收尾:写 `MG_Remote/CONTRACT-P12.md`、修门脚本误导的一行输出、收官审查。 3. 零代码 knob A/B:`PRESENT_CREDIT=2`、shm 臂 server `SPIN_US` 降到 20–35、`SERVER_AFFINITY`;代码级:client doorbell 换 futex/eventfd、applier 自适应 spin、sendmsg 跨 Flush 合批。 4. 之后按 [`ROADMAP.md`](ROADMAP.md):P8;P9 → P10 → P11。 diff --git a/docs/Disaggregated/MEASUREMENTS.md b/docs/Disaggregated/MEASUREMENTS.md index e8909307..828a707b 100644 --- a/docs/Disaggregated/MEASUREMENTS.md +++ b/docs/Disaggregated/MEASUREMENTS.md @@ -27,7 +27,7 @@ 那一帧 **221.5 s → 182.8 s(−17%)**;设备定频+关深度空闲则是 **166.5 s(−25%)**。服务端日志会打印 `spin 2000 us` 自证。 见 [`notes/p12/DEVICELOST-AND-UPLOAD-WAITS.md`](notes/p12/DEVICELOST-AND-UPLOAD-WAITS.md) §2.6–2.10。 - **画面正确**:Vulkan 后端真机画面检查 36/36 通过,CTS 五块相对基线没有超过 0.5 个百分点的退步、没有新崩溃(P7);server 自有窗口上屏两后端 SSIM 1.0(P12)。 -- **五臂传输对比(2026-09-28,未定频交错 A/B)**:重负载(rd12)下 inproc ≈ spawn+shm 比 monolith **快约 1/3**(run-ahead 流水线并行 + applier 路径探针更少),轻负载(openra)下 split 只付固定开销;**tcp localhost 慢 ~8 倍,瓶颈是 present credit=1 的串行等待(~74%)+ futex 唤醒税**,`MOBILEGL_IPC_SPIN_US=2000` 单项实测 21.7→63.6 fps;跨主机 TCP 的「`eglMakeCurrent` hang」**是测试环境造成的**(主机 v2rayN `xray_tun` 终结 TCP 后中继卡住,不是源码 bug);绕开后 WSL → 手机经 Wi-Fi 跑通:rd12 17.4 fps、openra 4.2 fps。直连 Wi-Fi 吞吐 14–20 MiB/s,所以 rd12 上限 ~18–26 fps;RTT 4.6–110 ms。P6.5 / P12 的 WSL → 手机链路数也都经过 xray。全文 [`notes/perf-five-arm-20260928`](notes/perf-five-arm-20260928/README.md)。 +- **五臂传输对比(2026-09-28,未定频交错 A/B)**:重负载(rd12)下 inproc ≈ spawn+shm 比 monolith **快约 1/3**(run-ahead 流水线并行 + applier 路径探针更少),轻负载(openra)下 split 只付固定开销;**tcp localhost 慢 ~8 倍,瓶颈是 present credit=1 的串行等待(~74%)+ futex 唤醒税**,`MOBILEGL_IPC_SPIN_US=2000` 单项实测 21.7→63.6 fps;跨主机 TCP 的「`eglMakeCurrent` hang」**是测试环境造成的**(主机 v2rayN `xray_tun` 代理终结 TCP 后中继卡住,不是源码 bug);绕开后 P12 出口门 (b) 通过:WSL client 经 Wi-Fi 重放 rd12 世界内 trace,ssim 0.999883,稳态 17–22 fps(`PRESENT_CREDIT` 1/2/3 = 16.9 / 21.3 / 22.1),openra 稳态 105–133 fps;加载帧 2.7 GB 受带宽约束(server 实测 52 MB/s),稳态受往返延迟(20–24 MB/s)。全文 [`notes/perf-five-arm-20260928`](notes/perf-five-arm-20260928/README.md)。 ## 按阶段 @@ -47,5 +47,5 @@ | 13 | P3b/P4b | 纹理上传形状在四种拓扑下完全一致 | [`notes/p34b`](notes/p34b/README.md) | | 14 | P6.5 | 跨机 TCP 102/102;断线约 5 s 检测到 | [`notes/p65`](notes/p65/README.md) | | 15 | P7 | 真机画面 36/36;server 内存无界增长收住(主机 825 → 546 MiB) | [`notes/p7`](notes/p7/README.md) | -| 16 | P12 | 审查后真机复测:Espryt SSIM 1.0;Magma 1.0 / 0.999999511;P12 定向 CTest 46/46;纹理上传回包等待 1→0(主机机制门,真机墙钟待测);FCL 与跨机 TCP 收官门仍待完成 | [`notes/p12`](notes/p12/README.md) | -| 17 | 五臂传输测量(2026-09-28,非阶段) | inproc/shm 重负载比 monolith 快 ~1/3;tcp localhost 瓶颈是 credit=1 + 唤醒税(SPIN_US=2000 → 2.9×);跨主机 hang 实为主机 xray TUN 代理造成;直连 Wi-Fi rd12 17.4 fps(带宽约束) | [`notes/perf-five-arm-20260928`](notes/perf-five-arm-20260928/README.md) | +| 16 | P12 | 审查后真机复测:Espryt SSIM 1.0;Magma 1.0 / 0.999999511;P12 定向 CTest 46/46;纹理上传回包等待 1→0(主机机制门,真机墙钟待测);跨机 TCP 门 (b) 通过(rd12 ssim 0.999883、稳态 17–22 fps);FCL 门 (a) 仍待完成 | [`notes/p12`](notes/p12/README.md) | +| 17 | 五臂传输测量(2026-09-28,非阶段) | inproc/shm 重负载比 monolith 快 ~1/3;tcp localhost 瓶颈是 credit=1 + 唤醒税(SPIN_US=2000 → 2.9×);跨主机 hang 实为主机 xray TUN 代理造成;直连 Wi-Fi 稳态 rd12 17–22 fps、openra 105–133 fps | [`notes/perf-five-arm-20260928`](notes/perf-five-arm-20260928/README.md) | diff --git a/docs/Disaggregated/ROADMAP.md b/docs/Disaggregated/ROADMAP.md index 9d864354..fa3e5c15 100644 --- a/docs/Disaggregated/ROADMAP.md +++ b/docs/Disaggregated/ROADMAP.md @@ -1,6 +1,6 @@ # 路线图(索引) -> **2026-09-28**:P0 到 P7 已完成;当前阶段 **P12**(server 自己开窗口上屏)审查后主机定向测试和真机七项复测已通过,FCL 与跨机 TCP 两项验收仍待完成(原先的跨机 hang 是主机 TUN 代理造成的,已排除,见 [五臂性能对比](notes/perf-five-arm-20260928/README.md))。每个阶段的计划、验收结果、实测与报告在 `notes/<阶段>/`(点阶段名进入)。 +> **2026-09-28**:P0 到 P7 已完成;当前阶段 **P12**(server 自己开窗口上屏)审查后主机定向测试和真机七项复测已通过,跨机 TCP 验收 B 已通过([记录](notes/p12/CROSSHOST-ACCEPTANCE.md)),FCL 同机验收 A 仍待完成。每个阶段的计划、验收结果、实测与报告在 `notes/<阶段>/`(点阶段名进入)。 ## 目标 @@ -32,7 +32,7 @@ client(跑应用的一方)与 server(跑驱动的一方)可以在**不 | [Ph](notes/p7/README.md) | server 能安全地接受外来连接:令牌、限额、坏数据不致崩溃 | 必需项 ✅(随 P7) | | [P3b / P4b](notes/p34b/README.md) | GLES 后端的深化与收尾 | 大部分 ✅,余项并行 | | [P7](notes/p7/README.md) | Vulkan 后端完整迁移;真机画面检查 36/36 通过 | ✅ 09-23 | -| [**P12**](notes/p12/README.md) | **server 自己开窗口上屏,client 不需要窗口** | **进行中**:审查后主机定向测试和真机七项复测通过;FCL / 跨机 TCP 验收待完成 | +| [**P12**](notes/p12/README.md) | **server 自己开窗口上屏,client 不需要窗口** | **进行中**:审查后主机定向测试和真机七项复测通过;验收 B(跨机 TCP)✅ 09-28;验收 A(FCL + 杀 server)待完成 | | [P8](notes/p8/README.md) | 把剩余的仿真路径挪到正确的一侧,补齐协议 | 待排 | | [P9](notes/p9/README.md) | 反向通道异步化(回读、写回不再同步等待) | 待排 | | [P10](notes/p10/README.md) | 同步对象、查询与帧节奏 | 待排 | diff --git a/docs/Disaggregated/notes/p12/CROSSHOST-ACCEPTANCE.md b/docs/Disaggregated/notes/p12/CROSSHOST-ACCEPTANCE.md new file mode 100644 index 00000000..e3a2a114 --- /dev/null +++ b/docs/Disaggregated/notes/p12/CROSSHOST-ACCEPTANCE.md @@ -0,0 +1,44 @@ +# P12 出口门 (b):另一台机器经 TCP 在 Redmi 入世界 + +> 2026-09-28。client = WSL 里的 `mobilegl_trace_replay`(Windows 主机上另一套系统),server = Redmi `2f7cbe2e`(Adreno 830)的 trace APK server(`930c29e9`,split 构建), +> 控制面 TCP + 数据面 stream,DirectGLES,run-ahead 开。链路:手机 Wi-Fi(5 GHz 11ax,RSSI −36)↔ 主机以太网,经 `192.168.31.1`。 +> 驱动 [`tools/device_bench/disagg/crosshost_accept.sh`](../../../../tools/device_bench/disagg/crosshost_accept.sh),汇总 `crosshost_report.py`,原始数据 `.trace-work/perf-compare/crosshost/`。 +> WSL 默认路由是主机 `xray_tun` 代理(会终结 TCP);脚本加临时 /32 路由绕开它,并先跑 `tcp_path_check.sh`(用完删路由、停 server)。 + +## 结论 + +**门 (b) 通过。** 另一台机器上的 client 经 TCP 重放 Minecraft 世界内 trace(rd12),画面与设备上一致;P6.5 必测数已记录。 +client 是 trace 重放器,不是活的 Minecraft 实例(那是门 (a) 的 FCL 那一半)。 + +| 检查 | 结果 | +|---|---| +| ssim(非 benchmark,重放到目标调用) | openra **1.000000**;rd12 **0.99988301**(与设备上四臂同值 0.999883) | +| rd12 benchmark,251/251 帧、rc=0 | 三次(PRESENT_CREDIT 1/2/3)全部跑完 | +| openra benchmark,128/128 帧、rc=0 | 三次全部跑完 | + +## 必测数 + +| 项 | openra | rd12 | +|---|---|---| +| 稳态 fps(第 2 帧起的帧时中位数),credit 1 / 2 / 3 | 133.5 / 114.3 / 104.6 | 16.9 / 21.3 / 22.1 | +| 首帧(加载帧)耗时 | 1.2–1.6 s | 51–53 s | +| 加载帧 stage 字节 | 247 MB(整段) | 2,698 MB | +| 稳态 stage 字节/帧(均值) | 1.81 MB | 1.52 MB | +| 稳态实测吞吐 | 26–38 MB/s | 20.6–24.3 MB/s | +| `wait_replies`(整段) | 1 | 324–350 | +| 回包 RTT 均值 / p50 上界 / p99 上界 | 4.1–6.8 ms / 8.2 ms / 8.2 ms | 15.7–17.3 ms / 4.1–8.2 ms / 131 ms | +| client 线程 CPU(整段) | 1.2–1.3 s | 6.2–7.2 s | + +- **加载帧受带宽约束,稳态不是。** server 侧实测:加载帧 2,696 MB 在 51 s 里读完(`P65ServerFrame`,**52.4 MB/s** 持续),稳态只有 20–24 MB/s,每帧平均 1.5 MB 的话带宽本可撑到 ~34 fps。 + 稳态帧时 ~90% 是 `transport_wait`(client 发送本身每帧 <0.5 ms,`credit_wait_ms=0`),所以剩下的是往返延迟而不是 present 信用。 +- **`PRESENT_CREDIT` 1 → 2:rd12 稳态 +26%(16.9 → 21.3);2 → 3 只再 +4%。** openra 上 credit 越大反而略低,落在噪声内(单次)。 +- Wi-Fi 往返 RTT(`ping`)3.3–61 ms(均值 19),4.6–110 ms(均值 30)两次测量;手机省电状态影响大,逐次差别很大。 +- 第一次直连跑同一 rd12 是 235 s(加载帧 220 s),本轮 70 s:同样的 2.7 GB,**Wi-Fi 吞吐在不同时刻差 4 倍**。以上数字是这一时刻的,不是上限。 +- `toybox nc` 汇点测得 18–22 MiB/s,**低估了链路**:同一时刻 server 自己读到 52 MB/s。`netbench.sh` 测的是 nc 汇点,不是 Wi-Fi 上限(见下)。 + +## 没做 + +- 门 (a):FCL 同机 spawn、双后端入世界、杀 server 报 device-lost。 +- 活的 Minecraft 在另一台机器上跑(这里是 trace 重放)。 +- loopback tcp 对 spawn 的逐线程 CPU 差(五臂对比给了 fps,没给逐线程 CPU)。 +- 每档只跑了一次,没有重复;credit 差别小于噪声的地方(openra)不下结论。 diff --git a/docs/Disaggregated/notes/p12/README.md b/docs/Disaggregated/notes/p12/README.md index d3f59c52..abf8f344 100644 --- a/docs/Disaggregated/notes/p12/README.md +++ b/docs/Disaggregated/notes/p12/README.md @@ -8,7 +8,7 @@ - 形状:server APK 自建 `ANativeWindow`(`MobileGLDisplayActivity` 的 SurfaceView,进程内 TCP server,会话串行)把渲染流**上屏**;离屏路径保留、同一时刻一条活跃;client 以 `WindowKind::ServerOwned`(控制修订 3)**完全无头**接入,几何由 server 回传;失窗 → `Fatal{ServerWindowLost}` → 干净 device-lost。 - 进展:15 个 `(P12)` 提交 + 审查轮修复(10 个问题,ID-P12-5..11)已并入 `feat/disaggregated`;主机门绿(ID-P12-14)、G1 成立(ID-P12-15);审查后在 `1fb18d9e` 上完成 P12 定向 CTest 46/46 和 Redmi 真机七项复测。当前分支 `0fe01588` 后续提交只改了文档、文档检查范围和基准脚本说明文字,未改 P12 实现。 - **2026-09-25 追加(会话交接 §4/§5.1)**:**device-lost 的 DECLINED 回复容忍**与**纹理上传的等待粒度**已落地,各有自己的 red-once 门(前者就是进世界后 `Fatal{ProtocolCorruption, "Fence.reply"}` 那条崩溃;后者让单条纯上传的回包等待 1 → 0)。真机端到端(进世界不崩、那一帧墙钟)与 G1 本机复核仍待做,见 [`DEVICELOST-AND-UPLOAD-WAITS.md`](DEVICELOST-AND-UPLOAD-WAITS.md)。 -- 未完成:出口门 (a) FCL 同机 spawn + 杀 server 的 device-lost、(b) 跨机 TCP 入世界 + P6.5 必测数;`CONTRACT-P12.md`;阶段表行里的其余条目(`unix:` 监听、DirectGLES 去全局、freezer、多 context、FCL 开关接线、D8 白名单)。 +- 出口门 (b) 已于 2026-09-28 通过([`CROSSHOST-ACCEPTANCE.md`](CROSSHOST-ACCEPTANCE.md))。未完成:出口门 (a) FCL 同机 spawn + 杀 server 的 device-lost;`CONTRACT-P12.md`;阶段表行里的其余条目(`unix:` 监听、DirectGLES 去全局、freezer、多 context、FCL 开关接线、D8 白名单)。 ## 阶段表行(原 `ROADMAP.md`) @@ -73,7 +73,7 @@ Android 上的 server 自建窗口(自己的 SurfaceView)把 IPC 渲染流** | 主机门 | ✅ unit 2605/2605,spawn / tcp 与三条 Magma 双进程车道全绿;剩余红全部归容器的 CMake/CTest 版本 | ID-P12-14 | | 真机七项检查(Redmi `2f7cbe2e`) | ✅ 审查轮之前(`29b7b284`)及审查后(`1fb18d9e`);审查后详细结果见上方复测补记 | PLAN-P12 §2、ID-P12-13 | | 出口门 (a) | ❌ FCL 同机 spawn、双后端入世界、**杀 server** 产生干净 device-lost(本轮的驱动是 trace_replay,device-lost 由按 HOME 触发) | PLAN-P12 §3 | -| 出口门 (b) | ❌ **另一台机器**的 client 经 TCP 在 Redmi 入世界,并记录 P6.5 必测数(本轮 client 是 `adb forward` 环路) | PLAN-P12 §3 | +| 出口门 (b) | ✅ 2026-09-28:WSL 里的 client 经 Wi-Fi TCP 重放 Minecraft 世界内 trace,rd12 ssim 0.999883、openra 1.0,251/251 与 128/128 帧,必测数已记录;client 是 trace 重放器,不是活的 Minecraft | [`CROSSHOST-ACCEPTANCE.md`](CROSSHOST-ACCEPTANCE.md) | ### 4. 在跑 @@ -81,7 +81,7 @@ Android 上的 server 自建窗口(自己的 SurfaceView)把 IPC 渲染流** ### 5. 下一步 -1. **出口门**:先 (b) 跨机 TCP 入世界 + P6.5 必测数,再 (a) FCL + 杀 server。 +1. **出口门**:(b) 已过([`CROSSHOST-ACCEPTANCE.md`](CROSSHOST-ACCEPTANCE.md));剩 (a) FCL + 杀 server。 2. **收尾**:写 `MG_Remote/CONTRACT-P12.md`;修 `notes/p12/gate.sh` 的 G1 符号比较(与基准不同源,会印出误导的 `added=N removed=N`);按惯例做一次收官审查。 3. **阶段表行里的余项**(交接时在树上核过,均未做):in-process server 的 `unix:` 监听、DirectGLES `g_Display` / `g_Surface` / `g_Context` 去全局、cached-app freezer、多 context、FCL env 与 plugin 开关表接线、D8 窗口种类白名单。 4. 其后按 [`ROADMAP.md`](../../ROADMAP.md):monolith 跑道 P8;IPC 跑道 P9 → P10 → P11;P6.5 残余(39 例 device 矩阵 + 必测数)与 P3b/P4b 余项并行;`CONTRACT-P7.md` §12 的记录债按阶段认领。 diff --git a/docs/Disaggregated/notes/perf-five-arm-20260928/README.md b/docs/Disaggregated/notes/perf-five-arm-20260928/README.md index bf43f75b..d3223d68 100644 --- a/docs/Disaggregated/notes/perf-five-arm-20260928/README.md +++ b/docs/Disaggregated/notes/perf-five-arm-20260928/README.md @@ -22,7 +22,7 @@ | spawn+shm | 178.3 | 5.61 | 5.26 | **快 36%**;与 inproc 打平(历史门 8 同结论) | | spawn+tcp localhost | 21.0–23.1 | 43.3–48.3 | 45–49 | **比 shm 慢 ~8 倍** | | spawn+tcp localhost + `SPIN_US=2000` | 63.6 | 15.7 | — | 单 knob A/B,**2.9×** | -| tcp over Wi-Fi(WSL → 手机,绕开 xray) | 17.4 | 57.4 | — | 单次;251/251 帧、rc=0;Wi-Fi RTT 4.6–110 ms(均值 30) | +| tcp over Wi-Fi(WSL → 手机,绕开 xray) | 稳态 16.9–22.1(credit 1–3) | — | 43.6–63.7 | 三次;251/251 帧;含 51–53 s 加载帧的整段均值 13.3–16.5;详见 [`p12/CROSSHOST-ACCEPTANCE.md`](../p12/CROSSHOST-ACCEPTANCE.md) | ### openra(轻负载,128 帧;28 draws/帧、199 记录/帧) @@ -33,7 +33,7 @@ | spawn+shm | 88.8 | 11.27 | −12%,纯跨进程固定成本 | | spawn+tcp localhost | 76.9 | 13.00 | −24% | | spawn+tcp 同机 wlan0 IP(Wi-Fi 替代拓扑,不过空口) | 74.2–76.3 | 13.1–13.5 | ≈ tcp localhost,符合预期 | -| tcp over Wi-Fi(WSL → 手机,绕开 xray) | 4.2 | 239.3 | 单次;128/128 帧;被 RTT × 同步点主导 | +| tcp over Wi-Fi(WSL → 手机,绕开 xray) | 稳态 104.6–133.5(credit 1–3) | 7.6–9.6(中位) | 三次;128/128 帧。早先记的 4.2 fps 是均值被首帧拉低的读法,不是稳态 | ## 结论 @@ -65,13 +65,12 @@ | seq 3 挂死 | 控制面帧重组 / 双 reader 竞态 | 主机 `xray_tun` 终结 TCP 后中继卡住 | 同一对二进制:经 xray 挂死 13/13,每次前送日志都停在同一字节(1093 B);绕开后 openra 与 rd12 都 rc=0 | | 「client 字节已被 ACK」 | 手机内核 ACK | xray 本地 ACK | client 侧 `ss` 的 RTT 0.07–0.3 ms、PMTU 9000;手机看到的对端是 `192.168.31.183` | | 「server 卡在 MakeCurrent」 | apply 线程卡死 | server 已空闲 | 手机本地 `mgl.server.log` 走完了整个 backend 初始化,只有**前送**的日志停在第 7 条扩展;控制 / 数据两个 socket 的收发队列都是 0 | - | Wi-Fi RTT | avg 0.78 ms | 4.6–110 ms(均值 30,省电模式) | 绕开 xray 后 `ping` 20 次 | - | Wi-Fi 吞吐 | 19–22 MiB/s | 14.3–19.9 MiB/s(3 次) | 绕开 xray 后 `nb.py` 128 MiB,链路 11ax 5.8 GHz 1441 Mbps | + | Wi-Fi RTT | avg 0.78 ms | 3.3–110 ms,两次均值 19 / 30 | 绕开 xray 后两次 `ping` | + | Wi-Fi 吞吐 | 19–22 MiB/s 是上限 | **`toybox nc` 汇点低估了**:同期 server 自己读到 52.4 MB/s 持续 51 s(2,696 MB);同一 rd12 加载帧第一次跑 235 s、之后 52 s,吞吐随时刻差 4 倍 | server 侧 `P65ServerFrame`;`nc` 18–22 MiB/s | - rd12 满速需要 ~49 MB/s。按中位 816 KB/帧算,**Wi-Fi 臂上限只有 ~18–26 fps**(原文的 40–45 算错了)。 - 实测 17.4 fps ≈ 14.2 MB/s,已经贴着带宽。 - openra 每帧都有同步点:239 ms/帧 ≈ 8 × 平均 RTT。 - 要提速,得减流量(压缩 / 去重)并加深 credit 来摊薄 RTT。 + **原来的两个 Wi-Fi 上限结论都撤回**:rd12 经 Wi-Fi 稳态 17–22 fps(每帧均值 1.5 MB、20–24 MB/s),低于实测 52 MB/s,所以稳态不是带宽约束,而是往返延迟; + openra 稳态 105–133 fps,并没有被 RTT 卡住。加载帧(2.7 GB)才是带宽约束。 + `PRESENT_CREDIT` 1 → 2 让 rd12 稳态 +26%,2 → 3 只再 +4%。 **P6.5(09-22)与 P12(09-26)里 WSL → 手机的链路数也都经过 xray**(`xray_tun` 自 09-21 起在线):通过 / 失败的结论不受影响,但其中的链路 RTT / 吞吐需要带这个前提来读。 ## 优化建议(按优先级)