现象
- macOS 上
sing-box偶发出现高 CPU,占用可到300%+ - 出现后执行下面三条命令通常可以恢复
sudo launchctl bootout system /Library/LaunchDaemons/local.singbox.tun.plist
sudo launchctl bootstrap system /Library/LaunchDaemons/local.singbox.tun.plist
sudo launchctl kickstart -k "system/local.singbox.tun"
目前怎么处理
- 先保留本次 Nix fix,降低 Darwin 上
sing-box的日志放大效应 - 已把 Darwin 运行日志级别从
info降到warn - 已去掉 FakeIP 规则里的
rewrite_ttl = 1 - 目的不是宣称问题已经根治,而是先拿掉 CPU / I/O 放大器,避免现场被大日志污染
还有什么问题未处理
- 问题仍然是偶发,不是稳定复现
- 现有判断是“日志放大器”已确认存在,但未证明它是唯一根因
- 更像是某个运行态异常在先,日志与高频 DNS/连接事件把 CPU 放大了
- 重点怀疑项:
urltest在异常网络状态下持续测速remote DNS = 223.5.5.5 + detour=select在某些时刻进入异常重试- sleep/wake 后 TUN 和系统网络状态短暂失配
- 某个客户端应用自己在疯狂重连,
sing-box只是被动承压
怎么排查
- 下次复现时,不要先重启
sing-box - 先直接运行现场抓取脚本:
bash lib/singbox/singbox-netdiag.sh --high-cpu-snapshot
-
脚本会额外抓这些高 CPU 现场信息:
ps -p <pid> -o pid,ppid,%cpu,%mem,etime,state,commandlsof -p <pid>netstat -anv | rg '223.5.5.5|8443|9090|53'launchctl print system/local.singbox.tuntail -n 180 /tmp/singbox.logcurl -s 127.0.0.1:9090/connections(如果 clash api 可用)
-
输出日志默认会落到
~/Library/Logs/singbox-netdiag-<timestamp>.log -
抓完现场之后,再决定是否执行 bootout / bootstrap / kickstart 恢复
修改wapd等DNS配置(来避免部分噪声) [2026-04-07]
这次对 sing-box 配置又做了两处收敛修改:
- 在
dns.rules里把AdGuardSDNSFilter/chrome-doh和wpad改为action = "reject",并把这些规则提前到clash_mode规则之前,避免先被direct/global模式短路 - 把
urltest.interval从5m调整为30m,先降低异常网络状态下的周期性探测放大
这次修正解决的是一个确定存在的配置问题:
wpad/chrome-doh规则之前实际没有命中server = "block"这种旧写法会带来额外错误日志
仍需继续观察的点:
- 后续是否还会出现
300%+的高 CPU 现场 /tmp/singbox.log里是否还会持续出现bad rdata / buffer size too small- 即使
wpad噪音下降后,是否还存在某个客户端或某条 DNS/TUN 路径在异常态下持续重试
当前结论仍然保持保守:
- 这轮修改更像是移除了已确认的配置层放大器
- 还不能证明它就是 sing-box 高 CPU 的唯一根因
开盖后的瞬时 no route to internet 日志
- 2026-04-07 又观察到一批
dial tcp ...: no route to internet日志,同时影响了:- 直连 DoH(如
223.5.5.5:443) - 代理节点出站(如
142.171.154.61:8443)
- 直连 DoH(如
- 结合当时是在刚开盖后的恢复窗口触发、随后网络自行恢复,这批日志更像 Darwin 网络 / TUN / 默认路由尚未完全恢复时的瞬时错误,而不是新的稳定配置缺陷。
- 当前先不继续为这类日志单独改
sing-box配置,后续重点观察两点:- 这类错误是否只出现在 wake recovery 的短窗口内
- 它是否会再次演变成需要手动
kickstart或导致高 CPU 的持续故障