动机
信号速率为 480 MBit/s 的 USB 2.0 设备应该能够以高达 60 MB/s 的速度传输数据。然而,今天的设备在阅读 [ Wiki:USB ]时似乎被限制在 30-42 MB/s 。这是 30% 的开销。
十多年来,USB 2.0 一直是外部设备的事实标准。从早期开始,USB 接口最重要的应用之一就是便携式存储。不幸的是,USB 2.0 很快成为这些带宽要求高的应用程序的速度限制瓶颈,例如,今天的 HDD 能够以超过 90 MB/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 开头,并以 End-Of-Packet (EOF) 结尾。为清楚起见,这些序列已添加到图表中。EOP 在大小和数据包数据方面是可变的,对于 SOF,它始终是 5 个字节。
在新选项卡中打开图像以查看更大的版本。
交易
USB 是主机驱动的协议,每个事务都由主机发起。SOF 和 EOF 之间的时隙可用于 USB 事务。但是 SOF 和 EOF 的时间安排非常严格,主机只启动可以在空闲时间段内完全完成的事务。
我们感兴趣的事务是一个成功的批量 IN 事务。事务以令牌包 IN 开始,然后主机等待数据包 DATA0/DATA1 并使用握手包 ACK 确认传输。所有这些数据包的 EOP 为 1 到 8 位,具体取决于数据包数据,我们在这里假设最坏的情况。
在这三个数据包之间,我们必须考虑等待时间。它们位于来自主机的 IN 数据包的最后一位与设备的 DATA0 数据包的第一位之间以及 DATA0 数据包的最后一位与 ACK 数据包的第一位之间。我们不必考虑任何进一步的延迟,因为主机可以在发送 ACK 后立即开始发送下一个 IN。电缆传输时间定义为最大 18 ns。
批量传输每个 IN 事务最多可以发送 512 个字节。并且主机将尝试在帧分隔符之间发出尽可能多的事务。尽管批量传输的优先级较低,但当没有其他事务待处理时,它可能会占用插槽中的所有可用时间。
为了确保正确的时钟恢复,标准定义了一种方法调用位填充。当数据包需要非常长的相同输出序列时,会添加一个额外的侧翼。这确保了最多 6 位后的侧面。在最坏的情况下,这会使总数据包大小增加 7/6。EOP 不受位填充的影响。
在新选项卡中打开图像以查看更大的版本。
带宽计算
批量 IN 事务具有 24 字节的开销和 512 字节的有效负载。总共有 536 个字节。之间的时隙为 7487 字节宽。无需位填充,就有 13.968 个数据包的空间。每秒有 8000 个微帧,我们可以读取 13 * 512 * 8000 B/s = 53.248 MB/s 的数据
对于完全随机的数据,我们预计在 2**6 = 64 个 6 个连续位的序列之一中需要进行位填充。这增加了 (63 * 6 + 7) / (64 * 6)。将所有需要进行位填充的字节乘以该数字得出的总交易长度为 (19 + 512) * (63 * 6 + 7) / (64 * 6) + 5 = 537.38 字节。这导致每个微帧有 13.932 个数据包。
这些计算中缺少另一种特殊情况。该标准定义了 192 位时间的最大设备响应时间 [ 2,第 7.1.19.2 章]。在决定最后一个包是否仍然适合框架时,必须考虑这一点,以防设备需要完整的响应时间。我们可以通过使用 7439 字节的窗口来解释这一点。得到的带宽虽然是相同的。
还剩下什么
错误检测和恢复尚未涵盖。也许错误足够频繁,或者错误恢复非常耗时,足以影响平均性能。
我们假设在数据包和交易之后主机和设备会立即做出反应。我个人认为在任何一方的数据包或事务结束时都不需要大型处理任务,因此我想不出主机或设备不能通过充分优化的硬件实现立即响应的任何原因。特别是在正常操作中,大部分簿记和错误检测工作可以在事务期间完成,下一个数据包和事务可以排队。
尚未考虑其他端点的传输或其他通信。也许存储设备的标准协议需要一些持续的边信道通信,这会消耗宝贵的时隙。
设备驱动程序或文件系统层的存储设备可能会有额外的协议开销。(数据包有效负载 == 存储数据?)
题
为什么今天的实现不能以 53 MB/s 的速度进行流式传输?
当今实现的瓶颈在哪里?
还有一个潜在的后续行动:为什么没有人试图消除这样的瓶颈?
参考
[2]规范的快速pdf镜像