diff --git a/_build/_cmsg16.txt b/_build/_cmsg16.txt new file mode 100644 index 0000000..d8b2285 --- /dev/null +++ b/_build/_cmsg16.txt @@ -0,0 +1,27 @@ +补充 A 组(受控对照)的数据:39 分钟 100% 可用 + +用户要求停掉智能体,所以 A/B 对照只跑完了 A 组就收尾。 +A 组数据(quic 8 + h2 2)是迄今最好的一段: + + 可用率 142/142 = 100.00% + 耗时 最小 878 中位 1270 P90 2375 P99 4010 最大 8119 ms + +P99 从 2 小时长测的 14242ms 降到 4010ms。 + +同时段连接数(36 个采样点): + QUIC: 最低 5 最高 8 平均 7.2 + 分布 {8条:21, 7条:8, 6条:1, 5条:6} + HTTP/2: 最低 2 最高 2 + QUIC 塌陷(<=2 条): 0 次 + +**结论:QUIC 塌陷是间歇性的,不是每小时必发生。** +20:30~21:09 这段一次没塌;早些时候那 1 小时 44 分里塌了 2 次 +(17:31、17:57)。这解释了短样本看到 100% 的原因 —— +不是数据好看,是那段确实没遇到链路抖动。 + +B 组(quic 6 + h2 4)没跑成,所以"要不要把 h2 提到 4 条" +这个问题本轮没有答案。但已有的证据(塌陷时 h2=2 从没掉到 0) +说明当前配置的兜底是够的。 + +顺带:这轮还把设备上的隧道配置确认回最终值(quic8 + h2 2, +两个 unit 都 active,实测 8+2=10 条),并停掉了后台对照脚本。 diff --git a/_build/rp_restore_A.sh b/_build/rp_restore_A.sh new file mode 100644 index 0000000..ed6b36d --- /dev/null +++ b/_build/rp_restore_A.sh @@ -0,0 +1,45 @@ +#!/bin/bash +# 恢复成 A 组(quic 8 + http2 2)—— task-3 要求跑完保持现状 +set -u + +MAIN=/etc/systemd/system/lanremote-tunnel.service +H2=/etc/systemd/system/lanremote-tunnel-h2.service + +echo "════════ 恢复 quic 8 + http2 2 ════════" +sed -i 's/--ha-connections [0-9]*/--ha-connections 8/' "$MAIN" +sed -i 's/--ha-connections [0-9]*/--ha-connections 2/' "$H2" +systemctl daemon-reload +systemctl restart lanremote-tunnel +sleep 2 +systemctl restart lanremote-tunnel-h2 +echo " 主: $(grep -oE '\-\-protocol [a-z0-9]+|\-\-ha-connections [0-9]+|\-\-metrics [0-9.:]+' "$MAIN" | tr '\n' ' ')" +echo " 副: $(grep -oE '\-\-protocol [a-z0-9]+|\-\-ha-connections [0-9]+|\-\-metrics [0-9.:]+' "$H2" | tr '\n' ' ')" + +echo +echo "════════ 等连接建齐 ════════" +for i in $(seq 1 40); do + sleep 4 + q=$(curl -s --max-time 5 http://127.0.0.1:20241/metrics 2>/dev/null | grep '^cloudflared_tunnel_ha_connections' | awk '{print $2}') + h=$(curl -s --max-time 5 http://127.0.0.1:20242/metrics 2>/dev/null | grep '^cloudflared_tunnel_ha_connections' | awk '{print $2}') + q=${q:-0}; h=${h:-0} + [ $((q + h)) -ge 8 ] && break +done +echo " quic=$q http2=$h 合计=$((q + h))" + +echo +echo "════════ 公网确认 ════════" +for i in $(seq 1 15); do + c=$(curl -s -o /dev/null -w '%{http_code}' --max-time 15 -H 'User-Agent: LanRemote/1.8.2' https://relay.xxmxxs.top/v1/health) + echo " 第 $i 次: $c" + [ "$c" = "200" ] && break + sleep 3 +done + +echo +echo "════════ 其他配置复核 ════════" +echo " MTU: $(cat /sys/class/net/wlan0/mtu)" +iptables -t mangle -S OUTPUT 2>/dev/null | grep TCPMSS | sed 's/^/ /' +echo " watchdog: $(systemctl is-active lanremote-watchdog.timer) $(wc -l < /root/lanremote-relay/watchdog.sh) 行" +grep -E '^THRESHOLD' /root/lanremote-relay/watchdog.sh | sed 's/^/ /' +echo " relay 长轮询: $(grep -oE 'RELAY_POLL=[0-9]+' /etc/systemd/system/lanremote-relay.service 2>/dev/null)" +echo " relay 版本: $(curl -s --max-time 10 http://127.0.0.1:8080/v1/health | python3 -c 'import sys,json; print(json.load(sys.stdin).get("version"))' 2>/dev/null)" diff --git a/_build/rp_switch_B.sh b/_build/rp_switch_B.sh new file mode 100644 index 0000000..a4c7c90 --- /dev/null +++ b/_build/rp_switch_B.sh @@ -0,0 +1,72 @@ +#!/bin/bash +# 切到 B 组(quic6 + h2 4)并起 75 分钟测量。 +# +# 为什么 75 分钟而不是 45: +# A 组的 45 分钟新鲜数据里**一次塌陷都没抓到**(塌陷率约 2.2%, +# 45 分钟窗口的命中概率只有约 60%)。拉长到 75 分钟把概率提到 ~80%。 +# +# 注意:这次改配置会重启两个隧道实例(约 26 秒不可用), +# 用户可能在用手表,所以**一次改到位**,跑完立刻恢复成 A。 +set -u + +MAIN=/etc/systemd/system/lanremote-tunnel.service +H2=/etc/systemd/system/lanremote-tunnel-h2.service +BAK=/root/ratio2.bak.$(date +%s) +cp -a "$MAIN" "$BAK.main" +cp -a "$H2" "$BAK.h2" + +echo "════════ 1. 等 A 组跑完 ════════" +for i in $(seq 1 40); do + if ! pgrep -f 'rpab.sh A' > /dev/null 2>&1; then + echo " A 组已结束" + break + fi + sleep 10 +done +pgrep -af 'rpab.sh' | sed 's/^/ 还在跑: /' || echo " 没有测试在跑" + +echo +echo "════════ 2. 切到 B 组:quic 6 + http2 4 ════════" +sed -i 's/--ha-connections [0-9]*/--ha-connections 6/' "$MAIN" +sed -i 's/--ha-connections [0-9]*/--ha-connections 4/' "$H2" +systemctl daemon-reload +systemctl restart lanremote-tunnel +sleep 2 +systemctl restart lanremote-tunnel-h2 +echo " 主: $(grep -oE '\-\-protocol [a-z0-9]+|\-\-ha-connections [0-9]+' "$MAIN" | tr '\n' ' ')" +echo " 副: $(grep -oE '\-\-protocol [a-z0-9]+|\-\-ha-connections [0-9]+' "$H2" | tr '\n' ' ')" + +echo +echo "════════ 3. 等连接建齐 ════════" +for i in $(seq 1 40); do + sleep 4 + q=$(curl -s --max-time 5 http://127.0.0.1:20241/metrics 2>/dev/null | grep '^cloudflared_tunnel_ha_connections' | awk '{print $2}') + h=$(curl -s --max-time 5 http://127.0.0.1:20242/metrics 2>/dev/null | grep '^cloudflared_tunnel_ha_connections' | awk '{print $2}') + q=${q:-0}; h=${h:-0} + [ $((q + h)) -ge 8 ] && break +done +echo " quic=$q http2=$h 合计=$((q + h))(等了约 $((i * 4)) 秒)" + +echo +echo "════════ 4. 公网确认 ════════" +for i in $(seq 1 15); do + c=$(curl -s -o /dev/null -w '%{http_code}' --max-time 15 -H 'User-Agent: LanRemote/1.8.2' https://relay.xxmxxs.top/v1/health) + echo " 第 $i 次: $c" + [ "$c" = "200" ] && break + sleep 3 +done + +echo +echo "════════ 5. 起 B 组 75 分钟 ════════" +if pgrep -f 'rpab.sh B' > /dev/null 2>&1; then + echo " 已经在跑,跳过" +else + cd /root && setsid bash /root/rpab.sh B 75 < /dev/null > /root/ab_B.out 2>&1 & + disown 2>/dev/null || true + sleep 5 +fi +echo " 进程: $(pgrep -af 'rpab.sh B' | head -1)" +echo " 已写入:$(wc -l < /root/ab_B_health.tsv 2>/dev/null || echo 0) 条" +echo +echo " 备份: $BAK.main $BAK.h2" +echo " 跑完后用 /root/rp_restore_A.sh 恢复成 quic8+h2 2" diff --git a/_build/wrap_up.sh b/_build/wrap_up.sh new file mode 100644 index 0000000..906ad2f --- /dev/null +++ b/_build/wrap_up.sh @@ -0,0 +1,45 @@ +#!/bin/bash +# 收尾:停掉 A/B 对照脚本,确认隧道配置是最终值 +set -u + +echo " ── 1. 停掉对照脚本 ──" +pkill -f 'rpab.sh' 2>/dev/null && echo " 已停 rpab.sh" || echo " (本来就没在跑)" +pkill -f 'rp_long2h.sh' 2>/dev/null && echo " 已停 rp_long2h.sh" || echo " (本来就没在跑)" +sleep 1 +echo " 剩余相关进程: $(pgrep -cf 'rpab|rp_long2h' 2>/dev/null || echo 0)" + +echo +echo " ── 2. 确认隧道配置是最终采用的(quic8 + h2 2)──" +for s in lanremote-tunnel lanremote-tunnel-h2; do + cfg=$(grep -oE -- '--protocol [a-z0-9]+|--ha-connections [0-9]+' \ + "/etc/systemd/system/$s.service" 2>/dev/null | tr '\n' ' ') + printf " %-24s %-40s %s\n" "$s" "$cfg" "$(systemctl is-active $s)" +done +if grep -q 'ha-connections 4' /etc/systemd/system/lanremote-tunnel-h2.service 2>/dev/null; then + echo " ⚠ B 组配置还挂着(h2 4 条),改回 2 条" + sed -i 's/--ha-connections 4/--ha-connections 2/' /etc/systemd/system/lanremote-tunnel-h2.service + systemctl daemon-reload + systemctl restart lanremote-tunnel-h2 + sleep 6 + echo " 改完: $(grep -oE -- '--ha-connections [0-9]+' /etc/systemd/system/lanremote-tunnel-h2.service)" +else + echo " ✓ 已经是最终配置" +fi + +echo +echo " ── 3. 连上几条 ──" +for p in 20241 20242; do + n=$(curl -s --max-time 4 "http://127.0.0.1:$p/metrics" 2>/dev/null \ + | grep '^cloudflared_tunnel_ha_connections' | awk '{print $2}') + printf " 端口 %s -> %s 条\n" "$p" "${n:-读不到}" +done + +echo +echo " ── 4. 公网自检 ──" +curl -s --max-time 20 -o /dev/null -w ' HTTP %{http_code} %{time_total}s\n' \ + -H 'User-Agent: LanRemote/1.8.2' https://relay.xxmxxs.top/v1/health + +echo +echo " ── 5. 保留的数据文件(不删,以后还能看)──" +ls -la --time-style=+%H:%M /root/ab_A_health.tsv /root/ab_A_conns.tsv /root/ab_A_res.tsv 2>/dev/null | awk '{printf " %s %s %s\n", $7, $6, $5}' || echo " (没有)" +echo " A 组样本: $(wc -l < /root/ab_A_health.tsv 2>/dev/null || echo 0)" diff --git a/_tests/shots/3-自定义640x400.png b/_tests/shots/3-自定义640x400.png index 4e38939..3a527d4 100644 Binary files a/_tests/shots/3-自定义640x400.png and b/_tests/shots/3-自定义640x400.png differ diff --git a/docs/优化实测数据.md b/docs/优化实测数据.md index 56e08c5..9dcd751 100644 --- a/docs/优化实测数据.md +++ b/docs/优化实测数据.md @@ -115,7 +115,24 @@ QUIC 建连要 6+ 个包往返;TCP 的 SYN 只有 3 个包、内核还按 1s/2 | 时段 | 样本 | 可用率 | 中位 | P90 | P99 | |---|---|---|---|---|---| | 25 分钟(双协议初测) | 50 | **100%** | 1505 | 3218 | 14245 | -| **1 小时 44 分(2 小时长测)** | **361** | **98.61%** | **1280** | **2386** | **14242** | +| **39 分钟(受控 A 组:quic 8 + h2 2)** | **142** | **100.00%** | **1270** | **2375** | **4010** | +| 1 小时 44 分(2 小时长测) | 361 | **98.61%** | 1280 | 2386 | 14242 | + +**A 组那 39 分钟是迄今最好的一段**:142 次请求全 200, +P99 从上一次的 14242ms 降到 **4010ms**。 + +同时段的连接数(36 个采样点): + +``` +QUIC: 最低 5 最高 8 平均 7.2 分布 {8条:21, 7条:8, 6条:1, 5条:6} +HTTP/2: 最低 2 最高 2 +QUIC 塌陷(<=2 条): 0 次 +``` + +**也就是说:QUIC 塌陷是间歇性的,不是每小时必发生。** +20:30~21:09 这一段一次都没塌;而当天早些时候那 1 小时 44 分里塌了 2 次 +(17:31、17:57)。这解释了为什么短样本的可用率会看到 100% —— +不是"数据好看",是那一段确实没遇到链路抖动。 > 长测原定 2 小时,实际跑到 1 小时 44 分就停了 —— > 设备在 19:11 换了网段(`192.168.10.105` → `192.168.2.156`),