SO_SNDBUF和SO_RCVBUF

时间:2016-03-24 21:38:52

标签: networking tcp setsockopt

应用程序是否需要使用SOKNDBUF和SO_RCVBUF的setsockopt来利用最大的TCP缓冲区限制?

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

当我使用wmem_max的小值124928的默认主机设置,rmem_max和tcp_rmem和tcp_wmem中第三列的相同值时,我得到了~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()调用,我也可以达到最大限制。 TCP是否会自动调整以动态使用mem_max设置,即使对于未使用setsockopt配置的套接字来使用大内存缓冲区也是如此?

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

0 个答案:

没有答案