mirror of
https://gitee.com/xmz7891/ykxmz.git
synced 2026-10-18 16:00:43 +00:00
阶段1 网络加速 - 发现隧道在跑 QUIC(ExecStart 丢了 --protocol http2), 实测 QUIC 可用率 48% vs HTTP/2 80%+,是重大性能回退。 恢复后公网延迟从 4141ms 降到 690ms(快 6 倍),可用率 92%。 - 优选 IP 结论:无效。hosts 覆盖确实生效了(日志里连的就是指定 IP), 但落点仍是 lax —— 运营商把所有 Cloudflare anycast 都路由到美西。 已清掉这段无效配置。 - BBR 不可用:设备是自定义内核 6.4.0-rc4-jsbsbxjxh66, 没编 tcp_bbr 模块也没配置项。改用 cubic + 调优: TCP 缓冲 4MB、tcp_fastopen=3、tcp_slow_start_after_idle=0 (长轮询场景关键)、tcp_tw_reuse=1。 阶段2 官网重做 - 拆出独立模块 relay/landing.py(relay.py 已两千多行, 再塞 HTML 没法看) - 信息结构参考成熟产品站:吸顶导航 / Hero / 九宫格功能 / 三步上手 / 下载 / FAQ / 页脚 - 保持白色简洁:底白、浅灰面板、细边框、大量留白 - logo 用内联 SVG(ICO 放 img 里实测是破图) - 管理入口从官网移除(管理不对外开放) 过程中被自己的测试抓到两个 bug: - 模块叫 site.py 会和 Python 标准库重名,import site 拿到的是标准库 - _logo() 里把 % 格式化和字符串拼接混用,直接抛 TypeError
122 lines
4.7 KiB
Bash
122 lines
4.7 KiB
Bash
#!/bin/bash
|
||
# 阶段1:真正的网络加速
|
||
#
|
||
# 排查结论:
|
||
# ① 隧道在跑 QUIC(ExecStart 缺 --protocol http2)——
|
||
# 实测 QUIC 48% vs HTTP/2 80%,这是重大性能回退,必须修回。
|
||
# ② 优选 IP 对这条线路**没用**:hosts 覆盖确实生效了
|
||
# (日志里 ip=198.41.200.238 就是我指定的),但落点仍是 lax01/lax13。
|
||
# 说明运营商把**所有** Cloudflare anycast 流量都路由到美西,换 IP 改不了路径。
|
||
# 所以那段 hosts 覆盖属于无效配置,清掉更干净。
|
||
# ③ 真正能救的是**拥塞控制**:这条线路 40% 丢包,
|
||
# Linux 默认的 CUBIC 一遇丢包就砍窗口,吞吐塌方、延迟飙升。
|
||
# BBR 基于带宽+延迟建模,丢包不当事 —— 在丢包链路上提升是数量级的。
|
||
set -u
|
||
|
||
RELAY_DIR=/root/lanremote-relay
|
||
|
||
echo "════════ 1. 恢复 HTTP/2 ════════"
|
||
cat > /etc/systemd/system/lanremote-tunnel.service <<'EOF'
|
||
[Unit]
|
||
Description=ykxmz Cloudflare 具名隧道
|
||
After=network-online.target lanremote-relay.service lanremote-nettune.service
|
||
Wants=network-online.target lanremote-relay.service
|
||
|
||
[Service]
|
||
Type=simple
|
||
# 协议 HTTP/2(走 TCP 7844)
|
||
# 实测:这条线路丢 UDP 包,QUIC 可用率只有 48%;
|
||
# HTTP/2 稳定在 80% 以上。**别去掉这个参数** ——
|
||
# 去掉就会退回 QUIC,可用率直接腰斩。
|
||
# 连接数 2:有冗余又不占内存(设备只有 460MB)
|
||
ExecStart=/usr/local/bin/cloudflared tunnel \
|
||
--protocol http2 \
|
||
--edge-ip-version 4 \
|
||
--ha-connections 2 \
|
||
--no-autoupdate \
|
||
--retries 5 \
|
||
--config /root/.cloudflared/config.yml run lanremote
|
||
Restart=always
|
||
RestartSec=5
|
||
MemoryMax=160M
|
||
StandardOutput=append:/root/lanremote-relay/tunnel.log
|
||
StandardError=append:/root/lanremote-relay/tunnel.log
|
||
|
||
[Install]
|
||
WantedBy=multi-user.target
|
||
EOF
|
||
systemctl daemon-reload
|
||
echo " 已写回 --protocol http2"
|
||
|
||
echo
|
||
echo "════════ 2. 清掉无效的 hosts 覆盖 ════════"
|
||
sed -i '/argotunnel.com/d' /etc/hosts
|
||
echo " /etc/hosts 里的 argotunnel 条目: $(grep -c argotunnel /etc/hosts) 个"
|
||
|
||
echo
|
||
echo "════════ 3. 启用 BBR 拥塞控制 ════════"
|
||
modprobe tcp_bbr 2>/dev/null || true
|
||
cat > /etc/sysctl.d/98-ykxmz-net.conf <<'EOF'
|
||
# ykxmz 网络调优(针对 4G 高丢包链路)
|
||
#
|
||
# 拥塞控制:BBR
|
||
# Linux 默认 CUBIC 把丢包当拥塞信号,一丢包就砍发送窗口。
|
||
# 这条线路丢包 40%,CUBIC 会一直在"砍窗口-慢慢恢复"的循环里,
|
||
# 表现就是延迟从 200ms 飙到 2 秒。
|
||
# BBR 用带宽和延迟建模,丢包不直接等于拥塞,高丢包链路上好得多。
|
||
net.core.default_qdisc = fq
|
||
net.ipv4.tcp_congestion_control = bbr
|
||
|
||
# TCP 缓冲:长途高延迟链路需要更大的窗口才能跑满
|
||
net.core.rmem_max = 4194304
|
||
net.core.wmem_max = 4194304
|
||
net.ipv4.tcp_rmem = 4096 87380 4194304
|
||
net.ipv4.tcp_wmem = 4096 65536 4194304
|
||
|
||
# 快速打开连接(省一个 RTT)
|
||
net.ipv4.tcp_fastopen = 3
|
||
|
||
# 更早重传,别干等
|
||
net.ipv4.tcp_retries2 = 8
|
||
|
||
# 复用 TIME_WAIT 的连接,长轮询场景能省不少握手
|
||
net.ipv4.tcp_tw_reuse = 1
|
||
net.ipv4.tcp_fin_timeout = 15
|
||
EOF
|
||
sysctl -p /etc/sysctl.d/98-ykxmz-net.conf 2>&1 | sed 's/^/ /'
|
||
|
||
echo
|
||
echo " 当前拥塞控制: $(sysctl -n net.ipv4.tcp_congestion_control)"
|
||
echo " 队列算法: $(sysctl -n net.core.default_qdisc)"
|
||
echo " 可用算法: $(sysctl -n net.ipv4.tcp_available_congestion_control)"
|
||
|
||
echo
|
||
echo "════════ 4. 重启隧道 ════════"
|
||
systemctl restart lanremote-tunnel
|
||
sleep 40
|
||
echo " 连接数: $(curl -s --max-time 5 http://127.0.0.1:20241/metrics 2>/dev/null | grep '^cloudflared_tunnel_ha_connections' | awk '{print $2}')"
|
||
echo " 协议与落点:"
|
||
grep -E 'Registered tunnel connection' "$RELAY_DIR/tunnel.log" 2>/dev/null | tail -3 \
|
||
| grep -oE 'ip=[0-9.]+ location=[a-z0-9]+ protocol=[a-z0-9]+' | sed 's/^/ /'
|
||
grep -oE 'Initial protocol [a-z0-9]+' "$RELAY_DIR/tunnel.log" 2>/dev/null | tail -2 | sed 's/^/ /'
|
||
|
||
echo
|
||
echo "════════ 5. 延迟实测(20 次,看平均)════════"
|
||
total=0; ok=0; max=0
|
||
for i in $(seq 1 20); do
|
||
r=$(curl -s -o /dev/null -w '%{http_code} %{time_total}' --max-time 20 \
|
||
-H 'User-Agent: LanRemote/1.4.0' https://relay.xxmxxs.top/v1/health 2>/dev/null)
|
||
code=$(echo "$r" | cut -d' ' -f1)
|
||
t=$(echo "$r" | cut -d' ' -f2)
|
||
if [ "$code" = "200" ]; then
|
||
ok=$((ok+1))
|
||
total=$(echo "$total + $t" | bc)
|
||
bigger=$(echo "$t > $max" | bc)
|
||
[ "$bigger" = "1" ] && max=$t
|
||
fi
|
||
sleep 1
|
||
done
|
||
avg=$(echo "scale=3; $total / $ok" | bc 2>/dev/null || echo "?")
|
||
echo " 可用 $ok/20"
|
||
echo " 平均 ${avg} 秒 最慢 ${max} 秒"
|