50
\$\begingroup\$

动机

如果信号传输速率为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镜像

\ \ endgroup \美元
5
  • 2
    \$\begingroup\$ 你知道USB 2.0已经被更快的USB 3.0取代了,不是吗? \ \ endgroup \美元- - - - - -琼尼船 12年1月7日4点24分
  • 11
    \$\begingroup\$ 从研究的深度和对USB标准的熟悉程度来看,克里斯显然熟悉USB 3.0,@jonnyboots。 \ \ endgroup \美元- - - - - -泰布鲁 1月7日12点19分22分
  • 6
    \$\begingroup\$ @JonnyBoats,对此的合理回应是:“你知道大多数电脑仍然使用USB2.0,一个标准更新并不能让所有硬件立即升级吗?”我怀疑这是有意的,但你所写的评论以目前的形式来看似乎有点侮辱人。 \ \ endgroup \美元- - - - - -Kortuk 1月7日12点19分33分
  • \$\begingroup\$ 科特克:谢谢你指出这一点,我并不想侮辱任何人。我的观点是,USB就像大多数规格一样,是随着时间而发展的。2.0比1.0快,3.0正在进入市场,而且更快。我想会有更多的公司专注于采用3.0,而不是改进2.0 \ \ endgroup \美元- - - - - -琼尼船 12年1月8日0:28
  • 1
    \$\begingroup\$ 虽然在微帧中可能有13个包的空间,但许多主机控制器实际上无法做到这一点。早在2006年,大多数都被限制在8英寸和10英寸——我不知道从那时起这是否有很大的变化。 \ \ endgroup \美元- - - - - -user2793784 2014年2月18日22:16
16
\$\begingroup\$

在我生命中的某个时刻,我曾为一家大型半公司经营USB业务。我记得最好的结果是NEC SATA控制器能够推动320Mbps的实际数据吞吐量为大容量存储,可能目前的SATA驱动器能够或稍多一点。这是使用BOT(一种在USB上运行的大容量存储协议)。

我可以给出一个技术上的详细答案,但我想你可以自己推断。你需要看到的是,这是一个生态系统游戏,任何显著的改进都需要像微软这样的公司改变他们的堆栈,优化等等,而这是不可能发生的。互操作性远比速度重要。因为现有的堆栈小心地掩盖了大量设备的错误,因为当USB2规范出来的时候,可能最初的设备并没有真的很好地确认规范,因为规范有bug,认证系统有bug,等等。如果你使用Linux或定制的MS USB主机驱动和快速设备控制器来构建一个自制系统,你可能会接近理论极限。

在流传输方面,ISO应该非常快,但控制器没有很好地实现,因为95%的应用程序使用批量传输。

作为一个额外的见解,例如,如果你去建立一个集线器IC今天,如果你遵循规格到点,你将几乎卖零芯片。如果你知道市场上的所有漏洞,并确保你的集线器IC能够容忍它们,你可能就能进入市场。我今天仍然很惊讶,USB是如何工作的给定数量的坏软件和芯片。

\ \ endgroup \美元
    13
    \$\begingroup\$

    这是一个非常古老的话题,但还没有答案。这是我的尝试:

    为什么今天的实现不能实现53mb /s的流呢?

    计算几乎是好的,但你忘记了一些事情在帧标记之间的可用字节数:

    1. 每个微帧有两个阈值,分别为EOF1和EOF2。在EOF1点或之后不能出现总线活跃度。这一点的位置是一个复杂的事情,但典型的位置是560位之前的下一个SOF。主机必须以这样一种方式调度它的事务,即来自通道的任何可能的响应都不会达到这个阈值。它消耗了您计算的7487字节中的70个字节。

    2. 假设是“随机数据”。这是完全没有根据的,数据可以是任何东西。因此,主机必须为最坏情况的负载调度事务,最大的位填充开销为512*7/6=~ 600字节。加上您正确计算的24字节的事务开销。这就得到(7487-70)/624 =每微帧11.88个事务。

    3. 主机被要求为任何其他活动的控制事务预留大约10%的带宽,所以我们得到大约10.7个事务。

    4. 主机控制器在管理其链表时也有一定的延迟,因此事务之间存在额外的间隙。

    5. 该设备可以是5集线器/跳远离根,和响应延迟可以高达1700 ns,这将消耗106个字节的每个事务预算。在原始估计中,每个uFrame只产生10.16个事务,不包括预留带宽。

    主机无法根据uFrame内的实际事务到达进行自适应重新调度,这从软件角度来看是禁止的,因此驱动程序使用最保守的调度,每个uFrame最多9个批量事务,总计36 MB/秒。这是一个非常好的USB笔驱动器可以提供的。

    一些疯狂的人工基准可以达到每uFrame 11个事务,也就是44 MBps。这是HS USB协议的绝对最大值。

    当今实施中的瓶颈在哪里?

    正如上面所示,没有瓶颈,所有的原始位时间空间都被协议开销所吞噬。

    \ \ endgroup \美元

      你的回答

      点击“发布你的答案”,即表示你同意我们的服务条款隐私政策饼干的政策

      不是你想要的答案?浏览其他带标签的问题问你自己的问题