OpenWrt 空闲后变慢:10 分钟诊断流程与可回退实验

作者 Wu Jun · 更新于 2026-10-29 · 约 5 分钟

症状:空闲一段时间后,某台设备的下载掉到约 10Mbps,甚至长时间不恢复,而其他设备正常。 在 GL-MT6000 + OpenWrt mt76 上,我们复现到两个独立条件:vow_atf 阻止速率恢复,以及 40MHz-only 客户端处在 80MHz BSS。这个页面给出可回退的诊断顺序,不鼓励直接复制“优化命令”。

所有结果来自本项目真机记录;CSI 原始抓包公开 [1],诊断和调优脚本放在 公开工具包 [2]。上游驱动为 mt76 [3]。

0. 先备份,再测量

开始前记录:

uname -a
cat /etc/openwrt_release
iwinfo <ap> info
iw dev <ap> station dump
ubus call system board

保存 /etc/config/wireless 和当前固件版本。不要把生产路由器的无线配置直接交给未知脚本。

1. 先判断“慢”发生在哪一层

现象 更可能在哪一层 第一件事
有线也慢 WAN、光猫、运营商或 CPU 查链路协商与路由器本机下载
只有 Wi-Fi 下行慢,上行正常 AP→客户端速率状态/带宽协商 查 tx/rx bitrate 与 BSS 宽度
所有 Wi-Fi 客户端同时慢 信道拥塞、DFS、干扰、AP 资源 扫描邻居与空口
单客户端慢,其他设备正常 客户端省电、MCS、带宽或驱动 做方向与 A/B 实验
Speedtest 慢但内网快 公网、服务器或 DNS 不用公网作为唯一基准

先把“宽带问题”和“Wi-Fi 问题”分开。仅凭一次 Speedtest 截图无法完成这一步。

2. 检查 WAN/LAN 是否真的只有百兆

for i in /sys/class/net/*; do
  name=$(basename "$i")
  [ -r "$i/speed" ] && echo "$name $(cat "$i/speed") Mb/s"
done

再对 WAN 和可疑 LAN 口运行:

ethtool <wan-iface>
ethtool <lan-iface>

重点看:

本项目的真实案例里,WAN 一直是 1000Mbps 全双工,真正只有百兆的是另一台机器的网卡协商; 如果把那条 LAN 的结果当成 WAN,就会误判“刷机把千兆刷成百兆”。这类问题应先看 link partner 通告, 而不是改无线。

3. 采样客户端速率,不要只读一次

for i in $(seq 1 20); do
  date +%H:%M:%S
  iw dev <ap> station dump | grep -E "Station|tx bitrate|rx bitrate|signal:"
  sleep 2
done

判断:

不要把单个 tx bitrate 当作平均值。它是最后一次采样的状态,必须按时间连续观察。

4. 字节对账:低速率还是重传

在一次内网下载期间同时记录:

如果 AP 发出和客户端收到大致相同:

如果 AP 发出的字节远大于客户端收到:

5. A/B 实验一:vow_atf 与速率恢复

在 MT7986 + mt76 的本次实测中,vow_atf=1 时客户端空闲后掉到 MCS0,连续流量也可能无法恢复; 把开关临时改为 0 后,约 15–20 秒可爬回高速率。

先读取,不修改:

for f in /sys/kernel/debug/ieee80211/phy*/mt76/vow_atf; do
  echo "$f: $(cat "$f")"
done

临时 A/B(只在研究设备上做,记录原值):

echo 0 > /sys/kernel/debug/ieee80211/phy*/mt76/vow_atf
# 空闲 60 秒,然后连续做 6 次 6 秒内网下载
# 记录每次 tx bitrate、实际吞吐、AP TX 字节、客户端 RX 字节

恢复原值:

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

工具包里的 mt76-wifi-tune 和 watchdog 用于持久化关闭,但不是通用补丁。不同固件、芯片和客户端可能 没有相同行为,必须保留原值和回退路径。工具包: tar.gz / SHA-256。

6. A/B 实验二:客户端宽度与 BSS 宽度

查看射频和站点信息:

iw dev <ap> info
iw dev <ap> station dump | grep -E "Station|bitrate|signal"
iwinfo <ap> info

在本次案例中:

这不是“40MHz 永远更差”或“80MHz 永远更好”的结论:

切换前保存配置,切换后确认接口名、CSI daemon 的带宽元数据和客户端关联没有丢失。

7. 十分钟决策流程

慢
├─ 有线也慢?
│  ├─ 查 WAN/LAN speed、link partner、错误计数、ISP
│  └─ Wi-Fi 不是第一嫌疑
├─ 只有 Wi-Fi 下行慢?
│  ├─ tx bitrate 掉到 MCS0?
│  │  ├─ 空闲触发且不恢复 → 做 vow_atf A/B
│  │  └─ 40MHz 客户端在 80MHz BSS → 做宽度 A/B
│  ├─ 两端字节差很大 → 查重传/信号/干扰
│  └─ 全部客户端慢 → 查信道/DFS/空口
└─ Speedtest 慢、内网正常 → 查公网/服务器/DNS

8. 结果怎么写

每次 A/B 至少保存:

字段 示例
路由器与固件 GL-MT6000 / OpenWrt commit / mt76 version
客户端 芯片、NSS、协商宽度、省电设置
射频 信道、带宽、国家码、TX power
时间 UTC、空闲时长、每次下载时长
PHY tx/rx bitrate 的连续样本
吞吐 6 次实际 Mbps,不只写最大值
字节 AP TX / 客户端 RX / 重传
结论 相关条件与未验证的机制分开写

9. 不该直接做的事

先验证,再持久化;先写失败记录,再发布“优化脚本”。

相关:CSI 上线后 Wi-Fi 变慢的完整排障 · mt76 速率控制分析 · 80 与 40MHz 取舍

参考与数据来源

本文的每条外部结论都标注来源与证据等级(分级标准);标注 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 能力的补丁正是在这一代码库之上编排。