本文へスキップ

エッセイ

一根 HDMI 线,让我的 Mac mini 断网一周

Asuka 著本文: 中国語8分で読めますMarkdown
目次

出场角色表

  • 🖥️ Mac mini(M4):桌面常开的主力机,也是这次的主角。网卡是 Wi‑Fi 6(802.11ax),不支持 MLO。

  • 💻 MacBook Pro:常放在 Mac mini 旁边,通过通用控制共享键鼠。

  • 🎮 Windows 游戏本:偶尔把显示器的信号源切给它打游戏。

  • 📺 显示器:4K、160 Hz,用 HDMI 线连到 Mac mini。

  • 🔌 HDMI 线:连接 Mac mini 与显示器,被绕成约 3.5 圈,紧贴在机身旁。

  • 📡 路由器:Wi‑Fi 7 家用路由器,开着双频合一、MLO、WPA2/WPA3 混合加密等较新的功能。

  • 🧩 USB 3 Hub 与键鼠:键盘鼠标用 2.4G 无线接收器,接收器插在 Hub 上。

  • 🎧 蓝牙耳机:偶尔连着 Mac mini。

  • 📱 手机:后来用来做热点对照。

先说结果

症状是:桌面 Mac mini 经常间歇性断开 Wi‑Fi,每次要过 5 秒到 1 分钟才能恢复。

根因是 连接显示器的 HDMI 线:它被绕成几圈,紧贴在 Mac mini 机身上,向外辐射的噪声压住了 Wi‑Fi 接收端。拔掉 HDMI 网络立刻恢复,插上立刻断,稍微倾斜机身也会有变化。

在找到它之前,依次怀疑过:2.4 GHz 拥挤、USB 接收器、蓝牙、路由器的高级功能、通用控制的 AWDL。每一个都有“证据”,每一个后来都被推翻了。

重走一遍

1. 先看是谁断开的

从 airportd 的日志统计最近 24 小时:

  • 共 45 次断连,全部出现在某天傍晚之后,前面几个小时一次也没有,之后每小时 3–16 次。

  • 其中 37 次是 linkdownReason=Deauth; linkdownSubReason=9,也就是路由器主动踢人,而且每次都是同一个接入点。

  • 信号很强,RSSI 在 -36 到 -43 dBm,排除了距离和遮挡。

reason 9 的意思是“你还没关联就发来了数据”:路由器已经把它从连接表里删了,设备还在发。每次断开前几秒,日志里都有 DatapathStall 和 SlowWiFiDnsFailure,说明数据通路先停了。

TEXT
linkdownReason=Deauth
linkdownSubReason=9
preceedingTriggers=&Join&SlowWiFiDnsFailure&DatapathStall&SlowWiFiDnsFailure&DatapathStall&LinkDown
sameBSSID=1

2. 弯路一:怪 2.4 GHz

当时它连在 2.4 GHz 信道 4,而同名网络的 5 GHz 信号同样很强。按小时汇总 2.4 GHz 的 LQM 统计:

时段

信道繁忙

其他 Wi‑Fi 网络占用

非 Wi‑Fi 干扰(相对值)

断连开始的那一小时

91%

0.6%

89

第 2 小时

68%

2.7%

62

之后几小时

31%–60%

约 5%

14–39

邻居的 Wi‑Fi 只占约 5%,信道忙主要来自非 Wi‑Fi 的能量。同一时间,蓝牙占用 2.4 GHz 的时间(btDur)从约 0% 升到 10%–15%,当时连着一副蓝牙耳机;USB 日志里,两个 2.4G 键鼠接收器插到 USB 3 Hub 上的时间,比第一次断连早两分钟。

这三条凑在一起很像一个故事:2.4 GHz 被蓝牙、接收器、USB 3 噪声搅乱了。于是我在路由器上把这台设备锁定到 5 GHz。

3. 弯路二:5 GHz 连不上

锁定之后,Mac mini 并没有去 5 GHz,而是继续留在 2.4 GHz。日志显示它连 5 GHz(当时是信道 36,160 MHz 宽)时反复失败,40 分钟里失败 36 次:

TEXT
Will associate to [... channel=(channel=36, width=160), rssi=-41 ...]
AUTO-JOIN: Join FAILED (duration=4763ms, error=(-3905))
LastDriverUnavailableReason = "Auth failures NO_ACK_NO_RESP good RSSI"

信号很好,认证请求发出去后,路由器既没确认也没回应。更早的日志里还有它在两个频段之间来回漫游:

TEXT
roamed from ... channel 36(5Ghz) to ... channel 4(2.4Ghz)
roamed from ... channel 4(2.4Ghz) to ... channel 36(5Ghz)
roamed from ... channel 36(5Ghz) to ... channel 4(2.4Ghz)

还有一个小插曲:中途 macOS 轮换了这个网络的私有 MAC 地址,路由器上按 MAC 设的“锁定 5G”于是失效了。

这一步只是把问题从“断线”换成了“连不上 5G”,没有解释原因。

4. 弯路三:AWDL 理论

