如何排查 USB 掉线和读取速度骤降
卡用着用着就停了、随机掉线,或者用到一半读取速度掉下来。教你分辨选择性暂停、控制器共用、线材问题和卡过热,并留下供应商用得上的证据。
简短回答
DMA 的间歇性故障几乎都出在 USB 链路而不是卡本身,原因不外乎四种:选择性暂停、控制器共用、线材质量勉强和发热。一次只改一个变量,并记录每次掉线发生的时间,因为时间规律能把它们区分开。
本页内容11
间歇性掉线真的是随机的吗?
时好时坏的故障感觉上是随机的,但通常并不是。四种原因几乎涵盖了所有这类故障,而且每种原因都有自己的时间特征。动手改任何东西之前,先花一次完整的使用过程专门观察。记下每次掉线的具体时间(几点几分)、当时在做什么,以及机器已经运行了多久。就这一份记录,能帮你省下三个晚上换配件的时间。
你的症状对应哪种原因?
对照故障的表现形式,而不是报错的措辞,然后看最右边一列,那里给出能区分该原因的最省事的测试方法。
| 故障表现 | 可能原因 | 测试方法 |
|---|---|---|
| 能用,空闲几分钟后失效,重新插拔后恢复 | USB 选择性暂停或链路电源管理让桥接芯片进入了休眠 | 取消设备管理器里该设备的节能勾选项,并关闭当前电源计划中的 USB 选择性暂停设置,然后再空闲一次测试 |
| 机器上别的东西一忙起来就掉——摄像头、采集卡、移动硬盘 | USB 控制器共用:带宽或中断争用 | 把卡换到另一个控制器上的端口,或者拔掉另一个设备后重复测试 |
| 随机掉线,和负载、空闲时间都无关,动一下线会更严重 | 线材或接口问题:只能充电的线、线太细、线太长,或者接口已经松了 | 换一根确认正常的短数据线,一整次使用过程中都别碰它 |
| 每次使用都在一段固定的升温时间后失效,分钟数大致相同 | 发热:卡或桥接芯片装在没有风道的机箱里 | 打开侧板运行,让板卡上有空气流动。如果出故障前的时长变了,就是发热 |
| 读取速度从第一秒起就很低,而且一直上不去 | 链路协商成了 USB 2,或者中间经过了集线器或前置面板接口 | 检查协商速率,改为直连后置 USB 3 口 |
| 游戏一切换场景或加载,所有东西就掉 | 读取了未映射的物理内存导致链路挂掉,根本不是 USB 的问题 | 使用内存映射后重新测试。这种情况经常被误判成线的问题 |
两种原因可能叠加:共用控制器上再接一根质量勉强的线,失效的表现会和任何单一原因都对不上。
什么是 USB 选择性暂停?
Windows 可以给看起来处于空闲状态的 USB 设备断电,而 USB 3 链路在此之上还有自己的低功耗状态。对鼠标来说这看不出任何区别,但一个马上要承担持续数据流的桥接芯片唤醒得很慢,慢到软件会认为传输失败而直接放弃。需要关掉两个开关:设备管理器里该设备“电源管理”选项卡上的勾选项,以及当前电源计划里的 USB 选择性暂停设置。先在副机(第二台电脑)上把两个都关掉并重新测试,然后再去怀疑硬件方面的问题。
会不会是 USB 线的问题?
USB-C 线不能随便互换,因为很多线只接了充电线路,根本没有 SuperSpeed 差分对。很多便宜的数据线在长距离下也撑不住 USB 3 链路。一个被斜着拽了半年的接口,一震动就会掉线。留一根确认没问题的短线作为基准,一出故障就用它来测试。如果换上它之后表现变了,就别再排查其他东西了。
发热会导致卡掉线吗?
FPGA 和 USB 3 桥接芯片都有实打实的功耗。一块紧贴着发热显卡的半高板卡,放在侧面没有进风的机箱里,热量根本无处可去。判断依据是时间:每次使用时,故障都在大致相同的时长后出现,机器关机一段时间后又恢复正常。我们不给出具体的温度数值,因为它因板而异,而且大家贴出来的数字没有一个是在你那块板上测的。不如直接验证这个猜想:打开机箱,拿风扇对着板卡吹,看出故障前的时长有没有变化。
如何留下掉线的证据
以下只读命令在副机(注意是副机)上运行。使用前运行一次,掉线后立刻再运行一次,两次的输出都要保留,因为两者之间的差异就是证据。
REM Which USB controllers exist, so you can see what shares what
powershell -c "Get-CimInstance Win32_USBController | Select-Object Name, DeviceID"
REM Every USB device and its current status. Look for Error or Unknown
powershell -c "Get-PnpDevice -Class USB | Select-Object Status, Class, FriendlyName, InstanceId"
REM Is the FTDI bridge still present right now?
powershell -c "Get-PnpDevice | Where-Object FriendlyName -like '*FT601*' | Format-List"
REM Recent device-installation and PnP configuration events
powershell -c "Get-WinEvent -LogName Microsoft-Windows-Kernel-PnP/Configuration -MaxEvents 40 | Format-Table TimeCreated, Id, Message -Auto"
REM Surprise-removal and driver-load failures in the System log
powershell -c "Get-WinEvent -FilterHashtable @{LogName='System'; StartTime=(Get-Date).AddHours(-6)} -MaxEvents 60 | Where-Object ProviderName -match 'USB|PnP|Disk' | Format-Table TimeCreated, Id, ProviderName"
REM Which sleep states this machine supports, which tells you whether suspend can be in play
powercfg /a如何写一份供应商用得上的掉线日志
三次使用的日志比三页文字描述更有价值,因为有了日志,工单就不再是来回沟通,而是能直接修。
- 写下这次使用的开始时间,以及机器已经运行了多久
- 记下使用开始时的读取速度数值
- 掉线时记下具体时间和当时的情况:空闲、加载中、切换场景,还是在用别的设备
- 以文本形式复制软件输出的报错原文
- 运行状态和事件查询命令,把输出保存在对应的时间戳旁边
- 只改一个变量,比如线、端口、电源设置或散热,然后重复一次使用过程
- 发送日志时注明改了哪一项,这样看日志的人看到的是因果关系,而不是你所有设备的清单
按顺序排除这些原因
清单从代价最小、最常见的原因开始,大多数掉线工单排到第三项就解决了。
- USB 选择性暂停已关闭:设备自身的勾选项和电源计划里的设置都关了
- 卡直接插在后置 USB 3 口上,所有集线器、扩展坞和延长线都已拆掉
- 用一根确认正常的短数据线作为之后所有测试的基准
- 卡独占一个 USB 控制器,繁忙的设备都挪到了别处
- 正在使用内存映射,读取链路永远不会闯进未映射的区段
- 卡上有气流经过,而且是在买任何东西之前先打开侧板测试过的
- 每次测试之间两台机器都正确地冷启动,而不是重启
USB 掉线常见问题
掉线会不会说明我被检测到了?
不会。USB 设备从副机上消失是本地硬件链路事件,和移动硬盘掉线是同一类情况。在没装游戏的机器上也会发生。
接口不够用的话,带独立供电的集线器有帮助吗?
集线器终究是链路里多出来的一环,也是任何人都会首先让你拆掉的东西。把后置接口留给卡,其他设备都接到集线器上,别反过来。
在这种速率下,线长真的有影响吗?
有。USB 3 信号能容忍的线长本来就不多,便宜的线在你再加一米之前就已经用掉了大半余量。卡的线要尽量短,并把线长当作一个值得测试的变量。
用到一半读取速度减半,但没有断开,这是同一个问题吗?
属于同一类问题:速度骤降但不断开,通常意味着控制器上有争用,或者链路某处因发热而降频。用时间记录来区分这两者。
要不要把 FTDI 驱动更新到最新版?
用订单附带的版本。新驱动搭配旧版本的软件,是已知会引发怪异间歇性问题的原因,而这正是你要排除的东西。
资料来源
四种原因及其时间规律来自实测:是团队把真实的掉线案例逐一对应到选择性暂停、控制器共用、线材和发热之后总结出来的。
- 01
继续阅读
仍然没有解决?在 Discord 提交工单
全部指南