前因

给小米 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 → Mac5.44 MB/sHub 无问题
RTL8152 → Mi8 直插702 KB/sRx status -71 协议错误
RTL8152 → Hub → Mi85–13 KB/sHub 放大问题,几乎断流

根因:骁龙 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 = -71

rx_status = -71 是 USB 协议层面的 EPROTO(Protocol Error)。批量传输出错 -> 驱动重传 -> 小核软中断满载 -> 速度雪崩。

同时发现 USB 供电异常:

  • usbin-uv 欠压事件:95 次
  • usbin-icl-change 限流调整:1018 次
  • USB autosuspend 在 2 秒闲置后反复激活/睡眠

你试过的其他芯片

芯片驱动结果
RTL8152r8152 (kernel 4.9 旧版)⚠️ 702 KB/s, Rx -71
RTL8153r8152 (缺 PID)❌ 不识别
AX88772Dasix (缺 PID)❌ 不工作
AX88179ax88179_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(还在占坑)
  • 加上其他系统进程(WeatherWidgetNewsTodaytrustd 等)又几十个

崩溃机理

我给 xray 开 47 条连接 → 测试完不优雅关闭
  → xray 默认连接池(~256 条)僵尸堆积
    → 文件描述符(ulimit)耗尽
      → xray 无法建立新连接
        → 代理崩了 → 所有流量走代理 → 全部断网

/proc/interrupts 显示软中断全挤在 Core 0(小核)上,xray 在 fd 吃满后拒绝新连接,优雅降级失效。

删除 + 重启为什么恢复

重启清空了:

  1. 所有 TIME_WAIT / CLOSE_WAIT 僵尸连接
  2. 文件描述符表归零
  3. 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,什么方案都突不破。

教训总结

  1. 小米 8 是 USB 2.0,任何 USB 网卡方案都跑不满 300Mbps。不要被 “SD845 支持 USB 3.1” 骗了。
  2. RTL8152 + SD845 是已知的不兼容组合(DWC3 + r8152 驱动在旧内核上的 EPROTO bug)。不需要继续折腾。
  3. AX88179 是唯一确认在 Mi8 上免驱且能跑的千兆芯片,但也只有 ~280Mbps 且 4.9 内核版本有高负载断连风险。
  4. 百兆 RTL8152B 反而是体验最好的——95Mbps 不给系统压力,PID 完整,低功耗,便宜。
  5. 重启是万能的——文件描述符耗尽、连接表碎片、软中断卡死,重启全清。
  6. xray 连接池需要合理配置——如果不设 connPool/connIddle 上限,高并发测试可以轻松撑爆 fd。

遗留疑点

  • 是否有用户空间的 USB 网卡替代方案?(不依赖内核驱动模块)
  • 4.9 内核上的 RTL8153 PID 能否通过手动 new_id sysfs 注入激活?
  • r8152 驱动的刷新版本能否交叉编译到 Android 内核 4.9?(wget/realtek-r8152-linux 需要 5.x API)