接下来怀疑两个方向:USB 接收器,以及旁边的 MacBook Pro。

AWDL 是苹果设备之间直连用的 Wi‑Fi 协议,通用控制、随航、隔空投送都用它。低延迟功能会让它进入实时模式,占用更多无线电时间。把 Mac mini 上 AWDL 实时模式的切换次数和断连次数按小时对比:

时段

+0 h

+1 h

+2 h

+3 h

+4 h

+5 h

AWDL 实时模式切换

23

59

77

96

65

35

断连

1

6

9

16

8

3

走势几乎一致,并且断连开始之前日志里完全没有 AWDL 实时模式。通用控制自己的日志也在喊:

TEXT
CLinkClient Activate ..., CF < BLE AWDL ForceAWDL NoiWiFi ... >
CUWiFiManager Flags changed: 0x200 < 5GHz > -> 0x240 < AWDLDegraded 5GHz >

ForceAWDL NoiWiFi 表示通用控制只走 AWDL 直连,不经路由器。出问题的那一小时里,通用控制会话建立了 24 次,平时每小时只有 1–5 次。

于是有了一个很完整的推理:Mac 只有一套无线电,联网的信道和 AWDL 的信道不一致时只能来回切换;切走时路由器的帧收不到,被踢出去,认证又正好撞上切换,超时。这套推理自洽,当时看起来相当有说服力。

后来我在路由器上调整了设置,所有设备重新连接,Mac mini 连上了 5 GHz 信道 157(80 MHz),MacBook Pro 也在同一个信道上。MacBook Pro 放回旁边,键鼠接收器也原样不动,网络和通用控制都一直正常了好几个小时。“两台设备统一到同一个信道,AWDL 不用再切换”,看上去闭环了。

5. 复发:前面的结论开始松动

几个小时后又出现了一次,这次的细节让前面的说法站不住:

  • 断网时 Wi‑Fi 显示仍然连着,路由器没有踢它。问题是数据发不出去:正常时每分钟发几千帧,那几分钟只有 12–78 帧,DNS 持续失败。

  • 此时信道 157 的繁忙度是 96%–98%,而且几乎全部是非 Wi‑Fi 干扰。

  • 之前“好了”的那段时间里,干扰并没有消失,只是停在了一个较低的水平。短暂的低谷被当成了常态。

又过了半天,傍晚再次发作,这次特别干净:

时间

5 GHz 信道 157 的干扰(相对值)

现象

17:39 以前

22–30

正常

17:40,十秒内

22 → 96

数据卡死,5G 连续认证失败 244 次(都是 -3905 超时)

18:30 左右

底噪升到 -58 dBm,两个频段同时抬高

关掉双频合一、改连 2.4G 后才恢复

关键的两点:

  1. “其他 Wi‑Fi 占用”(ccaOtherTotal)整个过程都在 1 左右。 MacBook Pro 和 AWDL 的帧都是可识别的 Wi‑Fi 帧,会计入这一项。干扰既然是不可识别的能量,就不可能是它们。AWDL 理论被这个数字直接否定了,其实第一次看到“非 Wi‑Fi 干扰”这几个字时就该想到。

  2. 手机热点也连不上。 热点不属于路由器,所以问题在 Mac mini 自己的接收端。

这时我把能想到的都试了一遍,都没有用:关掉键鼠和屏幕挂灯的收发端,关掉 MacBook Pro 的 Wi‑Fi,关掉一台 Windows 游戏本,通用控制也早关了。

6. 弯路四:蓝牙

这次问题发作期间,日志里蓝牙异常活跃:

  • 蓝牙状态切换(BluetoothPagingInProgress)每 30 分钟的次数,平时 8–16,问题那一个多小时变成 298 / 768 / 658。

  • bluetoothd 每 5 分钟的日志条数,从 39 条涨到约 2900 条。

看上去很像蓝牙在搅局,而且 Wi‑Fi 和蓝牙在这台 Mac 上是同一颗芯片。于是把蓝牙整个关掉——5G 依然连不上。

回头把时间精度放到 1 秒才看清楚顺序:干扰计数在 17:40:24 还是 20,17:40:29 到 50,17:40:34 到 96;而手机热点的回退和浏览是在干扰升高之后才开始的。大部分蓝牙活动是 Wi‑Fi 变差后的结果,系统在到处找手机热点。蓝牙还有一个问题:它只工作在 2.4 GHz,直接解释不了 5.8 GHz 上的噪声。

7. 转折:噪声就在机身旁边

排除了路由器、信道、蓝牙、MacBook Pro、接收器之后,只剩 Mac mini 本机周围的东西了。这时我想到桌上那根 HDMI 线打了好几圈,会不会有问题?当时显示器是 4K、160 Hz。

我做了一组实验,同时开着 ping 路由器:

  • 拔掉 HDMI:立刻有网。插上:立刻断网。反复几次,结果一致。

  • 用手把 Mac mini 稍微抬起、倾斜:网络立刻恢复。

  • 把刷新率降到 60 Hz:没有任何效果。

  • 当时那根线绕了约 3.5 圈,堆在 Mac mini 背面,几乎贴着机身。

一次 ping 的总结:185 个包,丢了 56.8%,最大延迟 2.8 秒。断网时是 No route to host 和连续上百个超时,恢复时先出现几百到两三千毫秒的延迟,再回到 3–5 ms。

采样的日志也对得上:5G 重新连上、HDMI 接着时,信道繁忙度立刻升到 90 以上,发送帧数掉到 0–30。

为什么是 HDMI 线

下面是推断,没有用仪器测过:

  • 4K 高刷新率需要很高的数据速率,线缆的屏蔽或接头不好时,共模噪声会向外辐射,Wi‑Fi 频段更容易受影响。

  • 线缆绕成线圈会增强辐射,而且这一堆线就贴着 Mac mini 的天线一侧。

  • 倾斜机身只改变了几厘米的耦合距离,却能让网络恢复,说明是近场耦合,路由器、信道、软件设置都做不到这一点。

  • 降到 60 Hz 没用,因为 4K 即使在 60 Hz 数据速率也依然很高,关键在线本身,不在刷新率。

  • 它也解释了为什么前面排除过的所有东西都没用,以及为什么手机热点也连不上。

具体是线的屏蔽、接头还是接口在辐射,目前还没有搞清楚。

一个待验证的猜测:好转与恶化,可能都和线被动过有关

回头看整条时间线,不少“好了”或“坏了”的时间点附近,都有和显示器、线缆有关的动作:

  • 中途把显示器的信号源切到游戏本打游戏。这段时间里 Mac mini 的 HDMI 输出很可能不再被显示器使用,噪声也许随之消失。

  • 搬动 MacBook Pro 时,手会碰到那堆线,线的位置变了,和天线的耦合也跟着变。前面“MacBook Pro 拿远之后就好了”,也可能只是线被顺带挪动了。

  • 傍晚回家开始使用显示器,和两次发作的时间也对得上。

这些都只是怀疑:日志里没有显示器输入切换的记录,也没有线缆位置的记录,无法回头验证。验证办法很简单:固定住线的位置,再单独切换信号源、单独搬动 MacBook Pro,各观察一段时间。

复盘:为什么绕了这么多弯

  • 把相关当成了因果。 AWDL 的次数和断连次数同向变化,蓝牙活动和断网同时出现,但它们都是 Wi‑Fi 变差后的结果。

  • 同时改了多个变量。 路由器改设置的同时,所有设备重新连接,信道、频段、AWDL 状态一起变了;搬动 MacBook Pro 时又可能碰到了 HDMI 线。分不清是哪个在起作用。

  • 把低谷当成了常态。 路由器调整后那段平静的时间,其实只是干扰暂时下降。

  • 被一个关键数字提醒了好几次,没有认真对待。 ccaOtherTotal ≈ 1 说明干扰不是任何可识别的 Wi‑Fi 信号。

  • “手机热点也连不上”才是最有信息量的一句话,它把嫌疑一下子从路由器、信道、其他设备收缩到了这台机器本身。

处理与预防

  1. 把 HDMI 线拉直、解开线圈,离开 Mac mini 机身(尤其是背面)二三十厘米,不要和电源线、USB 线捆在一起。

  2. 换一根短而有认证的 Ultra High Speed HDMI 线,或者在靠近 Mac mini 的一端套磁环。

  3. 仍然不行,就换成 DisplayPort 或 USB‑C 连接显示器。

  4. 常开的机器直接插网线,Wi‑Fi 的各种问题都不再影响它。

  5. 路由器的 5 GHz 固定在 149 或 157、80 MHz,不要用 160 MHz;常开设备的“私有 Wi‑Fi 地址”设成“固定”。这些与这次的根因无关,但能减少别的麻烦。

下次怎么查

先把问题分成“路由器那一侧”和“这台机器自己”:

  1. 同一位置换一台设备(手机、另一台电脑)连同一个 Wi‑Fi。它们正常,问题就在这台机器;也不正常,就是环境或路由器。

  2. 用手机热点试一下。 连不上,基本可以确定是这台机器的接收端。

  3. 查干扰类型,注意看“其他 Wi‑Fi 占用”是不是接近 0:

SH
/usr/bin/log show --last 30m --style compact \
  --predicate 'process == "airportd" AND eventMessage CONTAINS "LQM: rssi"' \
  | grep -oE 'cca=[0-9.]+%|ccaOtherTotal=[0-9]+|interferenceTotal=[0-9]+|noise=-?[0-9]+dBm' | head -40
  1. 统计断开原因:

SH
/usr/bin/log show --last 6h --style compact \
  --predicate 'process == "airportd"' \
  | grep -oE 'linkdownReason=[^;]+;linkdownSubReason=[0-9]+' | sort | uniq -c
  1. 在不改别的东西的前提下,逐个拔掉机身附近的线(HDMI、USB、雷雳),每拔一个看一次网络。

zsh 里的 log 是内置命令,所以要写完整路径 /usr/bin/log。