OpenWrt 空闲后变慢:10 分钟诊断流程

2026-10-11 · 约 2 分钟

症状:空闲一段时间后,某台设备的下载掉到约 10Mbps(有时更差),而其他设备正常。 下面是我们用来在一台 MT7986 路由器上找到两个根因的 10 分钟诊断流程 (E 级证据;修复以脚本形式提供 [2],测量数据已公开 [1])。

1. 方向测试:是不是只有下行?

# 在 AP 上
iw dev <ap> station dump | grep -E "Station|tx bitrate|rx bitrate|signal:"

2. 采样速率,别信单次读数

for i in $(seq 1 20); do
  iw dev <ap> station dump | grep -m1 "tx bitrate"
  sleep 2
done

在 MCS0 与 MCS9+ 之间来回跳 → 指向速率控制/状态问题。被钉在中间速率 → 指向信道条件。

3. 字节对账:是重传还是空口空闲?

在一次内网传输里,对比 AP 发出的字节与客户端收到的字节:

4. 核对两个已知的 mt76 陷阱

# 陷阱 1:固件 VoW ATF(默认 1)阻止速率恢复
cat /sys/kernel/debug/ieee80211/phy*/mt76/vow_atf
echo 0 > /sys/kernel/debug/ieee80211/phy*/mt76/vow_atf     # 立即验证

# 陷阱 2:80MHz BSS 里的 40MHz 客户端
iw dev <ap> info | grep -E "channel|width"                 # 射频宽度
iw dev <ap> station dump | grep -m1 "tx bitrate"           # 客户端宽度会体现在速率串里

修好陷阱 1 后的预期结果(MT7986 实测):最初几次突发仍然慢,然后在 15 秒内爬回约 400Mbps。 如果你的客户端是 40MHz 设备,再把射频切到 40MHz(稳定 330–420Mbps)。

5. 让修复在重启后仍然生效

vow_atf 位于 debugfs,驱动重载后会丢失,所以要靠开机初始化脚本 (/etc/init.d/mt76-wifi-tune)加上每分钟重放一次的 watchdog 来持久化。两个脚本都在本项目工具箱里。

6. 速查表

观察到的现象 最可能的原因 修法
单客户端、只有下行、钉在 MCS0 固件 ATF 阻止恢复 关掉 vow_atf 并持久化
每隔几分钟塌一次、客户端是 40MHz 窄带客户端在宽带 BSS 让射频跑客户端的原生宽度
所有客户端同时变慢 信道/干扰 信道分析、降带宽、DFS
只有离 AP 远的慢 信号/速率 查 RSSI、调整天线位置

相关:mt76 速率控制深度分析 · 80 vs 40MHz · 复现教程

参考与数据来源

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

  1. E 级 · 本项目实测 本项目 10 分钟实测抓包(57,293 条 / 600.0 s,SHA-256 00373f83…95e2)
    Router CSI Lab · 2026
    csi.okwujun.pw/zh/datasets/ · 核实: 分片重组逐字节校验通过(2026-10-11)
  2. E 级 · 本项目实测 Router CSI Toolkit — 采集/分析/守护脚本(MIT)
    Router CSI Lab · 2026
    csi.okwujun.pw/zh/tools/ · 核实: 仓库打包含 SHA-256,脚本在真机运行