我正在尝试在Linux上调整TCP缓冲区大小,但是各种结果让我感到困惑。
测试程序包括服务器和客户端。服务器只是监听一个端口,等待客户端从mmaped文件中发送数据。接收到的数据使用recv复制到应用程序缓冲区,然后被丢弃。在发送数据时,客户端使用以mmapped缓冲区的完整大小作为初始参数的send。
这些程序在两个不同数据中心的两个节点上运行,它们之间的ping响应时间约为9毫秒。两个节点都安装了两个千兆以太网控制器。最大吞吐量为256 MB/s,并且适当的send/recv缓冲区大小设置应该约为256 MB/s * 0.09 s ~ 2415919字节。
我进行了几次实验。
第一次运行中,我运行了一个服务器实例和一个客户端实例。我没有设置发送缓冲区或接收缓冲区的大小,让内核自动调整它们。此案例的目的是建立其他实验的基线。
在此设置中,实际吞吐量约为117 MB/s。在这种情况下,单个服务器和客户端只使用了一个以太网控制器。通过ifconfig检查,我发现大多数数据包在eth0和eth1之间的单个接口上传输。
然后我尝试了两个服务器和两个客户端,这次吞吐量提高到约225 MB/s,更接近理想的最大吞吐量。
这是让我感到困惑的第一个问题:
测试程序包括服务器和客户端。服务器只是监听一个端口,等待客户端从mmaped文件中发送数据。接收到的数据使用recv复制到应用程序缓冲区,然后被丢弃。在发送数据时,客户端使用以mmapped缓冲区的完整大小作为初始参数的send。
这些程序在两个不同数据中心的两个节点上运行,它们之间的ping响应时间约为9毫秒。两个节点都安装了两个千兆以太网控制器。最大吞吐量为256 MB/s,并且适当的send/recv缓冲区大小设置应该约为256 MB/s * 0.09 s ~ 2415919字节。
我进行了几次实验。
第一次运行中,我运行了一个服务器实例和一个客户端实例。我没有设置发送缓冲区或接收缓冲区的大小,让内核自动调整它们。此案例的目的是建立其他实验的基线。
在此设置中,实际吞吐量约为117 MB/s。在这种情况下,单个服务器和客户端只使用了一个以太网控制器。通过ifconfig检查,我发现大多数数据包在eth0和eth1之间的单个接口上传输。
然后我尝试了两个服务器和两个客户端,这次吞吐量提高到约225 MB/s,更接近理想的最大吞吐量。
这是让我感到困惑的第一个问题:
Why do I need more than one process to use up the bandwidth? FWIW, below is part of
/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 | |
以下是从上表中提出的其他几个问题:
- 为什么理论值没有导致最佳吞吐量(117 MB/s)?
- 为什么最佳结果(51.5 MB/s)仍然不如内核自动调优的结果(117 MB/s)?
- 为什么更大的缓冲区会导致较差的吞吐量?
提前感谢。