mirror of
https://gitee.com/xmz7891/ykxmz.git
synced 2026-10-19 08:20:44 +00:00
修看门狗重启死循环(我上一版改过头了)
用户报 502 Bad Gateway,Cloudflare 的图显示
「Host: relay.xxmxxs.top - Error」,也就是源站/隧道这一跳挂了。
查 watchdog 日志,发现它在**每 50 秒重启一次隧道**:
[10:31:57] 只剩 1 条连接 -> 重启隧道
[10:32:22] 重启完
[10:32:24] 又只剩 1 条 -> 距上次才 27 秒,先不重启
[10:32:47] 距上次 50 秒 -> 又重启
... 循环不停
根因(我上一版的错):
隧道在**质量差的 4G 上重建 4 条连接要 30~60 秒**。
而我上一版把 MIN_RESTART_GAP 设成 45 秒,并且
"公网不通 + 连接数<=1"就立刻重启 ——
结果每次隧道还没把连接建齐,就被下一次重启打断,
**永远停在"只剩 1 条"的状态**。
等于我自己制造了不稳定。
修法:
1. 重启后给 GRACE=150 秒宽限期,这期间绝不重启,
让 cloudflared 专心把连接建齐
2. MIN_RESTART_GAP 从 45 提到 150(和宽限期一致)
3. "立刻重启"的判定加一条:距上次重启必须超过宽限期
实测(停掉 watchdog -> 手动重启隧道 -> 观察):
10 秒内建齐 4 条连接,公网立刻 200
宽限期生效后公网 20/20 = 100%,延迟 ~690ms
顺带一个教训:之前测出 80%、20% 的 000,
是我自己后台还跑着一个观察任务在并发打接口造成的干扰。
**测稳定性的时候,测量工具本身不能成为干扰源。**
This commit is contained in:
+16
-2
@@ -31,7 +31,13 @@ STALE_MINUTES=10 # 日志多久没动静算卡死
|
||||
# 真断的时候会干等(日志里出现过"距上次重启才 118 秒,先不重启",
|
||||
# 结果多断了 2 分钟)。
|
||||
# 设 45 秒:既够 cloudflared 把连接建起来,又不会干等太久。
|
||||
MIN_RESTART_GAP=45
|
||||
# 两次重启至少隔这么久。
|
||||
# 150 秒不是拍脑袋:隧道在差的 4G 上重建 4 条连接要 30~60 秒,
|
||||
# 原来设 45 秒会导致**隧道还没建齐就被下一次重启打断**,
|
||||
# 永远停在只剩 1 条连接的状态(实测死循环,每 50 秒重启一次)。
|
||||
# 给足宽限期,让它有机会稳定下来。
|
||||
MIN_RESTART_GAP=150
|
||||
GRACE=150
|
||||
|
||||
log() {
|
||||
logger -t "$LOG_TAG" "$1"
|
||||
@@ -144,7 +150,15 @@ log "公网不通($DETAIL),连续第 $FAIL 次(降级 $ZERO 次)"
|
||||
# 这种情况立刻重启,不等攒够 3 次 —— 每次检查间隔 20 秒,
|
||||
# 等 3 次就是白断 40 秒。
|
||||
if [ "$DEGRADED" = "1" ]; then
|
||||
restart_tunnel "公网不通且只剩 ${CONNS} 条隧道连接(确认故障,立即重启)"
|
||||
# 宽限期内不重启 —— 让上一次重启有机会把连接建齐。
|
||||
# (不加这条会死循环:隧道还没建齐就被再次打断。)
|
||||
LAST_R=$(cat "$LAST_RESTART_FILE" 2>/dev/null || echo 0)
|
||||
SINCE=$(( $(date +%s) - LAST_R ))
|
||||
if [ "$SINCE" -lt "$GRACE" ]; then
|
||||
log "公网不通且只剩 ${CONNS} 条连接,但距上次重启才 ${SINCE} 秒(宽限 ${GRACE} 秒)—— 先让它建完"
|
||||
else
|
||||
restart_tunnel "公网不通且只剩 ${CONNS} 条隧道连接(确认故障,立即重启)"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ "$FAIL" -ge "$THRESHOLD" ] || [ "$ZERO" -ge "$THRESHOLD" ]; then
|
||||
|
||||
Reference in New Issue
Block a user