背景与目标
- arm 侧 tailscale 由 L3(容器层/用户态)切换为 L1(宿主层 host 网络 + 内核 tun),直连打洞成功(经 v100 公网 IP 直接建链,非 DERP 中继)。
- 本次验证 L1 修好后,arm 上 grafana 反代走哪条链路:A 路 frps 隧道 vs B 路 tailscale 直连。
- 测试时间:2026-11-04 19:28~19:38(北京时间),测试位均在 arm 侧 ghost_net 网段内(与 nginx 容器同网命名空间)。
两条链路拓扑
A 路 frps 隧道(生产反代现行方案)
=================
[arm::nginx/ghost_net 容器]
| http://frps:8080/login + Host: v100grafana.atibm.com(同机 LAN,conn~0.001s)
v
[arm::frps 服务端:172.18.0.x]
| v100 主动拨入的长连接隧道(多路复用,建连成本已摊掉)
v
[v100::grafana-frpc 客户端 -> 127.0.0.1:3000 grafana]
| 响应原路返回
B 路 tailscale 直连(L1 修好后新选项)
=================
[arm::nginx/ghost_net 容器]
| http://100.74.6.116:3001/login(经宿主 tailscale0 策略路由表 52)
v
[arm 宿主 tailscale0 -WireGuard-> v100 公网 IP:41641 直连(RTT~0.5s)]
| 每个请求一次跨国 TCP 握手(conn~0.4s ≈ 1 RTT)
v
[v100::grafana 容器 3001->3000]
测试方法
- 负载档位(均为 v100 grafana 真实资源):S = /login 62,472B;M = app 主包 JS 774,099B;L = 大 JS 包 5,109,647B。
- 第一阶段快速摸底:S 档 A/B 各 5 次(curl 容器,-w 输出 conn/ttfb/total/speed)。
- 第二阶段 10 分钟压测:常驻 alpine 容器(ghost_net,curl),S/M 交错循环 6 分钟 + L 档 A/B 各 3 次,共 142 样本。
- 记录字段:ts,path,asset,code,conn,ttfb,total,speed,size;142/142 返回 200,零失败。
- 原始 CSV:arm 机 /www/tailscale/load-20261104.csv;台账:docker 工作区 ops/2026-11-04-grafana-links-perf.md。
第一阶段:S 档快速 5 次
| # | A 路 total / TTFB / 速率 | B 路 total / TTFB / 速率 |
|---|
| 探针 | 200,1.19s | 200,4.51s(含 WG 会话建立,仅首次) |
| 1~5 total | 0.33 / 0.38 / 0.33 / 0.44 / 1.43s(第 5 次毛刺) | 1.52 / 1.61 / 1.50 / 1.66 / 1.50s(极稳) |
| TTFB | ≈total(0.33~1.43s) | 0.74~0.80s |
| 速率 | 44~187KB/s | ~38~41KB/s |
第二阶段:10 分钟压测全量统计
| 组 | n | conn p50 | TTFB p50 / p95 | total p50 / p95 / mean | 速率 p50 |
|---|
| A-S login 62KB | 34 | 0.001s | 0.406 / 1.022s | 0.407 / 1.022 / 0.498s | ~150KB/s |
| B-S login 62KB | 34 | 0.400s | 0.814 / 1.634s | 1.631 / 2.659 / 1.794s | ~38KB/s |
| A-M app.js 774KB | 34 | 0.001s | 1.163 / 2.033s | 1.165 / 2.035 / 1.262s | ~665KB/s |
| B-M app.js 774KB | 34 | 0.410s | 0.821 / 1.776s | 7.354 / 10.173 / 7.137s | ~107KB/s |
| A-L big.js 5.1MB | 3 | 0.001s | 1.234 / -s | 3.331 / - / 3.540s(max 4.527s) | ~1.5MB/s |
| B-L big.js 5.1MB | 3 | 0.350s | 0.746 / -s | 39.231 / - / 40.980s(max 45.524s) | ~130KB/s |
注:L 档 n=3 不计 p95。B-S total max 3.057s,B-M total max 15.903s;A 全程 max 2.547s(M 档)。
细粒度发现
- R01:包越大倍差越大 —— S 档 4 倍(0.41s vs 1.63s),M 档 6.3 倍(1.17s vs 7.35s),L 档约 11 倍(3.3s vs 39s)。
- R02:B 速率封顶 —— S/M/L 三档速率 38/107/130KB/s,基本与包大小无关,是单流 TCP 被 0.5s 跨国 RTT 卡住拥塞窗口的表现。
- R03:A 随包增大提速 —— 150KB/s → 665KB/s → 1.5MB/s,frp 隧道多路复用在大传输上优势放大。
- R04:B 赢在首字节稳 —— B 的 TTFB 全档 ~0.7~0.9s 方差极小(就是纯 RTT);A 的 TTFB 随包增大(S 0.41s → M 1.16s → L 1.2~2.2s),但传输段 A 碾压,总量 B 无机会。
- R05:建连成本不对称 —— A 建连 ~0.001s(同机 frps);B 每个请求 ~0.35~0.47s(一次跨国 TCP 握手,不可复用)。
- R06:毛刺与漂移 —— A 有单次 1.4s 级毛刺(frp 侧抖动,p95 被拉起);B 连续 10 分钟无毛刺但后段轻微走慢(B-S 后 5 均值 2.00s vs 前 5 均值 1.62s,样本少仅记录)。
- R07:冷启动代价 —— B 首包 4.5s(含 WG 会话建立),稳定后进入上表区间;长连复用场景可忽略,低频调用需计入。
结论与选型
- 生产反代继续走 A 路 frps —— M 档(真实看板主包)1.17s 可用 vs 7.35s 不可用,L 档 3.3s vs 39s 是可用与不可用的分界。
- B 路 tailscale 定位:管理/SSH/备用链路,以及小包 API 调用(S 档 1.6s 可接受);大面板 bundle 不可走 B 路。
- ACL 侧约束 3(tag:vps → tag:local)已放行 3001,链路政策无障碍