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 白查了半天。
76 lines
3.7 KiB
Bash
76 lines
3.7 KiB
Bash
#!/bin/bash
|
||
# 1.8.2 最终验收(在设备上跑)
|
||
set -u
|
||
|
||
BASE=https://relay.xxmxxs.top
|
||
UA='LanRemote/1.8.2'
|
||
|
||
echo "════════ 1. 官网和三个成品(走公网,看缓存)════════"
|
||
for p in / /download/ykxmz-setup-1.8.2.exe /download/ykxmz-server-1.8.2.zip /download/ykxmz-watch-1.8.2.apk; do
|
||
hdr=$(curl -s -D - -o /dev/null --max-time 45 -H "User-Agent: $UA" "$BASE$p" 2>/dev/null | tr -d '\r')
|
||
code=$(echo "$hdr" | head -1 | awk '{print $2}')
|
||
len=$(echo "$hdr" | grep -i '^content-length' | awk '{print $2}')
|
||
cf=$(echo "$hdr" | grep -i '^cf-cache-status' | awk '{print $2}')
|
||
cc=$(echo "$hdr" | grep -i '^cache-control' | cut -d' ' -f2-)
|
||
printf " %-38s HTTP %-4s %10s cf=%-6s %s\n" "$p" "$code" "$len" "${cf:-无}" "${cc:-无}"
|
||
done
|
||
|
||
echo
|
||
echo "════════ 2. 对外清洁度(官网不能有管理页字眼)════════"
|
||
curl -s --max-time 30 -H "User-Agent: $UA" "$BASE/" -o /tmp/site.html
|
||
n=$(grep -cE 'zhongzhuanzhan|管理后台|管理页|管理入口|管理面板' /tmp/site.html || true)
|
||
echo " 官网里管理页字眼: $n 处(应为 0)"
|
||
echo " 官网大小: $(wc -c < /tmp/site.html) 字节"
|
||
echo " 下载按钮:"
|
||
grep -o 'href="/download/[^"]*"' /tmp/site.html | sort -u | sed 's/^/ /'
|
||
|
||
echo
|
||
echo "════════ 3. 管理页两个新功能 ════════"
|
||
if [ -f /root/taf.py ]; then
|
||
python3 /root/taf.py 2>&1 | tail -16 | sed 's/^/ /'
|
||
else
|
||
echo " (测试脚本不在设备上)"
|
||
fi
|
||
|
||
echo
|
||
echo "════════ 4. 中转核心功能(长轮询 + 注册)════════"
|
||
STAMP=$(date +%s)
|
||
DEV="acc-$STAMP"
|
||
CODE=$(printf "%06d" $(( STAMP % 1000000 )))
|
||
REG=$(curl -s --max-time 30 -X POST "$BASE/v1/agent/register" \
|
||
-H 'Content-Type: application/json' -H "User-Agent: $UA" \
|
||
-d "{\"deviceId\":\"$DEV\",\"code\":\"$CODE\",\"name\":\"验收\",\"version\":\"1.8.2\"}")
|
||
TOKEN=$(echo "$REG" | python3 -c "import sys,json; print(json.load(sys.stdin).get('token',''))" 2>/dev/null)
|
||
echo " 注册: $([ -n "$TOKEN" ] && echo 成功 || echo 失败)"
|
||
if [ -n "$TOKEN" ]; then
|
||
for i in 1 2; do
|
||
out=$(curl -s -o /dev/null -w '%{http_code} %{time_total}' --max-time 200 \
|
||
-X POST "$BASE/v1/agent/poll" -H "X-Token: $TOKEN" -H "User-Agent: $UA")
|
||
printf " 长轮询 %d: 码 %s 耗时 %.1fs(应约 61 秒)\n" \
|
||
"$i" "$(echo "$out" | awk '{print $1}')" "$(echo "$out" | awk '{print $2}')"
|
||
done
|
||
KEY=$(cat /root/lanremote-relay/data/admin_key.txt 2>/dev/null)
|
||
curl -s --max-time 20 -X POST "http://127.0.0.1:8080/v1/admin/delete" \
|
||
-H "X-Admin: $KEY" -H 'Content-Type: application/json' \
|
||
-d "{\"deviceId\":\"$DEV\"}" > /dev/null 2>&1
|
||
echo " 探针已清理"
|
||
fi
|
||
|
||
echo
|
||
echo "════════ 5. 公网可用率(20 次)════════"
|
||
ok=0
|
||
for i in $(seq 1 20); do
|
||
c=$(curl -s -o /dev/null -w '%{http_code}' --max-time 20 -H "User-Agent: $UA" "$BASE/v1/health")
|
||
[ "$c" = "200" ] && ok=$((ok + 1))
|
||
sleep 1
|
||
done
|
||
echo " 可用 $ok/20 = $((ok * 5))%"
|
||
|
||
echo
|
||
echo "════════ 6. 隧道和错误 ════════"
|
||
for s in lanremote-relay lanremote-tunnel lanremote-tunnel-h2; do
|
||
printf " %-24s %s\n" "$s" "$(systemctl is-active $s)"
|
||
done
|
||
echo " 中转错误行数(近 10 分钟): $(journalctl -u lanremote-relay --since '10 minutes ago' --no-pager 2>/dev/null | grep -icE 'traceback|nameerror|typeerror|AttributeError' || echo 0)"
|
||
echo " 连接数: 20241=$(curl -s --max-time 4 http://127.0.0.1:20241/metrics 2>/dev/null | grep '^cloudflared_tunnel_ha_connections' | awk '{print $2}') 20242=$(curl -s --max-time 4 http://127.0.0.1:20242/metrics 2>/dev/null | grep '^cloudflared_tunnel_ha_connections' | awk '{print $2}')"
|