mihomo icon indicating copy to clipboard operation
mihomo copied to clipboard

[Bug] 关于`health-check`的问题

Open F1Y2M0N opened this issue 1 year ago • 7 comments

Verify steps

  • [X] 我已经阅读了 文档,了解所有我编写的配置文件项的含义,而不是大量堆砌看似有用的选项或默认值。
  • [ ] 我未仔细看过 文档 并解决问题
  • [ ] 我未在 Issue Tracker 中寻找过我要提出的问题
  • [X] 我已经使用最新的 Alpha 分支版本测试过,问题依旧存在
  • [X] 我提供了可以在本地重现该问题的服务器、客户端配置文件与流程,而不是一个脱敏的复杂客户端配置文件。
  • [X] 我提供了可用于重现我报告的错误的最简配置,而不是依赖远程服务器、TUN、图形界面客户端或者其他闭源软件。
  • [X] 我提供了完整的配置文件与日志,而不是出于对自身智力的自信而仅提供了部分认为有用的部分。

操作系统

MacOS, Windows, Linux, Android

系统版本

openwrt23 windows11 ubuntu24 android14 macos14

Mihomo 版本

版本太多了,已经用了两年了,有问题一直存在 可以保证使用的版本是新于等于Release中的v1.xx.x版本 每个正式Release保证更新,有时会更新Prerelease-Alpha 比如现在用的是 846bdfa

配置文件

0: &0 {interval: 256, lazy: true, tolerance: 128}
1: &1 {health-check: {<<: *0, enable: false}, interval: 65536, type: http}
proxy-providers:
 z: {<<: *1, url: }
proxy-groups:
- {<<: *0, name: 手, type: select, include-all: true}
- {<<: *0, name: 代, type: select, proxies: [F1]}
- {<<: *0, name: F1, type: fallback, proxies: [手, F2]}
- {<<: *0, name: F2, type: fallback, proxies: [手, F3], url: 'https://www.msftconnecttest.com/connecttest.txt'}
- {<<: *0, name: F3, type: fallback, proxies: [手, U1, U2, U3, DIRECT], url: 'https://www.apple.com/library/test/success.html'}
- {<<: *0, name: U1, type: url-test, include-all: true, filter: 地区1}
- {<<: *0, name: U2, type: url-test, include-all: true, filter: 地区2}
- {<<: *0, name: U3, type: url-test, include-all: true, filter: 地区3}
rules:
- MATCH,代

描述

确定是内核问题,非拉起内核的客户端的问题 所有问题只使用proxy-providers未在运行配置内手动填写proxies,运行配置内含proxies:或影响复现


问题一 当 mihomo 的lazy: true生效后,再稳定运行超过三天,url-test就会失效 此时即使所有组中已被选中的节点失效alive: false, delay: 65535 msfallback划到DIRECT1小时也不会激活url-testhealth-check去选择一个未失效的节点 该问题是先在openwrt中发现的,然后经windows、ubuntu和mac复核


问题二(有可能需要结合问题一) 多个自动组套用时,节点的max-failed-times切换会异常 我在interval: 99999的情况下尝试max-failed-times: 1,结果max-failed-times失效,仍需要等interval: 99999去切换节点更不要说默认的max-failed-times: 5


问题三(这个问题是这两年一直存在的) 当proxy-providershealth-check: {enable: false}url-test的节点只会选择第一个,无论该节点是否可用延迟如何 只能靠health-check: {enable: true}来解决,所以会带来 1filter只筛选了四个地区不到二十个节点,但完整的proxy-provider有三个订阅超过二百个节点,所以有些浪费资源 2我直接引用其他人发的吧

由于不同网站的对节点的不同需要,我设置了 7 个 url-test 的代理组,间隔在一到两分钟,然后我发现它们会消耗大约每小时 60-80m 的流量,一个月下来约 50-60GB,是一个巨量的损耗 https://github.com/vernesong/OpenClash/issues/3878

我也有类似情况,测试问题一时发现的,确定是health-check导致的,但没如此严重

重现方式

描述

日志

No response

F1Y2M0N avatar May 29 '24 10:05 F1Y2M0N

1,lazy为true时,被选择才会进行检测 2,同1 3,属于provider的节点只会被provider hc,不会被groups hc

xishang0128 avatar Jun 01 '24 20:06 xishang0128

首先感谢开发者回复 不过还是有问题存在,见谅


1,lazy为true时,被选择才会进行检测 2,同1

我的配置文件再写明白点就等于如下内容

- {name: fallback1, proxies: [select, fallback2]}
- {name: fallback2, proxies: [select, url-test1, url-test2, url-test3, DIRECT]}

同样有lazy: truefallback1能被激活去选择fallback2fallback2能被激活去选择DIRECT,可中间的3个url-test却无法被激活

max-failed-time是被自动组fallback选中的,没有激活

另外,我上文写的是稳定运行超过三天,但实际一天左右也会出现该情况,不过大概率被“救回来”,即fallback选择到DIRECT后能激活max-failed-time进行hc,或是经过几轮interval激活url-test去选择一个能连通的节点,之后fallback会切回到url-test上 一天亦足够lazy: true完全生效,能被“救回来”。而三天就不行fallback划到DIRECT1小时,url-test也没有恢复正常工作


3,属于provider的节点只会被provider hc,不会被groups hc

该问题看来是属于特意设计的,那就算了。虽然有点不理解。

我这边的情况是节点hc大概130个后的延迟数据就会变的极度不稳定,浮动能达到500ms。调整节点顺序后后测的同样会波动,未达到设备瓶颈,机场也不清楚。加上我本身用到的节点也不多,所以现在把无需自动hc的节点限制了

