应用程序是否需要使用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设置中的默认值。