前因
给小米 8(LineageOS 22.2, kernel 4.9.337)配 USB 有线网卡以解决 WiFi 不稳的问题。
先快速排障,然后……」断网了。
事故时间线
| 时间 | 事件 |
|---|---|
| 2026-07-01 | 接入 RTL8152 USB 网卡测试速度 |
| → | RTL8152 直插 Mac:6.97 MB/s ✅ |
| → | RTL8152 过 Hub → Mi8:5 KB/s ❌ |
| → | 连测多次 curl/speed,连接暴涨 |
| → | 断网,仅删除全部 xray 配置 + 重启恢复 |
恢复操作附带误删了一些网络偏好设置,但至少网络正常了。
第一层:USB 网卡兼容性——「为什么 RTL8152 在 Mi8 上这么慢」
四种接法速度对比
| 接线 | 速度 | 结论 |
|---|---|---|
| RTL8152 → Mac 直插 | 6.97 MB/s | 网卡本身正常 |
| RTL8152 → Hub → Mac | 5.44 MB/s | Hub 无问题 |
| RTL8152 → Mi8 直插 | 702 KB/s | Rx status -71 协议错误 |
| RTL8152 → Hub → Mi8 | 5–13 KB/s | Hub 放大问题,几乎断流 |
根因:骁龙 845 的 DWC3 USB 控制器 + 旧内核 4.9 的 r8152 驱动存在底层兼容性问题。
具体症状:
[ +0.000134] r8152 2-1:2.0: rx_status = -71
[ +0.000001] r8152 2-1:2.0: rx_status = -71
[ +0.000001] r8152 2-1:2.0: rx_status = -71rx_status = -71 是 USB 协议层面的 EPROTO(Protocol Error)。批量传输出错 -> 驱动重传 -> 小核软中断满载 -> 速度雪崩。
同时发现 USB 供电异常:
usbin-uv欠压事件:95 次usbin-icl-change限流调整:1018 次- USB autosuspend 在 2 秒闲置后反复激活/睡眠
你试过的其他芯片
| 芯片 | 驱动 | 结果 |
|---|---|---|
| RTL8152 | r8152 (kernel 4.9 旧版) | ⚠️ 702 KB/s, Rx -71 |
| RTL8153 | r8152 (缺 PID) | ❌ 不识别 |
| AX88772D | asix (缺 PID) | ❌ 不工作 |
| AX88179 | ax88179_178a (独立驱动) | ✅ 能认但 ~280Mbps 上限 + 旧驱动高负载断连风险 |
关键发现: 小米 8 的 USB-C 口物理上是 USB 2.0(SuperSpeed 差分对未焊接)。SD845 的 DWC3 控制器支持 USB 3.1 Gen 1(5Gbps),但小米没把信号线连出来。这意味着任何 USB 网卡在 Mi8 上都受限在 USB 2.0(480 Mbps 理论上限)。
最终结论:AX88179 是当下最不坏的方案——能认、能跑,但 4.9 内核上的 ax88179_178a 驱动在高负载下有 FIFO 溢出/死锁的已知问题。百兆 RTL8152B 反而是最匹配的——95Mbps 跑不满 USB 2.0 带宽、不给小核软中断压力、PID 符号完整。
第二层:连接池爆炸——「你霸占了多少连接池?」
发生了什么
在反复测试网络速度的过程中,我写的 Python SOCKS5 代理脚本(PID 63416)向 xray 的 10808 端口发起了 47 个连接:
- 40 个已 CLOSED(测试完就挂了,但 xray 的连接池还记着)
- 3 个 ESTABLISHED(还在占坑)
- 加上其他系统进程(
WeatherWidget、NewsToday、trustd等)又几十个
崩溃机理
我给 xray 开 47 条连接 → 测试完不优雅关闭
→ xray 默认连接池(~256 条)僵尸堆积
→ 文件描述符(ulimit)耗尽
→ xray 无法建立新连接
→ 代理崩了 → 所有流量走代理 → 全部断网/proc/interrupts 显示软中断全挤在 Core 0(小核)上,xray 在 fd 吃满后拒绝新连接,优雅降级失效。
删除 + 重启为什么恢复
重启清空了:
- 所有
TIME_WAIT/CLOSE_WAIT僵尸连接 - 文件描述符表归零
- xray 连接池重建
第三层:280Mbps 的上限——「走 USB 2.0 的天花板」
ADB over USB 走 RNDIS 跑出了多少
用 adb reverse + SOCKS5 代理把 Mi8 路由到 Mac WiFi 出口,然后从 Mi8 下载 Mac 本地 HTTP 服务器的文件:
34,244,458 B/s ≈ 34.2 MB/s ≈ 274 Mbps
**HTTP 200 ✅**这是 USB 2.0 的理论天花板(480 Mbps 扣除协议开销 ≈ 280 Mbps 实用上限)。不是软中断瓶颈,不是 DWC3 问题,就是物理层限制。
我之前的分析为什么错了
我最初认为 280Mbps 是 softirq 瓶颈(软中断被钉在 Core 0 小核上),用户纠正:
“SD845 的 DWC3 控制器不是垃圾,能跑 ~300MB/s(2400Mbps)。网络慢是因为包碎片产生高频中断,小核处理不进来。换 USB Tethering(RNDIS)走高通硬件 DMA 绕过小核,可以直接跑满 ~400Mbps。”
但是小米 8 是 USB 2.0。 所以这个讨论是 moot——硬件上限就在 ~280Mbps,什么方案都突不破。
教训总结
- 小米 8 是 USB 2.0,任何 USB 网卡方案都跑不满 300Mbps。不要被 “SD845 支持 USB 3.1” 骗了。
- RTL8152 + SD845 是已知的不兼容组合(DWC3 + r8152 驱动在旧内核上的 EPROTO bug)。不需要继续折腾。
- AX88179 是唯一确认在 Mi8 上免驱且能跑的千兆芯片,但也只有 ~280Mbps 且 4.9 内核版本有高负载断连风险。
- 百兆 RTL8152B 反而是体验最好的——95Mbps 不给系统压力,PID 完整,低功耗,便宜。
- 重启是万能的——文件描述符耗尽、连接表碎片、软中断卡死,重启全清。
- xray 连接池需要合理配置——如果不设
connPool/connIddle上限,高并发测试可以轻松撑爆 fd。
遗留疑点
- 是否有用户空间的 USB 网卡替代方案?(不依赖内核驱动模块)
- 4.9 内核上的 RTL8153 PID 能否通过手动
new_idsysfs 注入激活? r8152驱动的刷新版本能否交叉编译到 Android 内核 4.9?(wget/realtek-r8152-linux 需要 5.x API)