快速业务通道

提高Linux上socket性能

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-04-26
的工作所需要的时间就越长,应用程序的性能也就越低.

  我们无法避免这些系统调用,因此惟一的选择是最小化使用这些调用的次数.幸运的是,我们可以对这个过程进行控制.

  解决方案

  在将数据写入一个 socket 时,尽量一次写入所有的数据,而不是执行多次写数据的操作.对于读操作来说,最好传入可以支持的最大缓冲区,如果没有足够多的数据,内核也会试图填充 整个缓冲区(另外还需要保持 TCP 的通告窗口为打开状态).这样,您就可以最小化调用的次数,并可以实现更好的整体性能. 拥有帝国一切,皆有可能。欢迎访问phome.net

  技巧 3. 为 Bandwidth Delay Product 调节 TCP 窗口

  TCP 的性能取决于几个方面的因素.两个最重要的因素是链接带宽(link bandwidth)(报文在网络上传输的速率)和 往返时间(round-trip time) 或 RTT(发送报文与接收到另一端的响应之间的延时).这两个值确定了称为 Bandwidth Delay Product(BDP)的内容.

  给定链接带宽和 RTT 之后,您就可以计算出 BDP 的值了,不过这代表什么意义呢?BDP 给出了一种简单的方法来计算理论上最优的 TCP socket 缓冲区大小(其中保存了排队等待传输和等待应用程序接收的数据).如果缓冲区太小,那么 TCP 窗口就不能完全打开,这会对性能造成限制.如果缓冲区太大,那么宝贵的内存资源就会造成浪费.如果您设置的缓冲区大小正好合适,那么就可以完全利用可用的 带宽.下面我们来看一个例子:

  BDP = link_bandwidth * RTT

  如果应用程序是通过一个 100Mbps 的局域网进行通信,其 RRT 为 50 ms,那么 BDP 就是:

  100MBps * 0.050 sec / 8 = 0.625MB = 625KB

  注意:此处除以 8 是将位转换成通信使用的字节.

  因此,我们可以将 TCP 窗口设置为 BDP 或 1.25MB.但是在 Linux 2.6 上默认的 TCP 窗口大小是 110KB,这会将连接的带宽限制为 2.2MBps,计算方法如下:

  throughput = window_size / RTT

  110KB / 0.050 = 2.2MBps

  如果使用上面计算的窗口大小,我们得到的带宽就是 12.5MBps,计算方法如下:

  625KB / 0.050 = 12.5MBps

  差别的确很大,并且可以为 socket 提供更大的吞吐量.因此现在您就知道如何为您的 socket 计算最优的缓冲区大小了.但是又该如何来改变呢?

  解决方案

  Sockets API 提供了几个 socket 选项,其中两个可以用于修改 socket 的发送和接收缓冲区的大小.清单 2 展示了如何使用 SO_SNDBUF 和 SO_RCVBUF 选项来调整发送和接收缓冲区的大小.

  注意:尽管 socket 缓冲区的大小确定了通告 TCP 窗口的大小,但是 TCP 还在通告窗口内维护了一个拥塞窗口.因此,这个拥塞窗口的存在,给定的 socket 可能永远都不会利用最大的通告窗口.

  清单 2. 手动设置发送和接收 socket 缓冲区大小 拥有帝国一切,皆有可能。欢迎访问phome.net

  int ret, sock, sock_buf_size;

  sock = socket( AF_INET, SOCK_STREAM, 0 );

  sock_buf_size = BDP;

  ret = setsockopt( sock, SOL_SOCKET, SO_SNDBUF,

  (char *)&sock_buf_size, sizeof(sock_buf_size) );

  ret = setsockopt( sock, SOL_SOCKET, SO_RCVBUF,

  (char *)&sock_buf_size, sizeof(sock_buf_size) );

  在 Linux 2.6 内核中,发送缓冲区的大小是由调用用户来定义的,但是接收缓冲区会自动加倍.您可以进行 getsockopt 调用来验证每个缓冲区的大小.

  巨帧(jumbo frame)

  我们还可以考虑将包的大小从 1,500 字节修改为 9,000 字节(称为巨帧).在本地网络中可以通过设置最大传输单元(Maximum Transmit Unit,MTU)来设置巨帧,这可以极大地提高性能.

  就 window scaling 来说,TCP 最初可以支持最大为 64

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号