mirror of
https://gitee.com/xmz7891/ykxmz.git
synced 2026-10-18 23:00:44 +00:00
被控端 - 修复 MTU 问题:夹 MSS + 路径 MTU 探测(公网可用率 48% -> 100%) - 复用 HTTP 连接(免掉每次新建 TLS 的 30% 握手失败) - 每分钟回头找局域网,自动切回快 400 倍的路径 - 画面心跳帧:静止时省流量,客户端仍知道流是活的 - 锁屏时给出可操作的提示 手表端 - 内置 GTS Root R4 / GlobalSign Root CA,修 SSLHandshakeException - 连接错误翻译成人话(证书/时间/解析/超时分别提示) - 经中转连上后用服务器报的地址刷新已配对记录 - 新增局域网连接页面、服务器延迟检测 服务器端 - 支持 chunked 请求体(修每 16 秒一次的连接错乱与大面积 502) - 网络调优脚本 net-tune.sh(开机自动应用) - 管理页:批量删除、网络体检、下载区 - 隧道改 HTTP/2 + 双连接 文档 - 许可协议 / 安装前必读 / 安装后须知(作者:小麦子)
106 lines
3.4 KiB
Bash
106 lines
3.4 KiB
Bash
#!/bin/bash
|
||
# 中转服务器的内存 / 健壮性检查(这台机器只有 460MB)
|
||
#
|
||
# 查三件事:
|
||
# 1. 服务有没有自己崩过 / 重启过
|
||
# 2. 会话、队列涨起来之后内存会不会失控
|
||
# 3. 时间长了有没有泄漏(看两次采样的差值)
|
||
set -u
|
||
|
||
BASE=http://127.0.0.1:8080
|
||
|
||
echo "===== 1. 服务状态 ====="
|
||
for svc in lanremote-relay lanremote-tunnel; do
|
||
state=$(systemctl is-active "$svc" 2>/dev/null)
|
||
restarts=$(systemctl show "$svc" -p NRestarts 2>/dev/null | cut -d= -f2)
|
||
since=$(systemctl show "$svc" -p ActiveEnterTimestamp 2>/dev/null | cut -d= -f2)
|
||
printf " %-18s %-9s 重启 %s 次 自 %s\n" "$svc" "$state" "$restarts" "$since"
|
||
done
|
||
|
||
echo
|
||
echo "===== 2. 系统内存 ====="
|
||
free -m | awk 'NR==1{print " " $0} NR==2{printf " 总 %s MB 已用 %s MB 可用 %s MB\n", $2, $3, $7}'
|
||
|
||
echo
|
||
echo "===== 3. 各进程内存(前 8)====="
|
||
ps -eo rss,comm --sort=-rss 2>/dev/null | head -9 | tail -8 | \
|
||
while read -r rss comm; do
|
||
printf " %6s KB %s\n" "$rss" "$comm"
|
||
done
|
||
|
||
echo
|
||
echo "===== 4. 中转服务自报的内存 ====="
|
||
curl -s --max-time 8 "$BASE/v1/health" > /tmp/relay_health.json 2>/dev/null
|
||
if [ -s /tmp/relay_health.json ]; then
|
||
python3 - <<'PY'
|
||
import json
|
||
try:
|
||
d = json.load(open('/tmp/relay_health.json'))
|
||
except Exception as exc:
|
||
print(f" 解析失败: {exc}")
|
||
raise SystemExit
|
||
print(f" 版本 {d.get('version')}")
|
||
print(f" 已运行 {d.get('uptimeSeconds')} 秒")
|
||
print(f" 累计请求 {d.get('totalRequests')}")
|
||
print(f" 设备 {len(d.get('devices', []))} 台")
|
||
print(f" 会话 {d.get('sessions')}")
|
||
print(f" Rss {d.get('memoryKB', 0)} KB ({d.get('memoryKB', 0)//1024} MB)")
|
||
PY
|
||
else
|
||
echo " 健康检查没响应"
|
||
fi
|
||
|
||
echo
|
||
echo "===== 5. 内存稳定性:连续采样 10 次,每次隔 3 秒 ====="
|
||
echo " (如果一直涨,说明有泄漏)"
|
||
FIRST=""
|
||
LAST=""
|
||
for i in $(seq 1 10); do
|
||
# 打一批请求,模拟真实使用
|
||
for j in 1 2 3 4 5; do
|
||
curl -s -o /dev/null --max-time 5 "$BASE/v1/health" &
|
||
done
|
||
wait
|
||
RSS=$(curl -s --max-time 5 "$BASE/v1/health" \
|
||
| grep -oE '"memoryKB": *[0-9]+' | grep -oE '[0-9]+')
|
||
[ -z "$RSS" ] && RSS=0
|
||
if [ -z "$FIRST" ]; then FIRST=$RSS; fi
|
||
LAST=$RSS
|
||
printf " 第 %2d 次: %6s KB\n" "$i" "$RSS"
|
||
sleep 3
|
||
done
|
||
echo
|
||
echo " 第一次 $FIRST KB -> 最后一次 $LAST KB"
|
||
if [ "$FIRST" -gt 0 ]; then
|
||
DIFF=$((LAST - FIRST))
|
||
echo " 变化 ${DIFF} KB"
|
||
if [ "$DIFF" -gt 8000 ]; then
|
||
echo " ⚠ 涨了超过 8MB,可能有泄漏"
|
||
else
|
||
echo " ✓ 基本稳定"
|
||
fi
|
||
fi
|
||
|
||
echo
|
||
echo "===== 6. 队列上限保护(客户端不取数据时会丢最旧的,不涨内存)====="
|
||
echo " 队列上限设的是 2MB/设备(RELAY_QUEUE_BYTES)"
|
||
echo " 当前各设备队列:"
|
||
curl -s --max-time 8 "$BASE/v1/health" > /tmp/relay_health2.json 2>/dev/null
|
||
python3 - <<'PY'
|
||
import json
|
||
try:
|
||
d = json.load(open('/tmp/relay_health2.json'))
|
||
except Exception:
|
||
raise SystemExit
|
||
devices = d.get('devices', [])
|
||
if not devices:
|
||
print(" (还没有设备上线,队列都是空的)")
|
||
for item in devices:
|
||
print(f" {item.get('name')}: 待发手表 {item.get('queuedToClient')} 字节"
|
||
f" / 待发电脑 {item.get('queuedToAgent')} 字节")
|
||
PY
|
||
|
||
echo
|
||
echo "===== 7. 磁盘 ====="
|
||
df -h / | awk 'NR==2{printf " 总 %s 已用 %s 可用 %s (%s)\n", $2, $3, $4, $5}'
|