2

应用程序是否需要带有 SO_SNDBUF 和 SO_RCVBUF 的 setsockopt 才能利用最大 TCP 缓冲区限制?

我有一个 1Gbps 网络,在我的主机之间有 100 毫秒的延迟,我正在尝试使用我的自定义客户端服务器 C 程序在它们之间全速传输数据

当我为 wmem_max、rmem_max 和 tcp_rmem 和 tcp_wmem 中的第三列使用相同的值 124928 的默认主机设置时,我得到了 ~80Mbps 的不良吞吐量

如下将最大值从 124928 更改为 12582912 后,我得到了更好的 1Gbps 吞吐量。

我当前在源主机和目标主机上的设置是

[root@~]# cat /proc/sys/net/core/wmem_default 
124928
[root@ ~]# cat /proc/sys/net/core/rmem_default 
124928
[root@~]# cat /proc/sys/net/core/wmem_max 
125829120
[root@~]# cat /proc/sys/net/core/rmem_max     
125829120
[root@~]# cat /proc/sys/net/ipv4/tcp_rmem 
10240 87380 125829120
[root@~]# cat /proc/sys/net/ipv4/tcp_wmem 
10240 87380 125829120

我没有在我的程序中使用 setsockopt() 来利用 sysctl 设置中的最大限制。我对 setsockopt 和 sysctl 内存设置的理解是,默认情况下,所有程序都会获取 mem_default 中定义的内存缓冲区,并且它们可以通过使用 setsockopt() 调用达到 mem_max 值。但是,我很困惑,即使不使用 setsockopt() 调用,我也可能达到最大限制。即使对于未使用 setsockopt 配置为使用大内存缓冲区的套接字,TCP 是否也会自动调整以动态使用 mem_max 设置?

从 tcpdump 输出中,我确认源中的 (seq-ack) 始终徘徊在 50MB 左右,这证实了 TCP 窗口大于我的 sysctl 设置中的默认值。

4

0 回答 0