博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于socket buffer size的调优
阅读量:6122 次
发布时间:2019-06-21

本文共 3462 字,大约阅读时间需要 11 分钟。

为了达到最大网络吞吐,socket send buffer size(SO_SNDBUF)不应该小于带宽和延迟的乘积。
之前我遇到2个性能问题,都和SO_SNDBUF设置得太小有关。
但是,写程序的时候可能并不知道把SO_SNDBUF设多大合适,而且SO_SNDBUF也不宜设得太大,浪费内存啊。
于是,有OS提供了动态调整缓冲大小的功能,这样应用程序就不用再对SO_SNDBUF调优了。
(接受缓冲SO_RCVBUF也是类似的问题, 不应该小于带宽和延迟的乘积)。
On Linux:
Linux从2.4开始支持接收 缓冲和发送缓冲的动态调整。
http://www.man7.org/linux/man-pages/man7/tcp.7.html
------------------------------------------------------------
       tcp_rmem (since Linux 2.4)
              This is a vector of 3 integers: [min, default, max].  These
              parameters are used by TCP to regulate receive buffer sizes.
              TCP dynamically adjusts the size of the receive buffer from
              the defaults listed below, in the range of these values,
              depending on memory available in the system.
...
       tcp_wmem (since Linux 2.4)
              This is a vector of 3 integers: [min, default, max].  These
              parameters are used by TCP to regulate send buffer sizes.  TCP
              dynamically adjusts the size of the send buffer from the
              default values listed below, in the range of these values,
              depending on memory available.
------------------------------------------------------------
  1. [root@node2 ~]# cat /proc/sys/net/ipv4/tcp_rmem
  2. 4096 87380 4194304
  3. [root@node2 ~]# cat /proc/sys/net/ipv4/tcp_wmem
  4. 4096 16384 4194304
On 
Windows:
Windows上其实有类似的机能,但是Windows的文档太糟糕了,我废了不少劲才找到一些旁证。
从Vista开始Windows引入接受窗口的自动调整
http://blogs.msdn.com/b/wndp/archive/2007/07/05/receive-window-auto-tuning-on-vista.aspx
从Win7和Win2008R2开始 Windows 引入送信缓冲的自动调整
------------------------------------------------------------
Updated for Windows 7 and Windows Server 2008 R2
...
Dynamic send buffering for TCP was added on Windows 7 and Windows Server 2008 R2. As a result, the use of the 
SIO_IDEAL_SEND_BACKLOG_CHANGE
 and
SIO_IDEAL_SEND_BACKLOG_QUERY
 IOCTLs are needed only in special circumstances. For more information, see 
.
------------------------------------------------------------
需要注意的是,如果应用设置了SO_SNDBUF,Dynamic send buffering会失效
 
https://msdn.microsoft.com/en-us/library/windows/desktop/bb736549(v=vs.85).aspx
------------------------------------------------------------
Dynamic send buffering for TCP was added on Windows 7 and Windows Server 2008 R2. By default, dynamic send buffering for TCP is enabled unless an application sets the 
 socket option on the stream socket.
------------------------------------------------------------
我在 MSDN上没有找到正式介绍这个功能的页面(也许就没有这样的页面),所以也不知道它的自动调整是怎么个调法,范围是多少。而且,通过对Win7和Windows Server 2008 R2的测试我也没看到 送信缓冲自动调整的效果,这个效果我只在Windows 2012上看到了。
测试:
下面是我的测试,主要针对 送信缓冲的。
以下是各OS中送信缓冲的缺省值
OS                       送信缓冲的缺省值(通过getsockopt(SO_SNDBUF)获取)
Window7:            8k
Windows2003:     8k
Windows2008:     8k
Windows8:          64k
Windows2012:     64k
测试方法:
1)机器A( Windows)通过TCP  socket向机器B发送100MB数据 。
2) 机器A 每次send()向socket写入8K字节。
3) 机器A的程序设置不同的 SO_SNDBUF,查看总送信时间的变化。
测试环境1:
Host A: Windows 2012(x64)
Host B: RHEL6(x64)
Network:1Gbit LAN
Result(execute time):
default(64K),                  1.118s(送信缓冲的自动调整生效)
set SO_SNDBUF to 32K,   3.295s
set SO_SNDBUF to 64K,   2.048s
set SO_SNDBUF to 128K, 1.404s
set SO_SNDBUF to 256K, 1.290s
从上面可以看出,  Windows 2012中 送信缓冲的自动调整还是很有效果的。
注)如果使用Windows而不是Linux作为客户端,效果也是一样的
测试环境
2:
Host A: Windows 2008 R2(x64)
Host B: RHEL6(x64)
Network:1Gbit LAN
Result(execute time):
default(8K),                   7.370s
set SO_SNDBUF to 32K,  4.159s
set SO_SNDBUF to 64K,  2.875s
set SO_SNDBUF to 128K, 1.593s
set SO_SNDBUF to 256K, 1.324s
对 Windows 2008 R2,不知道 送信缓冲的 自动调整没有生效( "
netsh winsock show autotuning "是生效了的),还是8K初始值的起点太低,反正性能不如人意。
结论:
较新的OS都支持socket buffer的自动调整,不需要应用程序去调优。但对Windows 2012(和Win8)以前的Windows,为了达到最大网络吞吐,还是要应用程序操心一下 SO_SNDBUF的设置。

转载地址:http://sgwua.baihongyu.com/

你可能感兴趣的文章
关于软件开发的一些感悟
查看>>
uva 10806
查看>>
纯CSS3绘制的黑色图标按钮组合
查看>>
Linux中环境变量文件及配置
查看>>
从0开始学Flutter
查看>>
mysql操作入门基础之对数据库和表的增删改查
查看>>
IIS负载均衡
查看>>
分布式事务,EventBus 解决方案:CAP【中文文档】
查看>>
Linux下的CPU性能瓶颈分析案例
查看>>
spring mvc入门
查看>>
2012在数据库技术会议上的讲话PPT打包
查看>>
【Android】 TextView设置个别字体样式
查看>>
python svn
查看>>
raise语句
查看>>
sequence2(高精度dp)
查看>>
ABP实战--集成Ladp/AD认证
查看>>
存储过程
查看>>
phpcms v9栏目列表调用每一篇文章内容方法
查看>>
python 自定义信号处理器
查看>>
luov之SMTP报错详解
查看>>