mirror of
https://gitee.com/xmz7891/ykxmz.git
synced 2026-10-18 12:30: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,
是我自己后台还跑着一个观察任务在并发打接口造成的干扰。
**测稳定性的时候,测量工具本身不能成为干扰源。**
103 lines
3.8 KiB
Python
103 lines
3.8 KiB
Python
# -*- coding: utf-8 -*-
|
||
r'''把 watchdog 的宽限期修复同步到仓库并提交。'''
|
||
from __future__ import annotations
|
||
|
||
import os
|
||
import subprocess
|
||
import sys
|
||
from pathlib import Path
|
||
|
||
ROOT = Path(r"C:\Users\shu\Desktop\deepseekagent\LanRemote")
|
||
GIT = r"C:\Program Files\Git\bin\git.exe"
|
||
WATCHDOG = ROOT / "relay" / "watchdog.sh"
|
||
sys.path.insert(0, str(ROOT / "_build"))
|
||
|
||
from devssh import run # noqa: E402
|
||
|
||
MSG = """修看门狗重启死循环(我上一版改过头了)
|
||
|
||
用户报 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,
|
||
是我自己后台还跑着一个观察任务在并发打接口造成的干扰。
|
||
**测稳定性的时候,测量工具本身不能成为干扰源。**
|
||
"""
|
||
|
||
|
||
def sync_watchdog() -> None:
|
||
"""把设备上改好的 watchdog.sh 拉回本地仓库。"""
|
||
_c, out, _e = run("cat /root/lanremote-relay/watchdog.sh", timeout=120)
|
||
if not out or "MIN_RESTART_GAP" not in out:
|
||
print(" [失败] 拉不到设备上的 watchdog")
|
||
return
|
||
if "GRACE" not in out:
|
||
print(" [警告] 设备上的版本没有 GRACE,先在本机补上")
|
||
|
||
WATCHDOG.write_text(out, encoding="utf-8", newline="\n")
|
||
print(" 已同步 watchdog.sh(%d 行)" % out.count("\n"))
|
||
|
||
print(" 关键参数:")
|
||
for line in out.splitlines():
|
||
if line.startswith(("MIN_RESTART_GAP", "GRACE", "THRESHOLD",
|
||
"STALE_MINUTES")):
|
||
print(" " + line.strip())
|
||
|
||
|
||
def commit() -> None:
|
||
print()
|
||
subprocess.run([GIT, "add", "-A"], cwd=str(ROOT), check=False)
|
||
msg_file = ROOT / "_build" / "_c13.txt"
|
||
msg_file.write_bytes(MSG.encode("utf-8"))
|
||
r = subprocess.run([GIT, "commit", "-q", "-F", str(msg_file)],
|
||
cwd=str(ROOT), capture_output=True, text=True,
|
||
encoding="utf-8", errors="replace")
|
||
msg_file.unlink(missing_ok=True)
|
||
print(" commit exit=%s" % r.returncode)
|
||
show = subprocess.run([GIT, "log", "--oneline", "-1"], cwd=str(ROOT),
|
||
capture_output=True, text=True, encoding="utf-8",
|
||
errors="replace")
|
||
print(" " + (show.stdout or "").strip())
|
||
env = dict(os.environ)
|
||
env["GIT_SSH_COMMAND"] = r'"C:\Program Files\Git\usr\bin\ssh.exe"'
|
||
push = subprocess.run([GIT, "push", "origin", "main"], cwd=str(ROOT),
|
||
capture_output=True, text=True, encoding="utf-8",
|
||
errors="replace", env=env)
|
||
for line in (push.stderr or push.stdout or "").strip().splitlines()[-2:]:
|
||
print(" " + line)
|
||
|
||
|
||
def main() -> int:
|
||
sync_watchdog()
|
||
commit()
|
||
return 0
|
||
|
||
|
||
if __name__ == "__main__":
|
||
sys.exit(main())
|