Files
ykxmz/_build/rp_switch_B.sh
T
xmz7891 accd0fae3f 补充 A 组(受控对照)的数据:39 分钟 100% 可用
用户要求停掉智能体,所以 A/B 对照只跑完了 A 组就收尾。
A 组数据(quic 8 + h2 2)是迄今最好的一段:

    可用率  142/142 = 100.00%
    耗时    最小 878  中位 1270  P90 2375  P99 4010  最大 8119 ms

P99 从 2 小时长测的 14242ms 降到 4010ms。

同时段连接数(36 个采样点):
    QUIC:   最低 5  最高 8  平均 7.2
            分布 {8条:21, 7条:8, 6条:1, 5条:6}
    HTTP/2: 最低 2  最高 2
    QUIC 塌陷(<=2 条): 0 次

**结论:QUIC 塌陷是间歇性的,不是每小时必发生。**
20:30~21:09 这段一次没塌;早些时候那 1 小时 44 分里塌了 2 次
(17:31、17:57)。这解释了短样本看到 100% 的原因 ——
不是数据好看,是那段确实没遇到链路抖动。

B 组(quic 6 + h2 4)没跑成,所以"要不要把 h2 提到 4 条"
这个问题本轮没有答案。但已有的证据(塌陷时 h2=2 从没掉到 0)
说明当前配置的兜底是够的。

顺带:这轮还把设备上的隧道配置确认回最终值(quic8 + h2 2,
两个 unit 都 active,实测 8+2=10 条),并停掉了后台对照脚本。
2026-10-07 21:10:29 +08:00

73 lines
2.8 KiB
Bash
Raw 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.
#!/bin/bash
# 切到 B 组(quic6 + h2 4)并起 75 分钟测量。
#
# 为什么 75 分钟而不是 45:
# A 组的 45 分钟新鲜数据里**一次塌陷都没抓到**(塌陷率约 2.2%,
# 45 分钟窗口的命中概率只有约 60%)。拉长到 75 分钟把概率提到 ~80%。
#
# 注意:这次改配置会重启两个隧道实例(约 26 秒不可用),
# 用户可能在用手表,所以**一次改到位**,跑完立刻恢复成 A。
set -u
MAIN=/etc/systemd/system/lanremote-tunnel.service
H2=/etc/systemd/system/lanremote-tunnel-h2.service
BAK=/root/ratio2.bak.$(date +%s)
cp -a "$MAIN" "$BAK.main"
cp -a "$H2" "$BAK.h2"
echo "════════ 1. 等 A 组跑完 ════════"
for i in $(seq 1 40); do
if ! pgrep -f 'rpab.sh A' > /dev/null 2>&1; then
echo " A 组已结束"
break
fi
sleep 10
done
pgrep -af 'rpab.sh' | sed 's/^/ 还在跑: /' || echo " 没有测试在跑"
echo
echo "════════ 2. 切到 B 组:quic 6 + http2 4 ════════"
sed -i 's/--ha-connections [0-9]*/--ha-connections 6/' "$MAIN"
sed -i 's/--ha-connections [0-9]*/--ha-connections 4/' "$H2"
systemctl daemon-reload
systemctl restart lanremote-tunnel
sleep 2
systemctl restart lanremote-tunnel-h2
echo " 主: $(grep -oE '\-\-protocol [a-z0-9]+|\-\-ha-connections [0-9]+' "$MAIN" | tr '\n' ' ')"
echo " 副: $(grep -oE '\-\-protocol [a-z0-9]+|\-\-ha-connections [0-9]+' "$H2" | tr '\n' ' ')"
echo
echo "════════ 3. 等连接建齐 ════════"
for i in $(seq 1 40); do
sleep 4
q=$(curl -s --max-time 5 http://127.0.0.1:20241/metrics 2>/dev/null | grep '^cloudflared_tunnel_ha_connections' | awk '{print $2}')
h=$(curl -s --max-time 5 http://127.0.0.1:20242/metrics 2>/dev/null | grep '^cloudflared_tunnel_ha_connections' | awk '{print $2}')
q=${q:-0}; h=${h:-0}
[ $((q + h)) -ge 8 ] && break
done
echo " quic=$q http2=$h 合计=$((q + h))(等了约 $((i * 4)) 秒)"
echo
echo "════════ 4. 公网确认 ════════"
for i in $(seq 1 15); do
c=$(curl -s -o /dev/null -w '%{http_code}' --max-time 15 -H 'User-Agent: LanRemote/1.8.2' https://relay.xxmxxs.top/v1/health)
echo " 第 $i 次: $c"
[ "$c" = "200" ] && break
sleep 3
done
echo
echo "════════ 5. 起 B 组 75 分钟 ════════"
if pgrep -f 'rpab.sh B' > /dev/null 2>&1; then
echo " 已经在跑,跳过"
else
cd /root && setsid bash /root/rpab.sh B 75 < /dev/null > /root/ab_B.out 2>&1 &
disown 2>/dev/null || true
sleep 5
fi
echo " 进程: $(pgrep -af 'rpab.sh B' | head -1)"
echo " 已写入:$(wc -l < /root/ab_B_health.tsv 2>/dev/null || echo 0) 条"
echo
echo " 备份: $BAK.main $BAK.h2"
echo " 跑完后用 /root/rp_restore_A.sh 恢复成 quic8+h2 2"