Files
ykxmz/_build/measure_segments.py
xmz7891 7b7830d8c5 阶段3+4+5:管理页白色化 + 局域网诊断 + 全量验收
阶段3 管理页
- 清掉全部深色主题残留(地址框 #0b1220、按钮悬停 #262c36、
  删除按钮 #2d1214 等 11 处),现在 0 处深色
- 接口全部正常:health / downloads / netcheck

阶段4 局域网诊断
- 查清楚"电脑不在同一网络"是怎么回事:被控端是**对的**
  (lan_ips() 报 ['192.168.2.64', '169.254.83.107'],真实地址排第一),
  是手表当时真不在 192.168.2.x —— 可能连了 5G 频段的另一个路由器,或开着移动数据
- 所以改了手表的提示:不再只说"不在同一网络",
  而是把**双方地址都打出来**,用户一眼能看出是网段不同还是连错 WiFi
- 端到端验证局域网路径:认证 1 ms,功能列表 207 项

阶段1 结论修正(一天内推翻自己两次,如实记录)
- 第一次判断"优选 IP 无用":错。半小时内确实能避开超时 IP
- 第二次固定优选 IP:也错。那些实测 138ms 的 IP 半小时后全不通了
  —— Cloudflare anycast 可达性随运营商路由变化,固定 IP 等于钉死到会失效的地址
- 最终:不固定,靠 GeoDNS + cloudflared 重试 + ha-connections 2 冗余
- 撤销后立即变好:连接稳定 2 条、超时告警 0 次、设备侧延迟 4.40s -> 1.66s
- **真正的瓶颈**:分段实测发现本机到 Cloudflare 的**裸 RTT 就 1439 ms**,
  比经隧道的请求(1215 ms)还慢。说明瓶颈是这条网络的 4G 上行本身,
  不是设备的隧道。公网侧已无优化空间。
- 局域网 118 ms vs 公网 1215 ms,快 10 倍 —— 这才是该走的路

阶段5 验收
- 全量回归 29 项全通过
- 设备侧验收 38 项全通过
- 成品:setup exe 14.37 MB / server zip / watch apk,已同步到设备下载区
2026-10-07 00:13:10 +08:00

83 lines
2.7 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# -*- coding: utf-8 -*-
r'''确认延迟瓶颈到底在哪一段。
对比三段:
1. 局域网直连(设备本机 -> relay 本机) 预期几十毫秒
2. 公网(本机 -> Cloudflare 边缘 -> 隧道 -> 设备)
3. 纯 Cloudflare 边缘 RTT(本机 -> 随便一个 CF 站点)
差值能告诉我们:
2 - 1 = 隧道 + 公网往返的开销
3 = 到边缘的裸 RTT
2 - 3 - 1 = 隧道那一段的开销(设备到边缘)
'''
from __future__ import annotations
import statistics
import sys
import time
import urllib.request
HEADERS = {"User-Agent": "LanRemote/1.4.0"}
def timed(url: str, rounds: int = 15) -> list:
out = []
for _ in range(rounds):
try:
start = time.perf_counter()
with urllib.request.urlopen(
urllib.request.Request(url, headers=HEADERS),
timeout=25) as resp:
resp.read()
if resp.status == 200:
out.append((time.perf_counter() - start) * 1000)
except Exception: # noqa: BLE001
pass
time.sleep(0.3)
return out
def show(label: str, values: list, rounds: int) -> float:
if not values:
print(" %-24s 全失败" % label)
return float("nan")
med = statistics.median(values)
print(" %-24s 可用 %2d/%d 中位 %7.0f ms 最快 %7.0f ms"
% (label, len(values), rounds, med, min(values)))
return med
def main() -> int:
print(" 分段测延迟(各 15 次取中位数)")
print()
lan = show("1. 局域网直连", timed("http://192.168.2.156:8080/v1/health"), 15)
pub = show("2. 公网(经隧道)",
timed("https://relay.xxmxxs.top/v1/health"), 15)
edge = show("3. Cloudflare 边缘裸 RTT",
timed("https://cloudflare.com/cdn-cgi/trace"), 15)
print()
print(" 分析:")
if lan == lan and pub == pub:
print(" 局域网 %.0f ms -> 公网 %.0f ms" % (lan, pub))
print(" 公网比局域网多 %.0f ms" % (pub - lan))
if edge == edge and pub == pub:
print()
print(" 到 Cloudflare 边缘的裸 RTT: %.0f ms" % edge)
print(" 公网请求 %.0f ms,其中边缘往返占 %.0f ms(%.0f%%)"
% (pub, edge, edge / pub * 100))
print(" 剩下的 %.0f ms 是:边缘 -> 设备(隧道)那一段 + 服务端处理"
% (pub - edge))
print()
print(" 结论:")
print(" 如果「边缘 -> 设备」那段占比大,说明瓶颈在设备的 4G 上行链路,")
print(" Cloudflare 这一侧没得优化了 —— 只能靠换网络或换中转位置。")
return 0
if __name__ == "__main__":
sys.exit(main())