为啥用USB拷文件的速度远低于理论值?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为啥用USB拷文件的速度远低于理论值?相关的知识,希望对你有一定的参考价值。

持续传输和随机传输是不同的,一般产品的标称传输速率是持续传输速率(单个大文件),这也是为什么消费者感觉标称速度与实际速度落差巨大的关系 。如果是大量小文件拷贝比如相机存储卡里的大量照片,那么速度打折是正常的,毕竟一般的u盘soc的处理能力有限和体积关系造成结构上只能双面双贴也就才两通道自然速率提升不起来。pc里的性能就是短板效应明显,即使你的u盘自身速率很快但也受限与连接平台及总线速率或平台内的存储器(例如hdd,hdd的寻道时间和响应速率随机读写缓慢)的速率造成传输速率慢。

参考技术A

首先实际速度肯定低于理论速度,比如百兆以太网,能到10MB/s的速度就不错了,但是为什么USB差距这么大,主要是USB传输的无用包实在是太多了。对于USB2.0,480Mbps是指总线的频率,也就说,总线信号每秒最多能传输这么多bit,这些信号包括控制信号和数据信号,现在来看看那数据信号都有什么:每125us就有一个micro frame(微帧),每1ms还有一个frame,在USB规范里叫SOF,类似于一种同步信号。标准USB传输过程:真正有效的数据就在data0/1里,如果一个data包放不下,那么会放到多个data里。传输之前,对于2.0设备还要发起一个ping请求,确认设备是活着的。USB不是一个全双工设备,通常的行为是这样:总线空闲,主机端请求数据,总线空闲,设备回应,总线空闲,主机准备接受数据,总线开始传输,传输完成总线空闲,主机检查数据无误,给设备回应说数据传输正常结束(不需要重传)。对于U盘本身:由于U盘规范的原因,大多数操作系统要求定期检查U盘状态(是否是alive的),这个请求叫做test unit ready(各个OS都有,大家就不要吵了,U盘规范上的)。同时传输512字节(一个扇区的数据)要包括命令标识,命令号,LBN(逻辑块地址)以及乱七八糟一堆堆的东西,一个扇区大概需要将近600字节的数据。同时主机端还要给予相应的回应。至于前面有人说bulk传输不会占满带宽,这也不是完全对的,确实USB传输分为interrupt传输,bulk传输,ISO传输,但是只有interrupt预留了很少,ISO会保留30%左右,但当没有ISO传输存在的时候,bulk是可以占掉这一部分的。这部分就是数据传输需要的时间,算起来麻烦,但是看到前面有一个2.083就能看出来,传输一个bit基本上需要2.083倍的时间,所以,简单的把480Mbps除以2.083,再转换成字节大概是:28.8MB/s,也就是说,最多就这么快,再刨除bulk-only模式里的那一堆堆的多余指令:一个包需要16个字节左右,Windows一次请求是4KB(可能是为了页对齐),再浪费掉1%左右的时间,以及host delay,也就是主机的校验延迟,那么实际速度就20多MB/s,不管是读还是写。但是我知道肯定有人说,测得的实际速度比这个快,当然了,我也见过比这个快的,为什么,恰好我做过Windows里文件系统开发,也研究过Linux里的fat驱动,先说Linux,它很变态,你的写操作不一定真正写到磁盘上(证据我有,因为我有USB分析仪,能抓总线传输),Linux会在后台慢慢的写,前台看上去已经写进去。Windows比Linux强一些,但是基于强大的预读和缓存,Windows也不是实时读写,所以会看到数字有跳动的情况(Windows内核里cc开头的函数就是干这个的)。我们开发产品的过程中,看到过的最高总线利用率也就是80%左右(分析仪获得的总线数据),也就是说28MB的速度可能还要打个八折,崩溃去吧。另外,U盘(flash介质)会更慢一些,因为U盘本身写的就慢,SSD和硬盘会好些,虽然SSD也是flash,但是SSD缓存大,并且有保障机制。所以,作为一个USB驱动的开发人员(维护过EHCI驱动,改过U盘驱动,写过鼠标、FTDI串口驱动,改过USBD),我觉得U盘的速度是很坑爹的。

参考技术B

不是真的,同样的硬件chipset的情况下,linux,mac,win速度都差不多,win7在读写大文件速度上要快一些。有专业评测发表,请上网搜索先,请不要据说。考虑到USB2.0 High Speed 480Mbps的理论速度,40MB/S基本就是USB2.0读写速度的上限。我记得USB2.0协议规定要留10%的带宽给control,bulk传输也不能占用所有带宽.我见过自己装的机器,用些烂主板,电气性能不行,USB读写确实很慢,比USB1.1强不了多少,这个要怪硬件。还有人的贪便宜买的烂U盘,读写速度就是不行我测试了手头的笔记本Acer 4750G, Intel(R) 6 Series/C200 Series Chipset,Win7SP1 64bit, 4G内存, USB2.0 Zynet移动硬盘盒(里面装500G SATA笔记本硬盘,硬盘速度足够快,瓶颈在USB接口)拷贝一个大电影(2GB)。结果如下:读速度大概是30~31MB/s ; 写比较诡异,一开始>70MB/s, 10秒后降到稳定30MB/s. 写速度一开始比较大应该是用了内存做缓存。

以上是关于为啥用USB拷文件的速度远低于理论值?的主要内容,如果未能解决你的问题,请参考以下文章

cyusb3014接u盘为啥是2.0

为啥HDFS写入速度如此之慢

桌面云维常用的理论知识

adb push命令的传输速度问题

什么是USB Type-C接口有什么用

上位机用USB做虚拟串口,总算抓到一个纯代码的总结了,没有坑的完美解决。