怎么浅析Linux服务器网络开发模型

介绍

这篇文章将为大家详细讲解有关怎么浅析Linux服务器网络开发模型,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

<强>为什么Nginx的性能要比Apache高得多?

这主要是因为Nginx使用了最好的epoll (Linux 2.6内核)和kqueue (FreeBSD)网络I/O模型,而Apache则使用的是传统的选择模型。

<强>解释选择和epoll模型的工作方式:

选择版大妈做的是如下的事情:比如同学甲的朋友来了,选择版大妈比较笨,她带着朋友挨个房间进行查询谁是同学甲,你等的朋友来了。如果每到来一个朋友楼管大妈都要全楼的查询同学,那么处理的效率必然就低下了,过不久楼底就有不少的人了。

epoll版大妈就比较先进了,她记下了同学甲的信息,比如说他的房间号,那么等同学甲的朋友到来时,只需要告诉该朋友同学甲在哪个房间即可,不用自己亲自带着人满大楼的找人了.epoll大妈可以不用吹灰之力就可以定位到同学甲。一看就很明白epoll和选择模型的区别了吧。

在Linux内核中,选择所用到的FD_SET是有限的,即内核中有个参数__FD_SETSIZE定义了每个FD_SET的句柄个数,在内核源码中/usr/include/linux/posix_types。h中

 # undef  __FD_SETSIZE # define  __FD_SETSIZE  1024年

如果想要同时检测1025个句柄的可读状态或可写状态,选择是不能实现的。在内核中实现选择是使用轮询方法,即每次检测都会遍历所有FD_SET中的句柄,显然,选择函数的执行时间与FD检测的句柄数越多就会越费时。

epoll是多路复用输入输出(I/O多路复用)中的一种方式,仅用于linux2.6以上内核。而epoll模型它所支持的FD上限是* * *可以打开文件的数目,这个数字一般远大于2048年,举个例子,在1 gb内存的机器上大约是10万左右,具体请查看:猫/proc/sys/fs/file-max,这个数目和系统内存关系很大。

传统的选择/调查另一个致命弱点就是当你拥有一个很大的套接字集合,不过由于网络延时,任一时间只有部分的套接字是“活跃”的,但是选择/调查每次调用都会线性扫描全部的集合,导致效率呈现线性下降。但是epoll不存在这个问题,它只会对“活跃“的套接字进行操作- - -这是因为在内核实现中epoll是根据每个FD上面的回调函数实现的。那么,只有“活跃“的套接字才会主动的去调用回调函数,其他闲置状态插座则不会,在这点上,epoll实现了一个“伪“AIO,因为这时候推动力在操作系统内核。在一些基准中,如果所有的套接字基本上都是活跃的——比如一个高速局域网环境,epoll并不比选择/民意调查有什么效率,相反,如果过多使用epoll_ctl,效率相比还有稍微的下降。但是一旦使用空闲连接模拟WAN环境,epoll的效率就远在选择/调查之上了。

epoll有两种工作模式:边缘触发(ET),水平触发(LT)

LT(要求等级触发)是缺省的工作方式,并且同时支持块和无阻塞套接字。在这种做法中,内核告诉你一个文件描述符是否就绪了,然后可以对这个就绪的fd进行IO操作。如果你不作任何操作,内核还是会继续通知你的,所以,这种模式编程出错误可能性要小一点。传统的选择/民意调查都是这种模型的代表。

等(边沿触发)是高速工作方式,只支持无阻塞套接字。在这种模式下,当描述符从未就绪变为就绪时,内核通过epoll告诉你,然后它会假设你知道文件描述符已经就绪,并且不会再为那个文件描述符发送更多的就绪通知,直到你做了某些操作导致那个文件描述符不再为就绪状态了(比如,你在发送、接收或者接收请求,或者发送接收的数据少于一定量时导致了一个EWOULDBLOCK错误)。

关于怎么浅析Linux服务器网络开发模型就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看的到。

怎么浅析Linux服务器网络开发模型