proxy-providers:
 z1: {url: xxx, health-check: {enable: true }, filter: "地区1|地区2|地区3..."}
 z2: {url: xxx, health-check: {enable: false}, exclude-filter: "地区1|地区2|地区3..."}

F1Y2M0N avatar Jun 02 '24 23:06 F1Y2M0N

首先感谢开发者回复 不过还是有问题存在,见谅

1,lazy为true时,被选择才会进行检测 2,同1

我的配置文件再写明白点就等于如下内容

- {name: fallback1, proxies: [select, fallback2]}
- {name: fallback2, proxies: [select, url-test1, url-test2, url-test3, DIRECT]}

同样有lazy: truefallback1能被激活去选择fallback2fallback2能被激活去选择DIRECT,可中间的3个url-test却无法被激活

max-failed-time是被自动组fallback选中的,没有激活

另外,我上文写的是稳定运行超过三天,但实际一天左右也会出现该情况,不过大概率被“救回来”,即fallback选择到DIRECT后能激活max-failed-time进行hc,或是经过几轮interval激活url-test去选择一个能连通的节点,之后fallback会切回到url-test上 一天亦足够lazy: true完全生效,能被“救回来”。而三天就不行fallback划到DIRECT1小时,url-test也没有恢复正常工作

3,属于provider的节点只会被provider hc,不会被groups hc

该问题看来是属于特意设计的,那就算了。虽然有点不理解。

我这边的情况是节点hc大概130个后的延迟数据就会变的极度不稳定,浮动能达到500ms。调整节点顺序后后测的同样会波动,未达到设备瓶颈,机场也不清楚。加上我本身用到的节点也不多,所以现在把无需自动hc的节点限制了

proxy-providers:
 z1: {url: xxx, health-check: {enable: true }, filter: "地区1|地区2|地区3..."}
 z2: {url: xxx, health-check: {enable: false}, exclude-filter: "地区1|地区2|地区3..."}

lazy: false请,没写lazy就是true,没被选择就不会hc

xishang0128 avatar Jun 04 '24 05:06 xishang0128

lazy: false请,没写lazy就是true,没被选择就不会hc

不好意思,是我的错,没让你理解 麻烦简单直接的为我说明下 简单列了以下5个,最终选择的测试节点都是由url-test决定的 在确定lazy: true已经激活后,手动让测试节点出现故障无法连通,访问google以启用对应的节点链,哪一个或几个url-test可以在测试节点出现故障时激活hc并更换为一个未故障的节点 也就是说哪一个或几个是你所说的被选择状态 DOMAIN-SUFFIX,google.comselecturl-test→测试节点 DOMAIN-SUFFIX,google.comfallbackurl-test→测试节点 DOMAIN-SUFFIX,google.comselectfallbackselecturl-test→测试节点 DOMAIN-SUFFIX,google.comselectfallbackselectfallbackurl-test→测试节点 DOMAIN-SUFFIX,google.comselectfallbackfallbackfallbackurl-test→测试节点

希望能看完上方内容并做出选择后再展开

我提供配置文件的测试结果可以说明第五个不是 第三、四个在不操作第二个select的时候也是有问题的 第二个会莫名其妙的触发max-failed-time,以致不是在hc,就是在准备hc的路上 所以这是自动组嵌套的问题还是特意设计的 另外再说声不好意思,因为个人原因,至少三个月无法登github,所以该issue可以被关闭或删除

感谢你的回复 谢谢

F1Y2M0N avatar Jun 06 '24 00:06 F1Y2M0N

@xishang0128 请问,如果我把provider的hc给关了,group hc会生效么

LittleRey avatar Jan 23 '25 11:01 LittleRey

@LittleRey 不会

xishang0128 avatar Jan 23 '25 11:01 xishang0128

@LittleRey 不会

proxy-group 不会主动检测 proxy-provider 提供的节点,而是依赖 proxy-provider 的健康检查结果,但是这样设计岂不是url-test直接这个group直接成了摆设了么,url-test根本没法进行自动选择

现在我想要url-test进行自动选择,应该怎么做 @xishang0128

LittleRey avatar Jan 23 '25 13:01 LittleRey

lazy: false请,没写lazy就是true,没被选择就不会hc

不好意思,是我的错,没让你理解 麻烦简单直接的为我说明下 简单列了以下5个,最终选择的测试节点都是由url-test决定的 在确定lazy: true已经激活后,手动让测试节点出现故障无法连通,访问google以启用对应的节点链,哪一个或几个url-test可以在测试节点出现故障时激活hc并更换为一个未故障的节点 也就是说哪一个或几个是你所说的被选择状态 DOMAIN-SUFFIX,google.comselecturl-test→测试节点 DOMAIN-SUFFIX,google.comfallbackurl-test→测试节点 DOMAIN-SUFFIX,google.comselectfallbackselecturl-test→测试节点 DOMAIN-SUFFIX,google.comselectfallbackselectfallbackurl-test→测试节点 DOMAIN-SUFFIX,google.comselectfallbackfallbackfallbackurl-test→测试节点

您好,请问这个自动测试组嵌套的代理组无法自动测速的问题解决了么,我的使用情况也类似,手动选择→fallback组→三个select组+两个loadbalance组+最终的url-test组 其中select组直接指向节点,loadbalance组是筛选节点再负载均衡使用,而url-test组下是以国家/地区代码筛选的loadbalance组 我现在是给fallback组和url-test组都设置了lazy: false,但还是会偶尔有莫名其妙fallback到了最后的url-test组 我在想loadbalance组是否也要禁用掉lazy才能正常测试fallback里每一项的延迟,lazy默认是开启的,难道选中的代理组全链路里只要有一个没有关掉lazy,那么这条链就会受影响么

Seameee avatar May 17 '25 00:05 Seameee