服务:mihomo的分组过多检测效果问题和相关性分析

🎯 问题

代理策略组一度膨胀到 10 个。每个策略组都要配一个「健康检查 URL」,而检测负载 = 组数 × 节点数 ÷ 检测间隔。于是三个问题同时冒出来:

  • 订阅流量被检测持续吃掉;
  • 高频检测可能触发机场侧防护;
  • 检测结果失真 —— 检测 URL 不代表它要服务的业务。

要回答的核心问题只有两个:组能收敛到几个?能不能用一个检测 URL 代表一类目标?

🧪 分析流程(五步)


flowchart LR
  A[第一步 定口径] --> B[第二步 审查检测URL有效性]
  B --> C[第三步 全节点并发批量采样]
  C --> D[第四步 相关性怎么算才对]
  D --> E[第五步 决策 哪些组可留]
  1. 定口径 —— 先把「什么叫成功、什么叫快」写成可复现的判据;
  2. 审查检测 URL —— 先确认候选 URL 真的代表业务,排除已知错误的 URL;
  3. 批量采样 —— 全节点 × 全候选 URL × 多轮,同一轮并发(保证「同一时刻」可比);
  4. 相关性判定 —— 先证伪错误统计量,再上正确口径;
  5. 决策 —— 按「能否复用同一个检测 URL」决定每个组的存废。

🔍 步骤一 / 二:测试口径 与 检测 URL 有效性审查

测试口径(可复现)

  • 「成功率」= 延迟 ≤ 阈值 的样本占比;
  • 「分位数」只对成功样本统计;
  • 检测目标一律写完整 URL,不写简称。

检测 URL 有效性怎么审

  • ① 查上游官方仓库自带配置里用的那个 URL —— 官方口径最稳(简单、稳定、无业务语义);
  • ② 检测 URL 必须指向「该组真正服务的那台主机」。用通用 CDN 目标会骗人:实测同一节点测某 CDN 只有几十毫秒,对真正要下载的主机却只有 20KB/s —— 换真实目标后该节点直接超时淘汰。

两条关键判据

  • 由 CDN 边缘应答的 URL 是假信号:它量的是「到最近边缘」,每个节点都近,系统性偏乐观,不代表到业务后端的路径;
  • 被针对性限速的 URL 成功率会显著偏低:同一批共享出口 IP 打某大厂目标时成功率仅三成上下,而它本身并不慢。

📊 步骤三:采样结果(聚合,不含节点明细)

口径:成功率 = 延迟 ≤ 800ms 占比;分位数仅统计 ≤800ms 的样本(单位 ms)。

检测目标成功率P20P50PmaxP20−P0
官方连通性检查 URL(小、稳、204)38%27738177264
大厂静态资源域名(同为该厂体系)45%26433879459
大厂主域名 generate_20435%28435273241
某 AI 对话站 cdn-cgi/trace0%————
某 AI 编码站 API0%————
包管理缓存主机小文件31%603659788178
代码托管站 robots.txt26%28733676540
镜像仓库 API2%6756797963

读数:

  • 全场景成功率都不高(2%~45%)—— 节点对这批目标普遍抖动大;
  • 两个 AI 站成功率 0%,原因是它们的延迟下限本身就 >1.1s / >1.4s(比其它目标高一个量级),不是「全节点不可用」;
  • 用阈值截断后再算分位数会压窄分布,所以 P20−P0 偏小。

📐 步骤四:相关性怎么算才对(三个错误做法的证伪 + 正确口径)

  1. ❌ 按值排序后取分位做相关 —— 排序摧毁配对,两条排序后的序列都单调递增 → 任意两目标 r≈1.0,数学必然的假相关,与业务无关。
  2. ❌ 原始「差值波动率」 —— Var(B−A) = σA² + σB² − 2r·σA·σB,它同时装了 r 和 σ 的比值。反例:B = 3A(真相关 1.0)差值波动最大;B = A + 小噪声(真相关 0.97)反而最小 → 会把「只是量程不同」误判成「不相关」。
  3. ✅ 正确做法 —— 配对轴必须落在同一个体上(每个节点 = 一个观测);统计量用秩相关并报 n 与置信区间,多重比较要校正;若偏爱「差值」视角,用标准化差值(除以合并 σ),其 RMS 与 r 一一对应。
  4. 前提:先测信度 —— 同一目标重复采样的 split-half 信度若很低,说明「单次延迟」不是节点的稳定属性,相关系数会被噪声衰减;此时 「≈0」既不能证明不相关、也没资格证明相关,必须先加密采样(每格 ≥10 次、跨 ≥2 时段)才有资格下结论。
