关于socket buffer size的调优

摘要:
http://www.man7.org/linux/man-pages/man7/tcp.7.html------------------------------------------------------------tcp_rmemThisisavectorof3integers:[最小值,默认值,最大值]。这些分隔符由CP用于调整接收缓冲区大小。TCPD可以根据系统中可用的内存动态地调整接收器缓冲区的大小,以这些值的形式,从所列的默认值中选择。tcp_wmem这是3个整数的矢量:[min,default,max]。CP使用这些分隔符来调节接收器缓冲区大小。TCPD可以根据可用的内存动态调整缓冲区的大小,使其从所列的默认值降低到这些值的范围内------------------------------------------------------------[ root@node2~]#cat/proc/sys/net/ipv4/tcp_mem4096873804194304[root@node2~]#cat/proc/sys/net/ipv4/tcp_Wmem4096163844194304OnWindows:Windows实际上有类似的功能,但Windows文档太糟糕了。我费了好大劲才找到一些旁证。Windows从Vista引入自动调整接受窗口http://blogs.msdn.com/b/wndp/archive/2007/07/05/receive-window-auto-tuning-on-vista.aspx从Win7和Win2008R2开始,Windows引入了消息发送缓冲区的自动调整https://technet.microsoft.com/zh-cn/subscriptions/ms740642.aspx------------------------------------------------------------UpdatedforWindows7andWindowsServer2008R2...DynamicsendbufferingforTCPwasaddedonWindows7andWindowsServer2008R2.Asaresult,SIO_ IDEAL_ SEND_ BACKLOG_ CHANGE和SIO_ IDEAL_ SEND _ BACKLOG_ QUERYIOCTL的使用不限于特殊情况。更多信息,请参见SIO_IDEAL_SEND_BACLOG_QUERY。---------------------------------------------注意,如果应用程序设置了SO_SNDBUF,则Dynamicsendbuffering将变为无效。https://msdn.microsoft.com/en-us/library/windows/desktop/bb736549.aspx------------------------------------------------------------DynamicsendbufferingforTCPwasaddedonWindows7andWindowsServer2008R2.Bydefault,TCPs的动态端缓冲启用了流套接字上的SO_ SNDBUF套接字选项上的应用程序。--------------------------------------------我在MSDN上找不到正式介绍此功能的页面,因此我不知道自动调整方法是什么,范围是什么。2)机器a每次向套接字发送8K字节。
为了达到最大网络吞吐,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引入送信缓冲的自动调整
https://technet.microsoft.com/zh-cn/subscriptions/ms740642.aspx
------------------------------------------------------------ 
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 andSIO_IDEAL_SEND_BACKLOG_QUERY IOCTLs are needed only in special circumstances. For more information, see SIO_IDEAL_SEND_BACKLOG_QUERY.
------------------------------------------------------------

需要注意的是,如果应用设置了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 SO_SNDBUF 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的设置。

免责声明:文章转载自《关于socket buffer size的调优》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Multisim 工具之 Spice 仿真RS:关于数据挖掘中的推荐系统下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Android学习——写个小实例

学了不少基础的知识,拼一个完整点的小例子吧! 目标:完成一个与PC机互发消息的聊天程序。   首先要先试通,通讯机制。在多机互联中最常用的是网络,而网络编程中,底层的通讯机制也就是Socket。我们就想试一试用Socket来实现双机对联。先试通Socket通讯,PC机当服务器,手机当客户端。 通常,我们写PC的Socket程序时,了解到,服务器端是采用So...

Socket聊天逻辑

         1、A发送消息到服务器          2、服务器接收到消息后会给所有用户发送这条消息          3、如果有用户断开连接,则不用给此用户发送 一、创建持久性连接服务器  net,设置其端口号为9000 const net = require(“net”); const server = net.creatServer(); se...

前端—HTML

前端 1.什么是前端? 任何直接能够跟用户打交道的交互界面都可以称之为前端 2.为什么要学前端? 因为我们是Python全栈开发 Web服务本质 importsocket sk =socket.socket() sk.bind(("127.0.0.1", 8080)) sk.listen(5) whileTrue: con...

基于P2P的匿名技术研究

李超 北京图形研究所 摘要:本文针对匿名通信中两种基本技术:Mix和洋葱路由进行了论述,并分析了P2P网络对于Mix网络和传统的洋葱路由的改进和缺陷,论述了基于P2P的匿名通信在提高通信性能和抗攻击能力上的实现技术。 关键词:P2P 洋葱路由 网络 匿名 1、概述  传统意义下的网络安全包括以下四个要素:秘密性(Confidentiality)、完整性(I...

Flink作业使用windows的nc命令产生socket流

首先windows安装netcat 1 在命令行窗口使用  nc -lp 8888 2  开启Flink任务(socket源的datastream) 3  在命令行输入内容:  作业停止后nc自动停止  在使用中必须按照1,2,3的顺序,否则在命令行输入字符无效,或Flink作业启动失败。踩过的坑记录一下...

4wpa_supplicant适配层 详解

适配层是 通用的wpa_supplicant的 封装,在Android中 作为 WiFi部分的 硬件抽象层来使用。wpa_supplicant适配层 主要用于 与wpa_supplicant守护进程 的 通信,以提供给Android框架使用,它实现了 加载、控制 和 消息监控等功能。           1、当java层调用 loadDriver时, 它...