提高Linux上socket性能
在开发 socket 应用程序时,首要任务通常是确保可靠性并满足一些特定的需求.利用本文中给出的 4 个提示,您就可以从头开始为实现最佳性能来设计并开发 socket 程序.本文内容包括对于 Sockets API 的使用、两个可以提高性能的 socket 选项以及 GNU/Linux 优化. 为了能够开发性能卓越的应用程序,请遵循以下技巧: * 最小化报文传输的延时. * 最小化系统调用的负载. * 为 Bandwidth Delay Product 调节 TCP 窗口. * 动态优化 GNU/Linux TCP/IP 栈. 技巧 1. 最小化报文传输的延时 在通过 TCP socket 进行通信时,数据都拆分成了数据块,这样它们就可以封装到给定连接的 TCP payload(指 TCP 数据包中的有效负荷)中了.TCP payload 的大小取决于几个因素(例如最大报文长度和路径),但是这些因素在连接发起时都是已知的.为了达到最好的性能,我们的目标是使用尽可能多的可用数据来填充 每个报文.当没有足够的数据来填充 payload 时(也称为最大报文段长度(maximum segment size) 或 MSS),TCP 就会采用 Nagle 算法自动将一些小的缓冲区连接到一个报文段中.这样可以通过最小化所发送的报文的数量来提高应用程序的效率,并减轻整体的网络拥塞问题. 尽管 John Nagle 的算法可以通过将这些数据连接成更大的报文来最小化所发送的报文的数量,但是有时您可能希望只发送一些较小的报文.一个简单的例子是 telnet 程序,它让用户可以与远程系统进行交互,这通常都是通过一个 shell 来进行的.如果用户被要求用发送报文之前输入的字符来填充某个报文段,那么这种方法就绝对不能满足我们的需要. 另外一个例子是 HTTP 协议.通常,客户机浏览器会产生一个小请求(一条 HTTP 请求消息),然后 Web 服务器就会返回一个更大的响应(Web 页面). 解决方案 您应该考虑的第一件事情是 Nagle 算法满足一种需求.这种算法对数据进行合并,试图构成一个完整的 TCP 报文段,因此它会引入一些延时.但是这种算法可以最小化在线路上发送的报文的数量,因此可以最小化网络拥塞的问题. 拥有帝国一切,皆有可能。欢迎访问phome.net 但是在需要最小化传输延时的情况中,Sockets API 可以提供一种解决方案.要禁用 Nagle 算法,您可以设置 TCP_NODELAY socket 选项,如清单 1 所示. 清单 1. 为 TCP socket 禁用 Nagle 算法 int sock, flag, ret; /* Create new stream socket */ sock = socket( AF_INET, SOCK_STREAM, 0 ); /* Disable the Nagle (TCP No Delay) algorithm */ flag = 1; ret = setsockopt( sock, IPPROTO_TCP, TCP_NODELAY, (char *)&flag, sizeof(flag) ); if (ret == -1) { printf("Couldn''t setsockopt(TCP_NODELAY)n"); exit(-1); } 提示:使用 Samba 的实验表明,在从 Microsoft? Windows? 服务器上的 Samba 驱动器上读取数据时,禁用 Nagle 算法几乎可以加倍提高读性能. 技巧 2. 最小化系统调用的负载 任何时候通过一个 socket 来读写数据时,您都是在使用一个系统调用(system call).这个调用(例如 read 或 write)跨越了用户空间应用程序与内核的边界.另外,在进入内核之前,您的调用会通过 C 库来进入内核中的一个通用函数(system_call()).从 system_call() 中,这个调用会进入文件系统层,内核会在这儿确定正在处理的是哪种类型的设备.,调用会进入 socket 层,数据就是在这里进行读取或进行排队从而通过 socket 进行传输的(这涉及数据的副本). 这个过程说明系统调用不仅仅是在应用程序和内核中进行操作的,还要经过应用程序和内核中的很多层次.这个过程耗费的资源很高,因此调用次数越多,通过这个调用链进行 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |