CSI 上线后 Wi-Fi 变慢:vow_atf 与 40MHz 客户端的实测排障

作者 Wu Jun · 更新于 2026-11-02 · 约 5 分钟

这是我们在把 CSI 跑进真实家庭网络后遇到的最难排查的问题之一。它同时叠加了客户端空闲状态、 固件调优开关和带宽协商,所以单看一次测速很容易误判:

同一台路由器,开启 CSI 之后,Mac 的下行速度从 300–400Mbps 掉到 6–10Mbps,而上行依然有 45Mbps。

下面是完整的定位过程、可复现触发条件与两种修复方式。所有数字均为本项目一手实测(E 级)。 公开的 10 分钟 CSI 数据集 [1] 不包含这些网络吞吐日志,因此本文公开实验顺序、 条件、结果表和工具包 [2];原始测速日志因含家庭网络信息不进入公开数据集。 涉及的开源驱动为上游 mt76 [3]。

1. 先把范围缩小到"无线下行"

我们做了四组对照,把可能的环节逐个排除:

假设 实验 结论
宽带/光猫问题 路由器直接下载国内镜像 264–300Mbps(4 线程聚合 391Mbps),正常
有线问题 检查 WAN 口协商 1000Mbps 全双工,错误计数为 0
CSI 采集开销 关闭 CSI(CSI enable: 0)后复测 仍然塌陷 → 与 CSI 采集无关
客户端发射能力 Mac 上行 SSH 传输 188Mbps,AP 侧 rx 速率 600Mbps 3SS,正常

结论:只有 AP→客户端(下行)方向塌陷,速率被压到 VHT-MCS0 1SS(13.5Mbps)。

2. 关键线索:空闲就塌,且"塌了回不来"

用路由器侧 debugfs 观察客户端实时速率:

iw dev <iface> station dump | grep -E "tx bitrate|rx bitrate|signal"

现象:

  1. 空闲约 1 秒后,AP 对该客户端的发送速率掉到 MCS0;
  2. 持续流量下有时能爬回 MCS9(约 400Mbps),有时永远爬不回来;
  3. 客户端与 AP 的 ping:0% 丢包,但 RTT 抖动到 243ms(省电/缓冲特征)。

在"卡死"状态里,即使连续 36 秒满载下载,速率依然停在 7–10Mbps。

3. 高置信度触发因素一:固件 VoW ATF 阻止速率恢复

在 mt76 的 debugfs 里有一个固件特性开关:

cat /sys/kernel/debug/ieee80211/phy*/mt76/vow_atf   # 默认 = 1

对照实验(同客户端、同一时段、只改这一个开关,均为"空闲 60 秒后连续 6 次下载"):

vow_atf 6 次结果(Mbps) 行为
1(固件默认) 9.5 / 7.3 / 9.5 / 7.4 / 9.6 / 7.2 36 秒持续下载也完全不恢复
0(关闭) 7.8 / 8.8 / 20 / 146 / 387 / 393 约 15–20 秒内自动爬回满速
0 + 客户端重新关联 369 / 374 / 376 / 390 / 409 / 397 直接满速,6/6 通过

可复现修复开关(已持久化):关闭 vow_atf,并在开机与每分钟的 watchdog 中重放设置 (驱动重载/重启后不会丢):

echo 0 > /sys/kernel/debug/ieee80211/phy*/mt76/vow_atf

对应脚本已公开发布: 稳定工具包 / SHA-256。

4. 触发条件二:40MHz 客户端接入 80MHz BSS

ATF 解决后,仍然存在"周期性塌陷"。继续对照发现:

客户端 带宽 稳定性
老款 Mac(Broadcom,VHT 3SS) 40MHz 反复塌陷
手机(HE 2SS) 80MHz 稳定 1200Mbps
其他设备(VHT 1SS) 80MHz 稳定

把 5GHz 射频从 80MHz 切成 40MHz(htmode=HE40)后:

配置 空闲 60 秒后连续 6 次下载
HE80(80MHz) 7.4 / 7.3 / 9.3 / 9.5 / 9.6 / 9.6 Mbps(全塌陷)
HE40(40MHz) 384 / 375 / 328 / 416 / 411 / 419 Mbps(6/6 稳定)

结论:只协商 40MHz 的老客户端,在当前 MT7986 + mt76 固件组合中与 80MHz BSS 不兼容。 把射频设成该客户端的原生带宽后问题消失。由于没有继续获取固件内部速率状态,本文不把机制进一步归因到 某个确定的 PPDU 字段或寄存器,只声明可重复观察到的条件与修复结果。

以上属于本项目 E 级现场记录。实验方法与修复脚本已整理进公开工具包 [2]; 原始吞吐日志不属于公开 CSI 数据集 [1]。

5. 两种修复怎么选

目标 做法 代价
保 CSI 高精度(80MHz / 256 子载波) 保持 HE80 40MHz 老客户端会变慢
保日常可用(客户端满速) 切 HE40 CSI 带宽与子载波数减半

可以做一个 30 秒切换的脚本,按需切换:

sh /usr/bin/wifi-htmode HE80   # CSI 实验模式
sh /usr/bin/wifi-htmode HE40   # 日常模式

6. 你可以直接复用的判断流程

Wi-Fi 变慢
  ├─ 只有下行慢、上行正常? ──▶ 查 AP 侧 tx bitrate 是否被压到 MCS0
  │     ├─ 空闲后塌陷且不恢复 ──▶ 关 vow_atf(并持久化)
  │     └─ 仍周期性塌陷 ─────▶ 查客户端带宽 vs BSS 带宽是否不一致
  ├─ 上下行都慢 ──▶ 查干扰/信道/协商(本文不覆盖)
  └─ 有线也慢 ────▶ 查 WAN 协商与宽带(本案例 WAN 始终 1000Mbps)

如果你的路由器也是 MT7986/MT7915 系列(OpenWrt + mt76),建议先跑一遍上面两张表, 五分钟就能判定你遇到的是哪一种。

7. 30 分钟最小复现步骤

  1. 记录路由器型号、OpenWrt/mt76 版本、Wi-Fi 固件 MD5、信道、带宽、国家码和发射功率;
  2. 记录客户端型号、协商带宽、空间流、RSSI/SNR 与省电设置;
  3. 先做上行、下行和有线三个方向测试,确认问题只在 AP→客户端;
  4. 在路由器上连续采样 tx bitrate / rx bitrate,不要只看一次读数;
  5. 空闲 60 秒,然后做 6 次 6 秒内网下载,记录每次 PHY 速率、实际吞吐和两端字节数;
  6. 只修改 vow_atf,重复第五步;
  7. 恢复 vow_atf,再把 BSS 从 HE80 改为 HE40,重复第五步;
  8. 恢复原配置,并保留每一步的时间、命令输出和客户端状态。

建议的最小结果表:

实验 客户端带宽 / BSS 6 次实际下行 结论
基线 40 / 80MHz 7–10Mbps 复现
仅关 ATF 40 / 80MHz 8→393Mbps ATF 与恢复相关
改原生宽度 40 / 40MHz 328–419Mbps 宽带 BSS 条件消失

8. 证据边界

9. 提交问题时的记录模板

router: GL-MT6000 / OpenWrt ... / mt76 ...
firmware: mt7986_wm.bin MD5 ...
client: model / chip / VHT or HE / NSS / negotiated width
radio: band / channel / width / country / txpower
problem: downlink only? idle trigger? persistent?
baseline: 6x6s results, tx/rx bitrate, bytes AP TX vs client RX
vow_atf=0: 6x6s results
HE40: 6x6s results
restored state: yes/no

只有把这些条件写全,维护者才能判断是驱动、固件、客户端省电还是环境问题。

参考与数据来源

本文的每条外部结论都标注来源与证据等级(分级标准);标注 E 级的是本项目可复现的实测数据。

  1. E 级 · 本项目实测 本项目 10 分钟实测抓包(57,293 条 / 600.0 s,SHA-256 00373f83…95e2)
    Router CSI Lab · 2026
    okwujun.pw/zh/datasets/ · 核实: 分片重组逐字节校验通过(2026-10-11) · 本地原始母片 SHA-256 为 00373f83…95e2;公开下载的是去标识派生文件,SHA-256 为 527466ce…a440,两者不可混用。
  2. E 级 · 本项目实测 Router CSI Toolkit — 采集/分析/守护脚本(MIT,公开仓库)
    Router CSI Lab · 2026
    github.com/jjjwu/router-csi-toolkit · 核实: GitHub API 于 2026-11-02 核实公开仓库、抓包质量预检、成功 CI 与 v0.1.3 Release;归档 SHA-256 为 59f144c0…adea7 · 公开版含无第三方依赖的抓包质量预检;网页端检查器使用同一容器定义和边界口径。
  3. C 级 · 官方资料 openwrt/mt76 — mac80211 driver for MediaTek Wi-Fi chipsets
    OpenWrt project / MediaTek
    github.com/openwrt/mt76 · 核实: GitHub API 2026-10-11 (stars 890, last push 2026-10-08) · 本项目使用的开源 mt76 驱动上游;CSI 能力的补丁正是在这一代码库之上编排。