#!/bin/bash # 清掉多余的 cloudflared,然后做真实负载测试看内存。 # # 之前反复重启测试留下了两个 cloudflared(各 30+MB), # 在 460MB 的机器上白占 33MB。 set -u echo "===== 1. 清掉多余的 cloudflared =====" COUNT=$(pgrep -c -f 'cloudflared tunnel' || echo 0) echo " 现在有 $COUNT 个" if [ "$COUNT" -gt 1 ]; then # 只留 systemd 管的那个(按 systemd 记录的主 PID 判断) MAIN=$(systemctl show lanremote-tunnel -p MainPID 2>/dev/null | cut -d= -f2) echo " systemd 管的是 PID $MAIN" for pid in $(pgrep -f 'cloudflared tunnel'); do if [ "$pid" != "$MAIN" ]; then echo " 杀掉多余的 PID $pid" kill "$pid" 2>/dev/null || true fi done sleep 3 echo " 清完剩 $(pgrep -c -f 'cloudflared tunnel' || echo 0) 个" else echo " 没有多余的" fi 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. 真实负载:模拟手表长时间长轮询 + 传输数据 =====" echo " 同时开 6 个长轮询请求(模拟多设备),持续 30 秒" BASE=http://127.0.0.1:8080 # 先造一个设备和会话,才能压到真实路径 CODE=$(curl -s --max-time 8 -X POST "$BASE/v1/agent/register" \ -H 'Content-Type: application/json' \ -d '{"deviceId":"load-test-device","code":"112233","name":"负载测试机","version":"1.4.0"}') TOKEN=$(echo "$CODE" | python3 -c 'import json,sys; print(json.load(sys.stdin).get("token",""))' 2>/dev/null) SESSION=$(curl -s --max-time 8 -X POST "$BASE/v1/client/attach" \ -H 'Content-Type: application/json' \ -d '{"code":"112233","name":"负载手表"}' \ | python3 -c 'import json,sys; print(json.load(sys.stdin).get("session",""))' 2>/dev/null) if [ -z "$TOKEN" ] || [ -z "$SESSION" ]; then echo " 没能造出测试会话(token=${TOKEN:0:8} session=${SESSION:0:8})" echo " —— 设备在线状态可能没到,跳过负载测试" else echo " 已造好设备和会话" # 后台开长轮询 PIDS="" for i in 1 2 3 4 5 6; do curl -s -o /dev/null --max-time 40 -X POST "$BASE/v1/client/poll" \ -H "X-Session: $SESSION" & PIDS="$PIDS $!" done # 再开几个被控端轮询 for i in 1 2; do curl -s -o /dev/null --max-time 40 -X POST "$BASE/v1/agent/poll" \ -H "X-Token: $TOKEN" & PIDS="$PIDS $!" done echo " 已挂起 8 个长轮询" # 同时推数据,看队列和内存 echo " 推 4MB 数据(模拟屏幕帧)…" for i in $(seq 1 16); do head -c 262144 /dev/zero | tr '\0' 'A' > /tmp/chunk.bin curl -s -o /dev/null --max-time 15 -X POST "$BASE/v1/agent/send" \ -H "X-Token: $TOKEN" --data-binary @/tmp/chunk.bin done rm -f /tmp/chunk.bin echo echo " 负载中的内存:" curl -s --max-time 8 "$BASE/v1/health" > /tmp/h_load.json 2>/dev/null python3 - <<'PY' import json try: d = json.load(open('/tmp/h_load.json')) except Exception: raise SystemExit print(f" Rss {d.get('memoryKB',0)} KB ({d.get('memoryKB',0)//1024} MB)") print(f" 累计请求 {d.get('totalRequests')}") for item in d.get('devices', []): print(f" 设备 {item.get('name')}: 待发手表 {item.get('queuedToClient')} 字节" f" / 待发电脑 {item.get('queuedToAgent')} 字节") PY # 收尾 for pid in $PIDS; do kill "$pid" 2>/dev/null || true; done wait 2>/dev/null || true echo echo " 收尾:清掉负载测试造的设备和会话" curl -s -o /dev/null --max-time 8 -X POST "$BASE/v1/admin/forget" \ -H 'X-Admin: 120830' -H 'Content-Type: application/json' \ -d '{"code":"112233"}' fi echo echo "===== 4. 压完之后的最终状态 =====" sleep 3 free -m | awk 'NR==2{printf " 系统: 已用 %s MB 可用 %s MB\n", $3, $7}' curl -s --max-time 8 "$BASE/v1/health" \ | python3 -c 'import json,sys; d=json.load(sys.stdin); print(f" relay: {d[\"memoryKB\"]} KB 设备 {len(d[\"devices\"])} 台")' 2>/dev/null echo df -h / | awk 'NR==2{printf " 磁盘: 可用 %s (%s)\n", $4, $5}'