一.了解nginx
支持高并发连接。官方测试的是5w并发连接但在实际生产中可制成2-4w并发连接数,得益于nginx使用最新的epoll(linux 2.6内核)和kqueue(freebsd)网络I/O模型。而apache使用的则是传统的select模型,其比较稳定的prefork模式为多进程模式,需要经常派生子进程,所消耗的CPU等服务器资源要比nginx高的多。
二.select 和epoll效率差的原因
select是轮询、epoll是触发式的,所以效率高。单单这样讲,那能懂了才见鬼了.好...我们暂且客观的记住这句话.
1.先说Select
a.Socket数量限制:该模式可操作的Socket数由FD_SETSIZE决定,内核默认32*32=1024.
b.操作限制:通过遍历FD_SETSIZE(1024)个Socket来完成调度,不管哪个Socket是活跃的,都遍历一遍.
2.后说Poll
a.Socket数量几乎无限制:该模式下的Socket对应的fd列表由一个数组来保存,大小不限(默认4k).
b.操作限制:同Select。
3.再说:Epoll
a.Socket数量无限制:同Poll
b.操作无限制:基于内核提供的反射模式,有活跃Socket时,内核访问该Socket的callback,不需要遍历轮询. 但是当所有Socket都活跃的时候,这时候所有的callback都被唤醒,会导致资源的竞争.既然都是要处理所有的Socket,那么遍历是最简单最有效的实现方式。
三.举例说明
对于IM服务器,服务器和服务器之间都是长链接,但数量不多,一般一台60\70个,比如采用ICE这种架构设计,但请求相当频繁和密集,这时候通过反射唤醒callback不一定比用select去遍历处理更好. 对于web portal(门户)服务器,都是浏览器客户端发起的http短链接请求,数量很大,好一点的网站动辄每分钟上千个请求过来,同时服务器端还有更多的闲置等待超时的Socket,这时候没必要把全部的Socket都遍历处理,因为那些等待超时的请求是大多数的,这样用Epoll会更好。
四.支持一个进程打开大数目的socket描述符
select 最不能忍受的是一个进程所打开的FD是有一定限制的,由FD_SETSIZE设置,默认值是1024。对于那些需要支持的上万连接数目的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网卡驱动架构。
八.select模式低效的原因
select 模式低效是由select的定义所决定的,与操作系统实现无关,任何内核在实现select时必须做轮循,才能知道这些socket的情况,这是会消耗cpu的。此外,当你拥有一个很大socket集的时候,尽管任一时间只有小部分的socket是"活跃"的,但每次你都不得不将所有的socket填入到一个FD_SET中,这也会消耗一些cpu,并且当select返回后,处理业务时你可能还需要做“上下文映射”,同样也会有一些性能影响,因此 select比epoll相对低效。
epoll的适用情景就是大量的socket,但是活跃多不是很高的情况。还有kqueue,实际上有不少服务器是基于 BSD 开发的 kqueue和epoll类似,据说效率上稍微高一些,不过没比较过。
相关推荐
### Linux 下 epoll 网络模型介绍 在深入探讨 Linux 下的 epoll 模型之前,我们先了解一下 epoll 的背景以及它为何成为 Linux 内核中 I/O 多路复用的关键技术之一。 #### 1. epoll 的背景与优势 早期 Linux 内核...
在Linux系统中,处理高并发I/O事件时,select和epoll是两种常见的技术。本文将详细介绍这两种技术,以及它们在处理大量并发连接时的特点和优势。 首先,我们来看看`select`函数。`select`是一种古老的I/O多路复用...
这个"linux下Epoll模型实例代码"是一个展示如何在Linux环境下使用Epoll进行I/O事件监控的程序示例。 Epoll的核心概念包括以下几个方面: 1. **Epoll创建**:首先,通过调用`epoll_create()`函数创建一个Epoll实例...
**epoll** 是 Linux 提供的一种 I/O 多路复用技术,相比于传统的 `select` 和 `poll`,`epoll` 在性能上有显著优势,因为它采用了“事件就绪通知”的模型。`epoll` 通过创建一个`epoll`句柄,然后将感兴趣的文件描述...
与传统的select和poll相比,Epoll更加高效,因为它使用了“边缘触发”(ET)模式和“水平触发”(LT)模式,可以减少不必要的系统调用,降低系统开销。在Web服务器中,Epoll用于监听客户端的连接请求,当有新的连接...
epoll是对传统select和poll模型的改进,它引入了“事件就绪”的概念,并使用了“红黑树”数据结构存储监控的文件描述符(FD),从而在添加、删除和查询FD时具有O(1)的时间复杂度。此外,epoll支持水平触发和边缘触发...
`epoll`是Linux内核为解决旧有的`select`和`poll`方法在处理大量文件描述符时效率低下的问题而设计的。它采用了“事件驱动”的模式,通过`epoll_ctl`注册需要监控的文件描述符,并在事件发生时通过`epoll_wait`进行...
Linux的I/O多路复用技术是高性能网络服务器的关键组件,用于高效地处理大量并发连接。...通过对`select`和`epoll`的区别进行深入分析,开发者可以更好地优化自己的程序,以适应不断增长的并发连接需求。
与传统的select和poll相比,epoll提供了更高的性能和更低的延迟,因为它可以实现水平触发和边缘触发两种模式,并且支持文件描述符的批量操作。 在多线程编程中,epoll被广泛用于网络服务器,每个线程负责处理一部分...
`epoll`在传统的`select`和`poll`基础上进行了改进,提供了更好的性能和可扩展性。本知识讲解将围绕`epoll`的工作原理、如何封装`epoll`以及`epoll_server`和`epoll_client`的实现细节展开。 1. **epoll工作原理** ...
本篇文章将详细探讨如何在Linux环境下利用Epoll系统调用来实现一个高性能的Web服务器。 Epoll是I/O多路复用技术的一种,它改进了早期的select和poll方法。Epoll提供了“边缘触发”(ET)和“水平触发”(LT)两种模式,...
这个压缩包文件“Linux C epoll.zip”显然包含了使用C语言编写的服务器(server)和客户端(client)程序,这些程序利用了epoll模型来实现高效的网络通信。此外,还提及了MySQL数据库接口,表明程序可能涉及数据库...
在Linux操作系统中,`epoll`是用于...通过理解和实践这个实例,你可以更好地掌握`epoll`的用法,提升在Linux环境下编写高并发服务程序的能力。记得检查`EPollCodeSource`中的代码,这将加深你对`epoll`实际应用的理解。
- 使用`select()`或`poll()`来处理多个文件描述符的等待,但在高并发场景下,`epoll`性能更优,因为它使用了红黑树数据结构,插入和查找效率更高。 - 在主循环中,调用`epoll_wait()`获取就绪的文件描述符。 - 对于...
Linux的epoll是一种I/O多路复用技术,...总结来说,"linux epoll例子"是一个关于如何在Linux下使用epoll实现高效并发I/O的实例,它涵盖了epoll的基本使用方法和原理,对于理解和掌握网络服务器编程有着重要的学习价值。
总之,`epoll`是Linux下实现高性能TCP服务器的关键技术,通过合理利用它可以构建出高效、稳定的网络服务程序。结合提供的源代码,我们可以深入理解`epoll`的工作机制和TCP服务器的实现细节,为实际开发提供参考。
2. **Epoll(Event Poll)**:Epoll是Linux内核提供的一种I/O多路复用技术,相较于传统的select和poll,Epoll更高效,支持水平触发和边缘触发两种模式,并且能够有效地解决大量文件描述符的问题。Epoll的优势在于其...
- epoll是Event Poll的缩写,主要在Linux 2.5版本之后引入,提供了基于事件驱动的I/O模型。 - 它支持水平触发(LT)和边缘触发(ET)两种模式。水平触发意味着只要文件描述符上有数据可读或可写,就会通知;边缘...
在Linux操作系统中,`epoll`是用于I/O事件通知的一种高效机制,它极大地改进了传统的`select`和`poll`方法。`epoll Sever`是利用`epoll`实现的服务器模型,它可以处理大量的并发连接,适用于高性能、高并发的网络...
相比之下,`epoll`(Event Poll)是Linux内核提供的更高级别的接口,它克服了`select`的这些局限性。`epoll`支持边缘触发(ET)和水平触发(LT)两种模式,且能有效地处理大量文件描述符。在`epoll.c`和`epollclient...