#!/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}'