首页 | 资讯动态 | linux基础 | 系统管理 | 网络管理 | 编程开发 | linux数据库 | linux相关 | linux认证 | 下载中心 | 专题
oklinux
 系统管理:中文环境 系统管理 桌面应用 内核技术 Linux基础:安装配置 常用命令 经验技巧 软件应用 Linux数据库:Mysql POSTGRE
 网络管理:网络安全 网络应用 Linux服务器 编程开发:PHP CC++ Python Perl SHELL 嵌入式开发 | PHP基础 PHP技巧 PHP应用 PHP文摘
 首页 linux资讯动态 Linux专题 | 其他Unix Linux解决方案 硬件相关 Linux认证 企业应用 Apache | 相关下载:软路由 参考手册 开发工具
 → 当前位置:首页>系统管理>系统管理>正文

提高Linux系统性能加速网络应用程序

OKLinux www.oklinux.cn 2007-02-28 来源:中国IT实验室收集整理 收藏本文

  在开发 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 报文段,因此它会引入一些延时。但是这种算法可以最小化在线路上发送的报文的数量,因此可以最小化网络拥塞的问题。

  但是在需要最小化传输延时的情况中,Sockets API 可以提供一种解决方案。要禁用 Nagle 算法,您可以设置 TCP_NODELAY socket 选项,如清单 1 所示。

  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); }

  清单 1. 为 TCP socket 禁用 Nagle 算法

  提示:使用 Samba 的实验表明,在从 Microsoft® Windows® 服务器上的 Samba 驱动器上读取数据时,禁用 Nagle 算法几乎可以加倍提高读性能。

  技巧 2. 最小化系统调用的负载

  任何时候通过一个 socket 来读写数据时,您都是在使用一个系统调用(system call)。这个调用(例如 read 或 write)跨越了用户空间应用程序与内核的边界。另外,在进入内核之前,您的调用会通过 C 库来进入内核中的一个通用函数(system_call())。从 system_call() 中,这个调用会进入文件系统层,内核会在这儿确定正在处理的是哪种类型的设备。最后,调用会进入 socket 层,数据就是在这里进行读取或进行排队从而通过 socket 进行传输的(这涉及数据的副本)。

  这个过程说明系统调用不仅仅是在应用程序和内核中进行操作的,而且还要经过应用程序和内核中的很多层次。这个过程耗费的资源很高,因此调用次数越多,通过这个调用链进行的工作所需要的时间就越长,应用程序的性能也就越低。

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

  解决方案

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

 

 

共7页: 上一页 1 [2] [3] [4] [5] [6] [7] 下一页
上一篇:Linux操作系统中的七件超厉害的武器   下一篇:有关Linux系统下单用户启动方式介绍
收藏】 【评论】 【推荐】 【投稿】 【打印】 【关闭

相关文章
·有关Linux系统下单用户启动方式介绍
·Linux操作系统中的七件超厉害的武器
·linux进程介绍之fork vs vfork
·Linux任务控制的几个技巧
·嵌入式Linux系统的GDB远程调试的实现
·利用FAM和IMON在Linux下实现数据复制
·Linux中关于hostname的设置
·介绍几种Linux备份方法便于日常管理
·三种嵌入式操作系统的深入分析与比较
·FC6 Linux下如何写NTFS分区文件
发表评论
密码: 匿名评论
评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。)
站内搜索
阅读排行榜
·linux环境变量设置及保存
·Linux操作系统的内存使用
·用开源软件Subversion进行
·Linux用户(User)和用户
·如何降低Linux 内存开销
·C++自动化(模板元)编程基
·Linux操作系统中的七件超
·Linux环境下如何去远程登
·运用RedHat的Kickstart升
·三种嵌入式操作系统的深入
最新文章
·虚拟盾 为你的虚拟机来提
·LINUX下磁盘限额配置
·Squid实现反向代理并且具
·演示和应急修复用的Linux
·简捷操作 Linux系统中的十
·Linux与Unix二大操作系统
·Linux环境下如何去远程登
·经验谈 关于Linux系统的
·Linux 下数据库备份恢复技
·Linux系统文件的优化及系
·Linux操作系统的内存使用
·用开源软件Subversion进行
·Linux系统特殊文件--目录
·如何在Subversion中运行ho
·linux环境变量设置及保存

设为首页 - 加入收藏 - 版权声明 - 广告服务 - 关于我们 - 联系我们 - 友情连接
Copyright © 2007 All rights reserved OKLinux.Cn 版权所有
合作联系 QQ:18743986 Email:arlan8005#163.com