TCP 缓冲区大小和以太网绑定

TCP 缓冲区大小和以太网绑定

(这个问题最初发布于堆栈溢出;Andy 告诉我我可以在这里得到更快的帮助,所以现在在这里重新发布。)

我正在尝试在 Linux 上调整 TCP 缓冲区大小,但各种结果让我感到困惑。

测试程序包括一个服务器和一个客户端。服务器只是监听一个端口,等待客户端从 mmaped 文件发送数据。接收到的数据被复制到应用程序缓冲区中recv,然后被丢弃。在发送数据时,客户端使用sendmmaped 缓冲区的完整大小作为初始参数。

程序在两个不同数据中心的两个节点上运行,它们之间的 ping 响应时间约为 9 毫秒。两个节点都安装了两个千兆以太网控制器。最大吞吐量为 256 MB/s,发送/接收缓冲区大小的正确设置应约为 256 MB/s * 0.09 s ~ 2415919 字节。

我做了几个实验。

在第一次运行中,我运行了一个服务器实例和一个客户端实例。我没有设置发送缓冲区或接收缓冲区的大小,而是让内核自动调整它们。这种情况的目的是为其他实验建立基线。

此设置下的实际吞吐量约为 117 MB/s。在这种情况下,一对服务器和客户端仅使用一个 eithernet 控制器。使用 进行检查后ifconfig,我发现大多数数据包都通过eth0和之间的单个接口eth1

然后我尝试了两台服务器和两个客户端,这次吞吐量上升到大约 225 MB/s,更加接近理想的最大吞吐量。

这是第一个令我困惑的问题:

  1. 为什么我需要多个进程来耗尽带宽?FWIW,以下是部分内容/proc/net/bonding/bond0

    Bonding Mode: IEEE 802.3ad Dynamic link aggregation
    Transmit Hash Policy: layer3+4 (1)
    MII Status: up
    MII Polling Interval (ms): 100
    Up Delay (ms): 0
    Down Delay (ms): 0
    

然后,我尝试了几种针对单个服务器和客户端的发送/接收缓冲区大小的组合。下表总结了结果:

| send buf size | recv buf size | throughput | comment                   |
|      (client) |      (server) |     (MB/s) |                           |
|       1048576 |             - |       51.5 |                           |
|       2621400 |             - |       48.6 | server uses autotuning    |
|        524288 |             - |       43.3 |                           |
|       8388608 |             - |       36.3 |                           |
|       2621400 |       2621400 |       33.0 | somewhat the theory value |
|             - |       2621400 |       30.4 | client uses autotuning    |
|       4194304 |             - |       30.3 |                           |
|        262144 |             - |       29.1 |                           |
|             - |       1048576 |       27.9 |                           |
|       6291456 |       6291456 |       26.5 |                           |
|       8388608 |       8388608 |       23.9 |                           |
|       6291456 |             - |       22.2 |                           |
|             - |       4194304 |       20.8 |                           |
|       1048576 |       1048576 |       19.8 |                           |
|       4194304 |       4194304 |       19.3 |                           |
|             - |       8388608 |       19.3 |                           |
|             - |       6291456 |       13.8 |                           |

以下是上表中提出的其他几个问题:

  1. 为什么理论值不能产生最佳吞吐量(117 MB/s)?
  2. 为什么最好的结果(51.5 MB/s)仍然不如内核自动调整的结果(117 MB/s)?
  3. 为什么缓冲区越大,吞吐量越差?

提前致谢。

相关内容