1

我有一个问题,与大小为 1500 字节的数据包相比,为什么我的机器的吞吐量对于小数据包(即 64 字节)非常糟糕?

我有一个 GIGABIT NIC 卡,能够以 80MB/s 的速度传输 1500 字节大小的数据包,但在 64 字节大小的数据包的情况下,我几乎无法分辨出 25MB/s 左右。

我知道在 1500 字节数据包的情况下,我需要发送大约 80k PPS 才能达到线路速率,而对于 64 字节,它大约需要 140 万 PPS。

但是为什么小数据包的吞吐量会有很大的变化呢?

编辑:我在linux中使用内存映射将数据包从用户空间传输到内核空间,然后直接写入网络驱动程序进行传输。我发现我的 CPU 使用率在 64 字节和 1500 字节数据包之间进行比较时非常少且相同。

4

3 回答 3

2

但是为什么小数据包的吞吐量会有很大的变化呢?

CPU 压力。与其大小无关,每一个发出的数据包在到达接口之前都会经过大量处理。换句话说,传输小数据包和大数据包的“成本”是相当的。

如果您对此感兴趣,您可能想查看 Linux 内核中的“GSO”和“UFO”——它是专门为此开发的。

于 2012-11-16T06:21:28.717 回答
1

发送数据包标头需要时间。设置 DMA 缓冲区、处理数据包标头等需要时间。所有这些额外的工作都会减少可以发送的实际有效负载的数量。

于 2012-11-16T06:21:52.953 回答
0

想一想:每个数据包的标头都包含有效载荷(数据)的大小和一些通用数据。假设标题是 16 个字节。

如果您发送 1000 个 64 字节的数据包,则发送1000 * (64 + 16) = 64000 + 16000 bytes.

如果您一次性发送它,它只是64000+16 bytes

于 2012-11-16T06:24:02.557 回答