全速 USB 的有效最大有效负载吞吐量是多少?

Posted

技术标签:

【中文标题】全速 USB 的有效最大有效负载吞吐量是多少?【英文标题】:What is the effective maximum payload throughput for USB in Full Speed? 【发布时间】:2017-02-16 23:54:53 【问题描述】:

USB 全速的速度为 12 MBit/秒 = 1.5 MByte/s。

但是在这 12 MBit 中,还传输了很多额外的数据,这些数据不是有效负载,如令牌、端点地址、CRC5、CRC16、确认、SOF + EOF 数据包等。此外,总线管理器保留 10% 的控制传输框架。

见Interrupt Transfer 在USB Made Simple Part 3

当我的 USB 端点处于中断模式且轮询间隔为 1 毫秒时,我可以每帧传输 64 个字节 = 64kByte / 秒。

但是,如果我有 2 个端点的轮询时间为 1 毫秒怎么办? 然后主机将在 1 ms 内轮询两个端点,所以我的总吞吐量为 128 kByte/s?

当主机同时轮询 15 个 IN 端点时,会导致 15 * 64 kByte = 960 kByte/s?

(为简单起见,我们假设没有 OUT 传输)

第一个问题: 虽然搜索了很多,但我找不到一个网站谈论全速时的最大有效负载吞吐量。

第二个问题: 全速允许最大 64 字节/数据包和 1 ms 的最小轮询间隔。如果我想通过 IN 传输传输最大可能的有效负载,我应该使用多个端点并将数据传输分布在这些端点上吗?有多少端点可以达到极限?

第三个问题: 我看到在批量传输中,主机请求 IN 数据的频率高于每毫秒一次。这是否意味着批量传输比中断传输更快?

【问题讨论】:

【参考方案1】:

第三个问题:我发现在批量传输中,主机请求 IN 数据的频率高于每毫秒一次。这是否意味着批量传输比中断传输更快?

很多更快。使用单个批量端点可以达到大约 1 MByte/秒 - 这也是 USB 全速可以获得的最大吞吐量。

简而言之:如果您的应用程序想要尽快传输数据,请使用批量端点。

【讨论】:

【参考方案2】:

我在 USB 2.0 规范的第 5.7.4 和 5.8.4 章找到了部分答案:

批量传输的协议开销为 13 个字节:(3 个 SYNC 字节、3 个 PID 字节、2 个端点 + CRC 字节、2 个 CRC 字节和 3 个字节的包间延迟)和 19 个字节的中断传输(5 个 SYNC 字节、5 个 PID 字节、2 个端点 + CRC 字节、2 个 CRC 字节和 5 个字节的包间延迟)

如果使用 64 字节的数据负载,则批量传输的最大带宽为 1.216.000 字节/秒。这意味着 1 毫秒的一帧可以传输 1216 字节 = 19 个 64 字节的块。

以每毫秒一次的最大间隔轮询中断端点,因此最大有效负载将为 64kB/s 或更小。

但这些值是理论值。该文件指出位填充被忽略。此处也忽略了为控制传输保留的 10% 带宽。对于中断端点,最大吞吐量将为 64 字节/毫秒 = 64 kByte/秒。

另一篇关于在不同全速设备和不同操作系统的现实生活中测得的速度的有趣文章非常有趣,因为它与理论值非常不同,尤其是对于 Windows。

Paul 测得的最大速度为 1 兆字节/秒,但在 OUT 方向。

http://www.pjrc.com/teensy/benchmark_usb_serial_receive.html

https://www.pjrc.com/teensy/usb_serial.html

【讨论】:

中断端点每1ms只能发送一个64字节的数据包。因此,在开销之后,限制约为 64kB/秒。 您可以在 USB2 FS 的一帧中向多个端点发送中断数据包。有很多开销,但 f.ex。在设备中有 3 个 OUT 端点时,我管理的吞吐量约为 160kBps(每秒 1000 帧的 3x 64 字节数据包约为 192kBps)。测试表明它是线性可扩展的,因此使用最多 15 个 OUT 端点,理论上您可以获得 ~768kBps 的开销(无开销 ~960 kBps)。单端点 BULK 虽然会在 ~1MBps 左右提供最高的吞吐量。

以上是关于全速 USB 的有效最大有效负载吞吐量是多少?的主要内容,如果未能解决你的问题,请参考以下文章

IRQBalance真的有效么?

U8服务器参数配置中负载均衡如何设置

通过 Google IoT 核心发布/订阅消息的最大有效负载大小是多少?

负载均衡的应用

Nginx作为HTTP负载均衡器

用于移动推送通知的 AWS SNS 的最大有效负载长度是多少?