排查起点:区分打开慢、下载慢与间歇断流
Clash 显示的节点延迟,不等于文件下载速度。打开网页需要经过域名解析、连接建立、TLS 握手和内容传输;其中任何一段等待,都可能表现为“网速慢”。先确定症状,再按节点、线路、本机设置依次缩小范围,比同时修改 DNS、规则和 TUN 更容易得到结论。
| 可见症状 | 优先检查 | 对照方法 |
|---|---|---|
| 首次打开停顿,随后加载正常 | DNS、连接与 TLS 阶段 | 比较同一地址首次与重复请求的耗时 |
| 页面能开,大文件持续低速 | 节点带宽、出口拥塞、目标限速 | 固定文件,切换两个不同出口节点 |
| 每隔一段时间卡顿 | 自动策略切换、网络漫游、资源占用 | 固定节点,记录卡顿时刻和连接日志 |
| 浏览器正常,终端很慢或失败 | 终端是否使用代理 | 用显式代理参数测试同一地址 |
| 只有启用 TUN 后变慢 | 路由、DNS 接管、其他网络扩展 | 关闭 TUN,仅保留显式 HTTP 代理对照 |
建立一次可重复的测试
- 暂停云盘同步、系统更新和其他下载,保留同一台 Mac、同一个网络、同一个目标文件。
- 将目标请求实际使用的策略组改为手动选择,固定一个节点,避免测试期间自动切换。
- 每组测试连续执行 3 次,记录时间、节点、网络类型、代理方式和结果。首轮可能受到缓存影响,应单独标记。
- 每次只改一个变量。测试结束恢复原配置,确认结果是否能够重复。
第一层:节点质量与实际代理出口
先打开客户端的连接列表,找到正在访问的域名,查看命中的规则、策略组和最终节点。界面中选中了某个节点,不代表每个请求都会经过它:规则可能指向另一个策略组,也可能命中 DIRECT。客户端界面的名称和入口各不相同,应以当前客户端提供的连接详情为准。
固定节点,排除自动切换
url-test 会按照配置的探测结果选择节点,fallback 侧重按顺序选择可用节点,load-balance 则按策略分配连接。排查时先使用手动选择组,让测试请求保持相同出口。切换节点通常不会把已经建立的长连接迁移到新节点,因此应重新发起请求;必要时只关闭目标应用对应的旧连接。
- 只有一个节点慢:优先考虑该节点负载、带宽限制或其上游路径,换节点复测。
- 同一地区多个节点都慢:继续比较不同地区、不同入口或不同供应路径,不能只按节点名称判断线路独立性。
- 全部节点只对某个网站慢:检查目标站点限速、CDN 分配、账号状态和出口 IP 的访问限制。
区分延迟与吞吐量
低延迟有利于交互,但持续下载还取决于拥塞、丢包、可用带宽和远端服务能力。一个延迟更低的节点,下载大文件仍可能更慢。测试时使用同一个合法可访问的文件源,不要把不同站点的下载结果直接比较,也不要用只有几 KB 的网页判断带宽上限。
同时留意单位:下载工具中的 MB/s 与宽带标称的 Mbps 不同。按十进制单位换算,10 MB/s 约为 80 Mbps,实际应用还会受到协议开销影响。这是单位换算,不是节点速度承诺。
第二层:本地网络到节点、节点到目标的线路
代理连接至少包含两段路径:Mac 到代理入口,以及代理出口到目标服务。切换节点会同时改变其中的一部分,因此还需要更换本地接入网络做交叉验证。保持节点和目标不变,用手机热点进行短时对照;如果热点明显改善,问题更可能位于原来的 Wi-Fi、路由器或接入运营商路径。
用 curl 确认请求确实经过代理
终端工具不一定读取 macOS 系统代理。下面命令显式指定本机 HTTP 或混合端口,并输出阶段计时。示例使用 127.0.0.1:7890,执行前先核对客户端当前监听端口。输入地址应为允许下载、大小适中的 HTTPS 文件地址;签名链接和订阅链接不要粘贴到公开日志中。
printf '请输入测试文件的 HTTPS 地址:'
read -r TEST_URL
curl --proxy http://127.0.0.1:7890 --noproxy "" \
--location --output /dev/null --silent --show-error \
--connect-timeout 10 --max-time 60 \
--write-out 'status=%{http_code}\nconnect=%{time_connect}s\ntls=%{time_appconnect}s\nfirst_byte=%{time_starttransfer}s\ntotal=%{time_total}s\nbytes=%{size_download}\nspeed=%{speed_download} B/s\n' \
"$TEST_URL"
speed_download 的单位是字节每秒。time_starttransfer 是从请求开始到收到首字节的累计时间,并非单独的服务器处理时间。通过本地 HTTP 代理访问 HTTPS 时,time_connect 主要反映连上本地代理的时间,不能把它当作到远端节点的延迟;后续代理隧道和 TLS 阶段还包含远端路径的影响。
若目标本身允许直连,可以把代理选项替换为 --proxy "" --noproxy "*" 再做一轮对照。不过,这只绕过 curl 的显式代理;启用 TUN 时,请求仍可能被路由接管。需要真正比较直连时,应先关闭 TUN,并确认其他 VPN 没有接管该流量。
按时间窗口判断拥塞
同一节点在白天正常、晚间持续变慢,且有线连接与 Wi-Fi 表现接近,通常更值得检查共享链路拥塞。分别记录两个时间窗口的 3 次结果,比一次测速更有参考价值。对代理服务器执行 ping 只能提供有限线索:服务器可能限制 ICMP,ICMP 的路径和优先级也不一定代表实际代理连接。
第三层:系统代理、规则与本机负载
在较新的 macOS 中,可从「系统设置」→「网络」→ 当前网络服务 →「详细信息」→「代理」查看 HTTP、HTTPS 和 SOCKS 设置。不同系统版本的文字可能略有差异。先确认代理地址为本机监听地址,端口与客户端一致,再检查是否残留旧客户端的设置。
networksetup -listallnetworkservices
networksetup -getwebproxy "Wi-Fi"
networksetup -getsecurewebproxy "Wi-Fi"
scutil --proxy
如果网络服务被重命名,或当前使用的是 USB 以太网,应把命令中的 Wi-Fi 换成第一条命令列出的实际服务名称。检查输出中的启用状态、服务器地址和端口,不要仅凭客户端开关的颜色判断系统设置是否已经写入。
检查重复代理与规则误命中
- 浏览器代理扩展可能覆盖系统代理。测试时先停用扩展,或明确记录扩展使用的出口。
- 同时运行两个带 TUN、VPN 或流量过滤能力的工具,可能造成路由冲突。一次只保留一套接管方式进行验证。
- 如果只有特定域名慢,在连接列表核对它是否误入远端代理,或本应代理却被直连规则截获。
- 打开「活动监视器」,观察 CPU 与网络。若客户端或其他进程持续占用资源,先停止后台重任务,再复测相同请求。
Clash 是内核与客户端生态中的名称,并非所有图形客户端都有相同的覆写、日志或服务模式。使用 mihomo 的客户端也可能采用不同的权限管理和配置合并方式。修改前应查看实际生效配置,而不只是订阅文件中原始的 YAML。字段含义可结合YAML 手册查阅。
DNS 模式:定位首次打开慢与解析异常
DNS 问题常表现为首次打开慢、部分域名失败,或浏览器与命令行结果不一致。mihomo 的 fake-ip 模式会为域名分配映射地址,redir-host 模式则使用真实解析结果。两者不是简单的“快”和“慢”:适配性取决于应用、路由接管方式与 DNS 配置。
先确认解析走哪条路径
- 执行
scutil --dns,查看系统当前解析器及其作用域。VPN 和不同网络接口可能各自提供解析器。 - 核对浏览器是否启用了独立的安全 DNS。浏览器解析正常,不代表系统解析和客户端内置 DNS 同样正常。
- 在客户端日志中检查解析超时、上游不可达或重复重试。若上游 DNS 自身依赖尚未建立的代理,可能出现启动依赖问题。
- 仅对一个受影响域名做重复测试,再比较切换网络前后的结果,不要同时更换所有上游和模式。
使用 HTTP 代理访问 HTTPS 时,目标域名通常可交给代理端处理,因此 curl 的本地解析耗时不能直接说明目标域名的 DNS 性能。类似地,dig 默认测试的解析路径也未必等同于浏览器、系统解析 API 或 mihomo 的内部解析路径。
TUN 栈与 Wi-Fi 省电:按单变量验证
TUN 栈选择与路由检查
TUN 通过虚拟网络接口接管 IP 流量;它不直接增加节点带宽。mihomo 提供的栈选项包括 system、gvisor 和 mixed,具体可用性和默认值以客户端所带内核及其文档为准。不同栈会影响协议处理方式、兼容性和资源开销,没有适用于所有 Mac 的固定最优项。
先记录当前栈,然后只切换栈选项,按客户端要求重新启用 TUN 或重启内核,复测同一个请求。下面仅展示要比较的字段,不是一份完整配置;不要用它覆盖已有的 TUN、DNS、路由或权限设置。
tun:
enable: true
stack: system
如果显式 HTTP 代理正常、TUN 下异常,应重点检查路由循环、DNS 接管和其他网络扩展。不要一开始就随意调整 MTU。只有出现特定目标的大包传输停滞、握手后卡住等证据时,再按内核文档做单项对照。开启自动路由前也应确认局域网设备和工作 VPN 的访问需求。
区分 Wi-Fi 干扰与低电量模式
Mac 的低电量模式不是“代理限速开关”,不能据此认定 Clash 下载慢。它可作为测试变量:在「系统设置」→「电池」中查看低电量模式,接通电源,在相同位置、同一节点下分别记录结果。选项名称和可用范围会因机型、系统而异,不能通过一次变化就认定因果。
- 按住 Option 点击菜单栏 Wi-Fi 图标,可查看系统提供的信号、噪声和传输速率信息;这些是无线链路指标,不等于互联网下载速度。
- 靠近路由器复测,并在条件允许时比较有线连接。若有线正常而 Wi-Fi 异常,优先处理信号、干扰和漫游。
- 分别测试 5 GHz 与 2.4 GHz 网络。前者不一定在隔墙较多时更稳定,应以当前位置的重复结果判断。
- 若睡眠唤醒后才变慢,重新连接 Wi-Fi,再检查客户端的代理与 TUN 状态;不要长期靠反复重装来掩盖问题。
结果归类与配置恢复
排查的终点应是一条可以复现的结论,而不是“调过很多设置”。例如:“固定同一节点和文件时,有线正常、Wi-Fi 持续低速”,足以把重点转向无线网络;“关闭 TUN 后显式代理正常”,则把范围缩小到本机接管链路。结论越具体,后续处理越少依赖猜测。
- 节点问题:更换出口,并向服务提供方提交时间、节点和目标信息,隐藏账号、订阅地址及认证参数。
- 线路问题:保留不同接入网络与不同时段的对照结果,区分本地接入拥塞和出口到目标的异常。
- 本机问题:只保留已经验证有效的修改,恢复临时更改的栈、DNS、策略组与省电设置。
- 仍无法定位:提供客户端名称、内核类型、macOS 环境、代理方式和脱敏日志,避免仅提交一张延迟截图。
更换客户端可以帮助验证 GUI 配置或权限差异,但不会自动改变订阅节点的容量。先确认瓶颈所在,再决定调整规则、修复本地设置,还是更换出口线路。