mirror of
https://gitee.com/xmz7891/ykxmz.git
synced 2026-10-18 14:50:45 +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:
@@ -0,0 +1,102 @@
|
||||
# -*- 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())
|
||||
Reference in New Issue
Block a user