`

nginx采用epoll的事件模型,为何效率高

 
阅读更多
http://blog.csdn.net/arieshyde/article/details/6718823
以前就知道在linux下nginx采用epoll事件模型,处理效率高。但是一直不知道具体为什么,今天查看了下文档,了解了原因。
首先nginx支持一下这些事件模型(才考nginx的wiki)
Nginx支持如下处理连接的方法(I/O复用方法),这些方法可以通过use指令指定。

select - 标准方法。 如果当前平台没有更有效的方法,它是编译时默认的方法。你可以使用配置参数 --with-select_module 和 --without-select_module 来启用或禁用这个模块。
poll - 标准方法。 如果当前平台没有更有效的方法,它是编译时默认的方法。你可以使用配置参数 --with-poll_module 和 --without-poll_module 来启用或禁用这个模块。
kqueue - 高效的方法,使用于 FreeBSD 4.1+, OpenBSD 2.9+, NetBSD 2.0 和 MacOS X. 使用双处理器的MacOS X系统使用kqueue可能会造成内核崩溃。
epoll - 高效的方法,使用于Linux内核2.6版本及以后的系统。在某些发行版本中,如SuSE 8.2, 有让2.4版本的内核支持epoll的补丁。
rtsig - 可执行的实时信号,使用于Linux内核版本2.2.19以后的系统。默认情况下整个系统中不能出现大于1024个POSIX实时(排队)信号。这种情况对于高负载的服务器来说是低效的;所以有必要通过调节内核参数 /proc/sys/kernel/rtsig-max 来增加队列的大小。可是从Linux内核版本2.6.6-mm2开始, 这个参数就不再使用了,并且对于每个进程有一个独立的信号队列,这个队列的大小可以用 RLIMIT_SIGPENDING 参数调节。当这个队列过于拥塞,nginx就放弃它并且开始使用 poll 方法来处理连接直到恢复正常。
/dev/poll - 高效的方法,使用于 Solaris 7 11/99+, HP/UX 11.22+ (eventport), IRIX 6.5.15+ 和 Tru64 UNIX 5.1A+.
eventport - 高效的方法,使用于 Solaris 10. 为了防止出现内核崩溃的问题, 有必要安装 这个 安全补丁。
在linux下面,只有epoll是高效的方法。

下面再来看看epoll到底是如何高效的
Epoll是Linux内核为处理大批量句柄而作了改进的poll。要使用epoll只需要这三个系统调用:epoll_create(2), epoll_ctl(2), epoll_wait(2)。它是在2.5.44内核中被引进的(epoll(4) is a new API introduced in Linux kernel 2.5.44),在2.6内核中得到广泛应用。

epoll的优点
支持一个进程打开大数目的socket描述符(FD)
select 最不能忍受的是一个进程所打开的FD是有一定限制的,由FD_SETSIZE设置,默认值是2048。对于那些需要支持的上万连接数目的IM服务器来说显然太少了。这时候你一是可以选择修改这个宏然后重新编译内核,不过资料也同时指出这样会带来网络效率的下降,二是可以选择多进程的解决方案(传统的Apache方案),不过虽然linux上面创建进程的代价比较小,但仍旧是不可忽视的,加上进程间数据同步远比不上线程间同步的高效,所以也不是一种完美的方案。不过 epoll则没有这个限制,它所支持的FD上限是最大可以打开文件的数目,这个数字一般远大于2048,举个例子,在1GB内存的机器上大约是10万左右,具体数目可以cat /proc/sys/fs/file-max察看,一般来说这个数目和系统内存关系很大。

IO效率不随FD数目增加而线性下降
传统的select/poll另一个致命弱点就是当你拥有一个很大的socket集合,不过由于网络延时,任一时间只有部分的socket是"活跃"的,但是select/poll每次调用都会线性扫描全部的集合,导致效率呈现线性下降。但是epoll不存在这个问题,它只会对"活跃"的socket进行操作---这是因为在内核实现中epoll是根据每个fd上面的callback函数实现的。那么,只有"活跃"的socket才会主动的去调用 callback函数,其他idle状态socket则不会,在这点上,epoll实现了一个"伪"AIO,因为这时候推动力在os内核。在一些 benchmark中,如果所有的socket基本上都是活跃的---比如一个高速LAN环境,epoll并不比select/poll有什么效率,相反,如果过多使用epoll_ctl,效率相比还有稍微的下降。但是一旦使用idle connections模拟WAN环境,epoll的效率就远在select/poll之上了。

使用mmap加速内核与用户空间的消息传递。
这点实际上涉及到epoll的具体实现了。无论是select,poll还是epoll都需要内核把FD消息通知给用户空间,如何避免不必要的内存拷贝就很重要,在这点上,epoll是通过内核于用户空间mmap同一块内存实现的。而如果你想我一样从2.5内核就关注epoll的话,一定不会忘记手工 mmap这一步的。

内核微调
这一点其实不算epoll的优点了,而是整个linux平台的优点。也许你可以怀疑linux平台,但是你无法回避linux平台赋予你微调内核的能力。比如,内核TCP/IP协议栈使用内存池管理sk_buff结构,那么可以在运行时期动态调整这个内存pool(skb_head_pool)的大小--- 通过echo XXXX>/proc/sys/net/core/hot_list_length完成。再比如listen函数的第2个参数(TCP完成3次握手的数据包队列长度),也可以根据你平台内存大小动态调整。更甚至在一个数据包面数目巨大但同时每个数据包本身大小却很小的特殊系统上尝试最新的NAPI网卡驱动架构。

以上这些epoll内容,参考epoll_互动百科

在我128M的vps上,我查看了一下,file-max的数量已经达到11945
应该说确实比apache的方式要好,而且资源占用也
分享到:
评论

相关推荐

    nginx-1.18.0.zip

    Nginx是一个高性能的HTTP和反向代理服务器,...在Linux操作系统下,nginx使用epoll事件模型,得益于此,nginx在Linux操作系统下效率相当高。同时Nginx在OpenBSD或FreeBSD操作系统上采用类似于Epoll的高效事件模型kqueue.

    nginx优化详细

    - 在 Nginx 配置文件中设置 `worker_rlimit_nofile` 为较高的数值,通常与 `ulimit -n` 的值保持一致。 - 示例配置: ```nginx worker_rlimit_nofile 65535; ``` - **注意事项**: - 文件描述符的限制还可以在...

    Linux网络通信epoll模型

    - **效率高**:epoll使用“红黑树”存储文件描述符,查找和更新效率更高;并且,epoll_wait()只返回已就绪的文件描述符,避免了无谓的轮询。 - **可扩展性好**:epoll支持边缘触发(ET,Edge Triggered)和水平...

    linux系统下nginx高连接并发控制机制研究.pdf

    相比Apache,Nginx在处理高并发连接时表现出更高的效率,这主要得益于其对Linux内核的epoll事件模型的巧妙利用。 二、高并发连接控制 当多个用户同时通过HTTP协议访问Web服务器时,服务器需要处理多个TCP连接,即多...

    nginx-1.2.4(最新稳定版)

    6. **高性能并发**:Nginx采用epoll事件模型,可以处理成千上万的并发连接,尤其适合高流量的网站。 7. **错误页面定制**:Nginx允许自定义404、500等错误页面,提升用户体验。 在实际部署中,Nginx通常与动态语言...

    epoll/iocp 比较

    - 高效:利用红黑树数据结构存储文件描述符,查找效率高。 - 少量系统调用:epoll_wait()返回后,直接处理就绪的文件描述符,减少了系统调用次数。 - 多线程优化:支持边缘触发(ET)模式,减少不必要的读写操作...

    Docker容器中运行nginx

    在Linux操作系统下,nginx使用epoll事件模型,得益于此,nginx在Linux操作系统下效率相当高。同时Nginx在OpenBSD或FreeBSD操作系统上采用类似于epoll的高效事件模型kqueue。 docker hub拉取 docker

    从nginx角度看服务器多进程模型设计

    工作进程通过非阻塞I/O机制(如epoll)处理请求,这意味着即使在等待网络I/O操作完成时,工作进程也可以处理其他请求,显著提高了效率。 在"从nginx角度看服务器多进程模型设计(二).pdf"中,可能进一步讨论了Nginx...

    Nginx高性能Web服务器详解

    当请求到达时,Nginx会将其放入一个事件队列,然后通过epoll(Linux系统)或其他类似的机制来监控这些事件,只有在有数据可读或可写时才会进行实际操作,从而减少了CPU上下文切换的开销。 其次,Nginx的反向代理...

    nginx-0.8.4源代码

    Nginx支持多种事件模型,如epoll(Linux),kqueue(FreeBSD,OpenBSD,NetBSD),select和poll等。在`ngx_event.c`和相关的文件中,可以看到这些事件模型的实现。 3. **http**:这个目录包含了Nginx处理HTTP协议的...

    NGINX 0.1版代码

    NGINX采用非阻塞的事件驱动模型,这一模型在0.1版中已经体现。它利用了诸如epoll(Linux)、kqueue(FreeBSD)这样的系统调用来实现高效I/O操作。这种模型使得NGINX能够同时处理大量连接,而不会因为单个连接阻塞...

    nginx v1.5.9 for windows 源程序

    Nginx是一个很强大的高性能Web和反向代理服务器 它具有很多非常优越的特性 Nginx可以在大多数 Unix like OS 上编译运行 在Linux和unix上分别采用epoll和kqueue网络模型 能够支持高达 50 000 个并发连接数的响应...

    nginx v1.5.9 for windows

    Nginx是一个很强大的高性能Web和反向代理服务器 它具有很多非常优越的特性 Nginx可以在大多数 Unix like OS 上编译运行 在Linux和unix上分别采用epoll和kqueue网络模型 能够支持高达 50 000 个并发连接数的响应...

    nginx-0.0.1源代码

    - Nginx 使用事件驱动模型处理网络连接,它通过epoll(Linux)、kqueue(FreeBSD)等系统调用来实现异步非阻塞I/O操作,有效减少了等待I/O操作完成时的资源消耗。 - 这种模型使得 Nginx 可以同时处理大量并发连接...

    Nginx高性能WEB服务器最佳实践.pdf

    epoll模型的选择机制效率高于传统的select模型,它无需遍历所有句柄,而是直接响应有事件发生的句柄。 Nginx的架构分为核心模块、基础模块和第三方模块。核心模块包含HTTP模块、EVENT模块和MAIL模块。基础模块则...

    Linux下如何搭建nginx服务器

    - **Nginx的工作模型:** Nginx采用异步事件驱动模型,可以同时处理成千上万个连接。 #### 二、Nginx的网络I/O模型解析 **1. Select模型:** - **Socket数量限制:** 受制于内核参数`FD_SETSIZE`,默认值为1024。 ...

    nginx核心详解

    Nginx的事件处理机制是另一个核心特性,它支持多种事件模型,如epoll(Linux系统)、kqueue(FreeBSD系统)等。epoll在本文档中被特别提及,它是Linux 2.6及以上内核提供的一种I/O多路复用技术,能有效处理大量并发...

    轻量级HTTP服务器Nginx

    #### 1.2 为什么选择Nginx ##### 1.2.1 Nginx与Apache的异同 虽然Nginx和Apache都提供了类似的HTTP服务功能,但它们在性能和功能实现上有显著差异: - **处理速度**:Apache处理速度相对较慢,而Nginx处理速度快...

    深入理解Nginx 模块开发与架构解析-完美排版

    此外,理解Nginx的事件模型,如epoll、kqueue等,对于优化模块性能至关重要。 Nginx的配置文件是其强大之处之一。配置文件中,指令和块结构允许精细控制服务器行为。例如,可以基于IP地址、端口、URL路径甚至HTTP...

Global site tag (gtag.js) - Google Analytics