动机
如果信号传输速率为480 MBit/s,USB 2.0设备应能够以高达60 MB/s的速率传输数据。然而,今天的设备在阅读时似乎限制在30-42 MB/s[维基:USB].这是30%的开销。
USB 2.0已经成为外部设备的事实上的标准超过10年。从早期开始,USB接口最重要的应用之一就是便携式存储。不幸的是,USB 2.0很快就成为了这些带宽要求很高的应用程序的速度限制瓶颈,例如,今天的硬盘在连续读取时能够超过90mb /s。考虑到长期的市场存在和对更高带宽的持续需求,我们应该预期USB 2.0生态系统已经经过多年的优化,达到了接近理论极限的读取性能。
在我们的例子中,理论上的最大带宽是多少?每个协议都有开销,包括USB,根据官方的USB 2.0标准,它是53.248 MB/s [2、表5 - 10]。这意味着从理论上讲今天的USB 2.0设备可能会快25%。
分析
为了接近问题的根源,下面的分析将演示从存储设备读取顺序数据时总线上发生了什么。该协议是逐层分解的,我们特别感兴趣的问题是,为什么53.248 MB/s是批量上行设备的最大理论数字。最后,我们将讨论分析的局限性,这可能会给我们一些额外开销的提示。
笔记
整个问题只使用十进制前缀。
USB 2.0主机能够处理多个设备(通过集线器)和每个设备的多个端点。端点可以在不同的传输模式下运行。我们将把我们的分析限制在单个设备上,该设备直接连接到主机,并且能够在高速模式下通过上游批量端点连续发送完整的数据包。
框架
USB高速通信采用固定帧结构同步。每帧长度为125 us,以帧开始包(SOF)开始,并受到帧结束序列(EOF)的限制。每个包以SYNC开始,以EOF结束。为了清晰起见,这些序列已经添加到图表中。EOP在大小和数据包数据上是可变的,对于SOF它总是5字节。
在新选项卡中打开图像,查看更大的版本。
交易
USB是一个主驱动协议,每个事务都是由主机发起的。SOF和EOF之间的时隙可以用于USB事务。然而,SOF和EOF的时间是非常严格的,主机只启动可以在空闲时隙内完全完成的事务。
我们感兴趣的事务是一个成功的批量输入事务。该事务从tocken数据包in开始,然后主机等待数据包DATA0/DATA1,并通过握手数据包ACK确认传输。所有这些数据包的EOP为1到8位,具体取决于数据包数据,我们在此假设最坏的情况。
在这三个包之间,我们必须考虑等待时间。这些数据位于主机IN包的最后一位和设备DATA0包的第一个比特之间,以及DATA0包的最后一位和ACK包的第一个比特之间。我们不需要考虑任何进一步的延迟,因为主机可以在发送ACK后立即开始发送下一个IN。电缆传输时间被定义为最大18ns。
一个批量传输可以发送每个IN事务最多512字节。主机将尝试在帧分隔符之间发出尽可能多的事务。尽管批量传输具有较低的优先级,但当没有其他事务挂起时,它会占用槽中的所有可用时间。
为了确保适当的时钟恢复,标准定义了方法调用位填充。当包需要一个非常长的相同输出序列时,就会添加一个额外的侧面。这确保了在最多6位之后的一个侧面。在最坏的情况下,这将增加总包大小7/6。EOP不受钻头填充的影响。
在新选项卡中打开图像,查看更大的版本。
带宽计算
一个bulk IN事务的开销为24字节,有效负载为512字节。总共是536个字节。之间的时隙是7487字节宽。如果不需要位填充,那么有13.968个包的空间。拥有8000微帧每秒,我们可以以13 * 512 * 8000 B/s = 53.248 MB/s的速度读取数据
对于完全随机数据,我们希望在6个连续位的2**6=64序列中的一个序列中需要位填充。增加了(63*6+7)/(64*6)。将所有需要进行位填充的字节乘以该数字得到的总事务长度为(19+512)*(63*6+7)/(64*6)+5=537.38字节。这导致每微帧13.932个数据包。
这些计算中还遗漏了另一种特殊情况。该标准定义了设备最大响应时间为192位倍[2,第7.1.19.2章]。如果设备需要完整的响应时间,则在决定最后一个包是否仍适合帧时必须考虑这一点。我们可以使用7439字节的窗口来解释这一点。但是,得到的带宽是相同的。
剩下的
错误检测和恢复尚未涉及。可能错误发生的频率足够高,或者错误恢复的时间足够长,从而对平均性能产生影响。
我们假设主机和设备在数据包和交易后立即反应。我个人认为,在包或事务的末端,任何一方都不需要大的处理任务,因此,我想不出任何理由,为什么主机或设备不能用充分优化的硬件实现立即响应。特别是在正常操作中,大部分的簿记和错误检测工作可以在交易过程中完成,下一个数据包和交易可以排队。
没有考虑其他端点或其他通信的传输。也许存储设备的标准协议需要一些连续的侧信道通信,这消耗了宝贵的槽时间。
对于设备驱动程序或文件系统层的存储设备,可能会有额外的协议开销。(数据包有效负载==存储数据?)
问题
为什么今天的实现不能实现53mb /s的流呢?
当今实施中的瓶颈在哪里?
还有一个潜在的后续问题:为什么没有人试图消除这种瓶颈?
参考文献
[1]官方的USB 2.0规范
[2]规范的快速pdf镜像