Linux网络服务器性能比较的研究
董  凯
(上海海事大学 计算机应用专业  上海  201306)
摘  要: 高性能网络服务程序在当前的linux环境下应用非常广泛,不论是主流web服务器,还是mmo服务器,都需要高性能的网络服务器结构提供支撑。就主流的linux网络服务器模型性能进行比较,得出一般性结论,为以后网络开发人员对网络服务器的选择提供一定的参考依据。
关键词: linux;服务器;性能;比较
中图分类号:TP393  文献标识码:A  文章编号:1671-7597(2012)1120100-02
阻塞在accept调用的地方。以前的观点认为大量进程或线程同
1 标准tcp客户端的设计
时阻塞在accept处时,会产生“惊”现象,即所有的线程或在客户端主程序中需要的一般参数包括服务器端ip地址,
进程都被同时激活,但只有一个获取连接描述符并返回,其它服务器端口,客户端fork形成的子进程数,子进程向服务器发
线程或进程又转为睡眠。linux从2.2.9及以后的版本都不存在送的请求连接数量以及要求服务器返回的数据字节数。据此给
这个问题,只有一个会被激活。
出客户端的基本模型:
4)Tcp预先派生进程服务程序,accept使用文件上锁或者for (i = 0; i < n; i++) { //子进程数
线程上锁保护模型。一般线程锁一次只有一个线程可以阻塞在if ( (pid = fork()) == 0) {//fork子进程
accept处。避免所有预产生的线程都直接阻塞在accept,可以for (j = 0; j < nloops; j++) {
避免惊问题。而文件锁不具有通用性,将不参与模型性能比//nloops每个子进程发送请求连接数
较。
fd = connect(……);//建立到服务器的
5)主线程处理accept,预派生多个线程(线程池)处理tcp连接
连接。主线程在accept返回以后,将clientfd放入线程的消息write(fd, request, strlen(request));//向服务器发
队列,线程池将读取线程消息队列然后处理clientfd。这里主送返回数
线程只对accept进行操作,快速返回后继续调用accept,有效read (fd, reply, nbytes); //读返回的数据
的避免了拒绝连接的问题,当加大线程消息队列的长度时,可Close(fd);//关闭套接字
以显著减少消息队列处的系统调用频繁度。
}
3 六种服务器模型的测试比较
}
3.1 实验结果
客户端运行的命令可以如下:./client 127.0.0.1 8888
5 500 4000客户端进程数 用户时间(耗费在用户进程上的cpu时间
虽然有比较完整的基于benchmark的基准测试程序用于测(s))系统时间(内核在系统调用花费的时间(s))服务器试各种web服务器性能,但就一般性比较各服务器程序范式,发送字节数 每个进程处理连接数为
使用上述客户端模型基本可以满足。1)迭代服务器
2 Linux网络服务器分类
2.1 常见服务器分类
传统意义上将服务器可以分为2种类型:循环服务器
(iterative server)和并发服务器(concurrent serve
r)。这样分类虽然简单,但却不够细化。服务器的网络模型
分类可根据以下依据:是不是以阻塞方式来处理请求,是不是
多路复用和使用哪种多路复用函数(如select,poll,
2)tcp并发服务器,每个客户一个子进程
epoll);是不是采用多线程技术,线程间的关系该如何组
织;是不是采用多进程,一般多进程的调用多是在accept函数
免费永久的linux服务器
前。根据此分类依据,可将服务器模型大体分为三大类:阻塞
式模型、多路复用模型、实时信号模型。
2.2 linux网络服务器模型分析
1)单线程处理,处理流程为:socket-->bind--
>listen-->[accept-->read-->write-->close]-->close其
3)tcp预先派生子进程,accept无上锁保护(最后一项为中括号内为服务器循环。
预派子进程数)
2)为一个请求分配一个进程或是线程,主线程调用阻塞
在accept处,每个新的连接请求到来,都实时为其生成线程处
理其请求。但多数情况进程的线程数有限,创建线程的开销和
过多线程后进行上下文切换的开销,对于真正的系统的设计,
该模型只具有理论上的实用性,后面的实验也验证这点。
3)服务器端预派生一定数量进程或线程,让所有线程都

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。