mirror of
https://gitee.com/xmz7891/ykxmz.git
synced 2026-10-18 10:10:43 +00:00
这个基准一直是红的(中转那条路报「连接阶段失败: timed out」),
而且报告里写着"这是中转链路的产品 bug"。**查下来不是产品的问题。**
== bug 1:两条路用了同一个配对码 ==
基准为了排除互相干扰,给两条路**各起一台全新被控端**(设计是对的),
但两台都用了写死的 code="246813"。
中转有「一个配对码只属于一台设备」的规则:
第 1 台(跑局域网)注册成功
-> stop_agent 杀掉进程,但**中转还以为它在线**(last_seen 没过期)
第 2 台(跑中转)用同一个码注册 -> **被拒**
中转日志:配对码 246813 已被 ... 占用,拒绝 ...
而 start_agent 只检查"有没有设备在线" —— 第 1 台僵尸还挂着,
于是**以为新的一台登记成功了**
-> 没有任何进程在回包 -> 超时
对照实验(新增 _build/verify_code_reuse.py):
场景 A 同一个码 -> **不通**
场景 B 各用不同码 -> 通
修法:两条路各用不同码;start_agent 的判据从"有没有在线设备"
改成"有没有**配对码正好是这一台要用的码**的在线设备"。
== bug 2:attach 用的还是旧码(我第一版补丁也漏了这处)==
relay_connect() 里 `client.attach(code)` 用的还是局域网那个码 ——
attach 到一台已经死掉、但中转以为在线的设备上,pair 自然没人回。
修成 `attach(relay_code)`。
== 顺带更新一段过时注释 ==
原文写着「当前版本经中转只稳定支撑前 1~2 次交互……这是中转链路的
产品 bug」,并据此把中转的轮数调小、超时调短。
那个 bug **已经修好了**(根因:一条 HTTP/1.1 连接被长轮询和发命令
两个线程同时用,撞状态机抛 CannotSendRequest("Idle"),
异常冒到 _client_loop 外面把 client-relay 线程打死)。
注释不更新会误导后人以为产品还有这个问题。
== 修好之后的实测(本地中转,30 次/路)==
局域网 握手 16ms 成功 30/30 (100%) 中位 0ms P90 0ms 最大 1ms
中转 握手 46ms 成功 30/30 (100%) 中位 15ms P90 29ms 最大 32ms
这是本地中转,量的是**协议本身的开销**(长轮询往返 vs 直连 TCP);
真实跨网络那条腿的 1.0~1.5 秒来自隧道和 4G,是另一回事。
结论:局域网确实是"毫秒级、不耗流量"的那条根本路径 ——
中位 0ms vs 15ms,而且不走任何外网。
踩坑记录:这两处都是"看起来像产品 bug、实际是测试自己的 bug"。
先怀疑测量工具,比先怀疑产品更省时间 ——
上一次(管理页缓存头)也是我拿 curl -I 测 GET 白查了半天。
64 lines
1.9 KiB
Python
64 lines
1.9 KiB
Python
# -*- coding: utf-8 -*-
|
|
r'''在每个 7x 小节开头插一次 stub_ok 调用,用来定位桩是什么时候丢的。
|
|
|
|
为什么需要:
|
|
测试跑着跑着,$STUB 目录会整个消失,于是 deploy.sh 找不到
|
|
cloudflared 就去真的下载 GitHub —— 整个测试卡死十分钟,
|
|
而且所有断言都变成"没启用 / 退出码不对"这种指不到根因的假失败。
|
|
插桩是为了找出它到底在哪一步消失。
|
|
'''
|
|
from __future__ import annotations
|
|
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
SRC = Path(r"C:\Users\shu\Desktop\deepseekagent\LanRemote"
|
|
r"\_build\test_deploy_sh.sh")
|
|
|
|
MARKS = [
|
|
("7c. 默认", "7c"),
|
|
("7d. --protocol quic", "7d"),
|
|
("7e. --protocol http2", "7e"),
|
|
("7f. --protocol 的非法值", "7f"),
|
|
("7g. --port", "7g"),
|
|
("7b. 再跑一次", "7b"),
|
|
("12. 有凭据但没给域名", "12"),
|
|
]
|
|
|
|
|
|
def main() -> int:
|
|
text = SRC.read_text(encoding="utf-8")
|
|
if 'stub_ok "' in text:
|
|
print(" 已经插过了,不重复")
|
|
return 0
|
|
|
|
n = 0
|
|
for marker, tag in MARKS:
|
|
key = "echo \"── %s" % marker
|
|
i = text.find(key)
|
|
if i < 0:
|
|
print(" 找不到小节: %s" % marker)
|
|
continue
|
|
j = text.find("\n", i) + 1
|
|
text = text[:j] + 'stub_ok "%s"\n' % tag + text[j:]
|
|
n += 1
|
|
SRC.write_text(text, encoding="utf-8", newline="\n")
|
|
print(" 插了 %d 处" % n)
|
|
|
|
# 语法自检
|
|
import subprocess
|
|
r = subprocess.run([r"C:\Program Files\Git\bin\bash.exe", "-n",
|
|
str(SRC).replace("\\", "/")],
|
|
capture_output=True, text=True, encoding="utf-8",
|
|
errors="replace")
|
|
if r.returncode == 0:
|
|
print(" 语法 OK")
|
|
else:
|
|
print(" 语法错误: %s" % (r.stderr or "").strip()[:300])
|
|
return 1
|
|
return 0
|
|
|
|
|
|
if __name__ == "__main__":
|
|
sys.exit(main())
|