检测目标对秩相关95%CIn
官方连通性 URL ↔ 某 AI 对话站−0.39[−0.65, −0.07]34
某 AI 编码站 ↔ 代码托管站−0.38[−0.64, −0.05]34

28 对里只有上表 2 对「裸显著」,多重比较校正后 0 对显著 ⇒ 没有任何目标对之间存在统计上站得住的相关(连「同属一家大厂」的两个目标也只有 0.12)。

🧭 步骤五:决策依据

项数据结论决策
任意两目标无显著相关一个检测 URL 代表不了另一目标按目标分组的思路成立,但不能指望「一个 URL 通吃」
官方连通性检查 URL小、稳、无业务语义,是公认基准采纳为通用基准
CDN 边缘应答的 URL假信号,不代表业务后端弃用
被针对性限速的 URL成功率仅三成,反映的是限速不是延迟弃用
两个 AI 站对节点不敏感(延迟下限本就 >1.1s)不单独建组,跟随通用出口组
三类下载目标互不相关、无共同规律统一用包缓存主机做检测
地域分组组也要设检测 URL,按地域切分无法复用域名专用组的检测结果删除,徒增检测负载

决策原则一句话:组的数量只由「有多少类目标需要各自的检测 URL」决定,不由「有多少种节点」决定。

🏗️ 最终结构与参数


flowchart TD
  SEL[节点选择 选择器 默认第一项] --> G[通用出口组 url-test 全节点 按延迟取快]
  SEL --> D[下载聚合组 load-balance 轮询 叠加带宽]
  SEL --> DIR[DIRECT]
组类型检测 URL 指向参数服务对象
节点选择select
(出口选择器)
—默认 = 第一项(通用出口组);备选 = 下载聚合组 / DIRECT所有流量的总闸
通用出口组url-test大厂主域名的 generate_204(真实目标,不是它的静态资源域名)tolerance 200(滞后阈值:新节点快 200ms 以上才换,防抖动反复切)
interval 120 / timeout 2000
该厂体系 / 两个 AI 站 / 一切未指定但需走代理的域名
下载聚合组load-balance
(round-robin)
包管理缓存主机上的小文件(几十字节,几乎零流量)无 tolerance(load-balance 无此参数);成员准入由检测 URL 决定
interval 120 / timeout 2000
包缓存 + 代码托管下载 CDN + 镜像仓库

配置原则(可复用):节点只在订阅 provider 定义一次,所有组一律 use: [订阅] + 关键字 filter / exclude-filter 动态匹配,不写死任何节点名;排除结构性坏节点(仅 v6、订阅到期信息行)。

📉 检测负载与流量(实测)

负载公式 = 组数 × 节点数 ÷ interval(另加 provider 级健康检查一份)。

  • 本设计检查频率 ≈ 44.8 次/分(通用出口组 16 + 下载聚合组 16 + provider 级 12.8);
  • 实测每次检查 ≈ 5.5 KiB(双向) —— 180s 空闲窗口实测 737.9 KiB / 134.4 次;
  • ⇒ ≈ 10.1 GiB/月(月流量套餐 100GB 量级 → 约占 10%)。

对比:收敛前的 10 组结构检查频率约为本设计的 6~7 倍(每组都要按分钟级间隔全节点轮检),仅检测一项就吃掉套餐的大半 —— 这是收敛的直接动因。

⚠️ 旧版笔记曾按「每次 ≈1.7 KiB」反推,本次直接实测为 5.5 KiB/次,旧值偏小约 3 倍(反推法的样本窗口过短),以实测为准。

⚠️ 边界与 caveat

  • 测量信度是天花板:单节点对某目标的延迟不稳定,相关系数被噪声衰减 → 本文的「无显著相关」只能说明现有采样精度下测不出相关,不能证明「本质不相关」。要谈相关须先加密采样(每格 ≥10 次、跨 ≥2 时段)。
  • 「成功率」按阈值定义;失败多为超时/偏慢,不完全等于「被墙」。
  • 用阈值截断后算分位数会压窄分布,P20−P0 偏小。
  • 地域封禁在 GET 状态码上不可见:同一 URL 从境内直连 vs 海外出口对照打,状态码完全一致 ⇒ 健康检查只能测网络可达 + 延迟,测不了业务可用性。
  • 统计量红线:不按值排序做相关(恒≈1.0 假相关)、不用原始差值波动率(被 σ 比值污染);必须用配对轴 = 个体 + 秩相关 + 置信区间。
  • tolerance 只对 url-test 生效;load-balance 无此参数。
  • 本文只讨论节点检测与分组的方法与决策,不含订阅采购/更换。