欢迎来到天天文库
浏览记录
ID:6041652
大小:35.86 KB
页数:9页
时间:2017-12-31
《怎样提高linux上socket编程的性能》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、提高Linux上socket性能加速网络应用程序的4种方法M.TimJones(mtj@mtjones.com),资深软件工程师,EmulexTimJones是一名嵌入式软件工程师,他是GNU/LinuxApplicationProgramming、AIApplicationProgramming以及BSDSocketsProgrammingfromaMultilanguagePerspective等书的作者。他的工程背景非常广泛,从同步宇宙飞船的内核开发到嵌入式架构设计,再到网络协议的开发。Tim是EmulexCorp.的一名资深软件工程师。(AnIBMdevelo
2、perWorksContributingAuthor)简介: 使用SocketsAPI,我们可以开发客户机和服务器应用程序,它们可以在本地网络上进行通信,也可以通过Internet在全球范围内进行通信。与其他API一样,您可以通过一些方法使用SocketsAPI,从而提高Socket的性能,或者限制Socket的性能。本文探索了4种使用SocketsAPI来获取应用程序的最大性能并对GNU/Linux®环境进行优化从而达到最好结果的方法。标记本文!发布日期: 2006年2月13日级别: 中级访问情况 3298次浏览建议: 0 (添加评论)平均分(共8个评分)在开发so
3、cket应用程序时,首要任务通常是确保可靠性并满足一些特定的需求。利用本文中给出的4个提示,您就可以从头开始为实现最佳性能来设计并开发socket程序。本文内容包括对于SocketsAPI的使用、两个可以提高性能的socket选项以及GNU/Linux优化。为了能够开发性能卓越的应用程序,请遵循以下技巧:·最小化报文传输的延时。·最小化系统调用的负载。·为BandwidthDelayProduct调节TCP窗口。·动态优化GNU/LinuxTCP/IP栈。技巧1.最小化报文传输的延时在通过TCPsocket进行通信时,数据都拆分成了数据块,这样它们就可以封装到给定连接
4、的TCPpayload(指TCP数据包中的有效负荷)中了。TCPpayload的大小取决于几个因素(例如最大报文长度和路径),但是这些因素在连接发起时都是已知的。为了达到最好的性能,我们的目标是使用尽可能多的可用数据来填充每个报文。当没有足够的数据来填充payload时(也称为最大报文段长度(maximumsegmentsize)或MSS),TCP就会采用Nagle算法自动将一些小的缓冲区连接到一个报文段中。这样可以通过最小化所发送的报文的数量来提高应用程序的效率,并减轻整体的网络拥塞问题。尽管JohnNagle的算法可以通过将这些数据连接成更大的报文来最小化所发送的
5、报文的数量,但是有时您可能希望只发送一些较小的报文。一个简单的例子是telnet程序,它让用户可以与远程系统进行交互,这通常都是通过一个shell来进行的。如果用户被要求用发送报文之前输入的字符来填充某个报文段,那么这种方法就绝对不能满足我们的需要。另外一个例子是HTTP协议。通常,客户机浏览器会产生一个小请求(一条HTTP请求消息),然后Web服务器就会返回一个更大的响应(Web页面)。解决方案您应该考虑的第一件事情是Nagle算法满足一种需求。由于这种算法对数据进行合并,试图构成一个完整的TCP报文段,因此它会引入一些延时。但是这种算法可以最小化在线路上发送的报文
6、的数量,因此可以最小化网络拥塞的问题。但是在需要最小化传输延时的情况中,SocketsAPI可以提供一种解决方案。要禁用Nagle算法,您可以设置TCP_NODELAYsocket选项,如清单1所示。清单1.为TCPsocket禁用Nagle算法intsock,flag,ret;/*Createnewstreamsocket*/sock=socket(AF_INET,SOCK_STREAM,0);/*DisabletheNagle(TCPNoDelay)algorithm*/flag=1;ret=setsockopt(sock,IPPROTO_TCP,TCP_NODE
7、LAY,(char*)&flag,sizeof(flag));if(ret==-1){printf("Couldn'tsetsockopt(TCP_NODELAY)");exit(-1);}提示:使用Samba的实验表明,在从Microsoft®Windows®服务器上的Samba驱动器上读取数据时,禁用Nagle算法几乎可以加倍提高读性能。回页首技巧2.最小化系统调用的负载任何时候通过一个socket来读写数据时,您都是在使用一个系统调用(systemcall)。这个调用(例如read或write)跨越了用户空间应用程序与内核的边界。另外,在进
此文档下载收益归作者所有