提高Linux上socket性能
的工作所需要的时间就越长,应用程序的性能也就越低.
我们无法避免这些系统调用,因此惟一的选择是最小化使用这些调用的次数.幸运的是,我们可以对这个过程进行控制.
解决方案 在将数据写入一个 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 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |