#!/bin/bash # 查为什么轻负载 OK、密集请求就 502/530。 # # 现象: # 每 2 秒打一次健康检查 -> 15/15 全通 # e2e 测试(密集请求 + 长轮询 + 256KB)-> 全 502/530 # # 502 = Cloudflare 到不了源站;530 = 源站 DNS 错误。 # 但源站就是本机 127.0.0.1:8080 —— 那说明 cloudflared 自己的连接掉了。 set -u RELAY_DIR=/root/lanremote-relay URL=https://relay.xxmxxs.top echo "===== 1. 隧道当前状态 =====" echo " 服务: $(systemctl is-active lanremote-tunnel)" echo " 已注册连接: $(grep -c 'Registered tunnel connection' $RELAY_DIR/tunnel.log 2>/dev/null || echo 0)" echo " 连接断开: $(grep -c 'Connection terminated' $RELAY_DIR/tunnel.log 2>/dev/null || echo 0)" echo " quic 错误: $(grep -c 'Failed to dial a quic' $RELAY_DIR/tunnel.log 2>/dev/null || echo 0)" echo echo " 日志最近 6 行:" tail -6 "$RELAY_DIR/tunnel.log" 2>/dev/null | sed 's/^/ /' echo echo "===== 2. 轻负载(每 2 秒一次,10 次)=====" OK=0 for i in $(seq 1 10); do C=$(timeout 20 curl -4 -s -o /dev/null -w '%{http_code}' -H 'User-Agent: LanRemote/1.4.0' "$URL/v1/health" 2>/dev/null) [ "$C" = "200" ] && OK=$((OK+1)) printf " %2d: %s\n" "$i" "${C:-超时}" sleep 2 done echo " 轻负载 $OK/10" echo echo "===== 3. 密集负载(不间隔,20 次)=====" DOK=0 for i in $(seq 1 20); do C=$(timeout 20 curl -4 -s -o /dev/null -w '%{http_code}' -H 'User-Agent: LanRemote/1.4.0' "$URL/v1/health" 2>/dev/null) [ "$C" = "200" ] && DOK=$((DOK+1)) printf " %2d: %s\n" "$i" "${C:-超时}" done echo " 密集负载 $DOK/20" echo echo "===== 4. 大包(256KB 上传)=====" head -c 262144 /dev/zero | tr '\0' 'A' > /tmp/big.bin C=$(timeout 60 curl -4 -s -o /dev/null -w '%{http_code}' \ -H 'User-Agent: LanRemote/1.4.0' \ -X POST --data-binary @/tmp/big.bin "$URL/v1/admin/devices" 2>/dev/null) echo " 256KB POST: HTTP ${C:-超时}" rm -f /tmp/big.bin echo echo "===== 5. 大包之后隧道还活着吗 =====" echo " 已注册连接: $(grep -c 'Registered tunnel connection' $RELAY_DIR/tunnel.log 2>/dev/null || echo 0)" echo " 连接断开: $(grep -c 'Connection terminated' $RELAY_DIR/tunnel.log 2>/dev/null || echo 0)" echo echo " 日志最近 8 行:" tail -8 "$RELAY_DIR/tunnel.log" 2>/dev/null | sed 's/^/ /' echo echo "===== 6. 源站(本地)在同一时刻的表现 =====" LOK=0 for i in $(seq 1 20); do C=$(timeout 8 curl -s -o /dev/null -w '%{http_code}' http://127.0.0.1:8080/v1/health) [ "$C" = "200" ] && LOK=$((LOK+1)) done echo " 本地源站 $LOK/20" echo echo "===== 7. 结论 =====" echo " 轻负载 $OK/10 密集 $DOK/20 本地 $LOK/20" if [ "$LOK" -ge 19 ] && [ "$DOK" -lt 10 ]; then echo " -> 源站没问题,是**隧道在密集请求下扛不住**" echo " 这条 4G 线路的带宽/丢包撑不住高并发。" echo " 客户端本身的失败重试就是关键(被控端/手表都有)。" elif [ "$LOK" -lt 15 ]; then echo " -> 源站也有问题,去看 relay.log" fi