在 “Nginx 0.7.x + PHP 5.2.10(FastCGI)搭建支持高并发量的Web服务器 ”文章提到过:为什么Nginx的性能要比Apache高得多这一问题。这主要是因为Nginx使用了最新的epoll(Linux 2.6内核)和kqueue(FreeBSD)网络I/O模型,而Apache则使用的是传统的select模型。曾在一篇博客上看到有这么个实例:
假设你在大学中读书,要等待一个朋友来访,而这个朋友只知道你在A号楼,但是不知道你具体住在哪里,于是你们约好了在A号楼门口见面.如果你使用的阻塞IO 模型来处理这个问题,那么你就只能一直守候在A号楼门口等待朋友的到来,在这段时间里你不能做别的事情,不难知道,这种方式的效率是低下的.现在时代变化了,开始使用多路复用IO模型来处理这个问题.你告诉你的朋友来了A号楼找楼管大妈,让她告诉你该怎么走.这里的楼管大妈扮演的就是多路复用IO的角色。
解释select和epoll模型的工作方式:
select版大妈做的是如下的事情:比如同学甲的朋友来了,select版大妈比较笨,她带着朋友挨个房间进行查询谁是同学甲,你等的朋友来了。如果每到来一个朋友楼管大妈都要全楼的查询同学,那么处理的效率必然就低下了,过不久楼底就有不少的人了。
epoll版大妈就比较先进了,她记下了同学甲的信息,比如说他的房间号,那么等同学甲的朋友到来时,只需要告诉该朋友同学甲在哪个房间即可,不用自己亲自带着人满大楼的找人了。epoll大妈可以不用吹灰之力就可以定位到同学甲。一看就很明白 epoll和select 模型的区别了吧。
在Linux内核中,select所用到的FD_SET是有限的,即内核中有个参数__FD_SETSIZE定义了每个FD_SET的句柄个数,在内核源码中 /usr/include/linux/posix_types.h 中
#undef __FD_SETSIZE
#define __FD_SETSIZE 1024
如果想要同时检测1025个句柄的可读状态或 可写状态 ,select是不能实现的。在内核中实现select是使用轮询方法,即每次检测都会遍历所有FD_SET中的句柄,显然,select函数的执行时间与 FD检测的句柄数越多就会越费时。
epoll是多路复用IO(I/O Multiplexing) 中的一种方式,仅用于linux2.6以上内核。而epoll模型它所支持的FD上限是最大可以打开文件的数目,这个数字一般远大于2048,举个例子,在1GB内存的机器上大约是10万左右,具体请查看:cat /proc/sys/fs/file-max ,这个数目和系统内存关系很大。
传统的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之上了。
epoll有两种工作模式:Edge Triggered (ET)、Level Triggered (LT)
LT(level triggered)是缺省的工作方式,并且同时支持block和no-block socket.在这种做法中,内核告诉你一个文件描述符是否就绪了,然后可以对这个就绪的fd进行IO操作。如果你不作任何操作,内核还是会继续通知你的,所以,这种模式编程出错误可能性要小一点。传统的select/poll都是这种模型的代表。
ET (edge-triggered)是高速工作方式,只支持no-block socket。在这种模式下,当描述符从未就绪变为就绪时,内核通过epoll告诉你。然后它会假设你知道文件描述符已经就绪,并且不会再为那个文件描述符发送更多的就绪通知,直到你做了某些操作导致那个文件描述符不再为就绪状态了(比如,你在发送,接收或者接收请求,或者发送接收的数据少于一定量时导致了一个EWOULDBLOCK 错误)。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/ctowoo/archive/2009/10/01/4626140.aspx
分享到:
相关推荐
Linux服务器网络开发模型是构建高性能网络服务的关键,其中Nginx和Apache的性能差异主要源于它们采用的不同I/O模型。Nginx利用了Linux 2.6内核提供的epoll(在FreeBSD系统中则是kqueue)网络I/O模型,而Apache则依赖...
在IT行业中,Linux系统因其开源、稳定和高效的特点,被广泛应用于服务器开发,尤其是在嵌入式领域。"牛客网Linux高并发服务器开发"这个压缩包文件,显然聚焦于利用Linux进行高性能服务器的设计与实现,这涉及到多个...
Linux服务器开发网络篇的知识点涵盖了网络应用的设计模式、TCP/IP模型、OSI模型、ARP协议原理、以太网帧格式、IP数据报格式以及它们在网络通信中的作用与交互。下面将详细解释这些关键知识点。 1. 网络应用设计模式...
《Linux高性能服务器编程》这本书是针对那些希望深入理解并掌握Linux环境下服务器开发技术的专业人士而编写的。书中详细探讨了如何利用C和C++这两种语言,实现高效且可靠的服务器应用程序。以下是该书可能涵盖的一些...
这门课程旨在帮助学员建立一个全面的Linux C/C++后端服务器开发体系,从基础到高级,从理论到实践,通过学习可以掌握高性能服务器设计、网络编程、组件设计、中间件开发、性能分析以及分布式架构等关键技能。...
在Linux操作系统中,服务器开发是IT领域中的一个重要组成部分,它涉及到网络编程、系统编程和并发处理等多个技术领域。本压缩包文件包含的核心知识点主要...对于学习和掌握Linux服务器开发,这些内容是不可或缺的基础。
《Linux设备驱动开发详解》是一本深度探讨Linux内核驱动程序开发的专业书籍,它以Linux 4.0内核为背景,为驱动工程师提供了一条深入理解与实践Linux设备驱动的路径。这本书涵盖了许多关键的知识点,对于想要在Linux...
综合以上内容,C/C++ Linux服务器开发的学习路径应该是:先理解Linux系统的基本操作和编程接口,然后掌握多进程和多线程的编程技术,最后深入到网络编程,学会如何编写可靠的网络服务器和客户端程序。这些知识不仅...
Linux网络基础和网络编程是IT领域中的重要组成部分,特别是在服务器端开发中不可或缺。本文将深入探讨这个主题,从Linux网络的基础知识开始,逐步讲解到Socket编程以及如何实现高并发服务器。 1. Linux网络基础: ...
信息安全等级保护中Linux服务器测评方法研究 本文研究了Linux服务器测评方法在信息安全等级保护中的应用。Linux操作系统的发展与完善,使得许多中小企业用户开始使用Linux操作系统的服务器,但是很多Linux系统...
### 服务器开发经验小汇总 #### Linux服务器与Windows服务器对比分析及实践经验 在现代信息技术领域中,服务器作为网络服务的核心组件之一,在数据处理、存储以及网络通信等方面扮演着至关重要的角色。本文旨在对...
总之,EasyCpp是为嵌入式Linux环境设计的一个C++服务器开发框架,它结合了C++的强大功能和敏捷开发的最佳实践,提供了一种高效、灵活的解决方案。理解和掌握上述知识点将有助于开发者充分利用EasyCpp进行网络服务的...
根据提供的文件信息,本篇文章将围绕“C/C++完整视频教程(三)——Linux服务器编程”这一主题展开,深入解析该教程所涵盖的关键知识点。由于实际视频内容无法直接获取,以下解析将基于标题、描述及标签提供的信息...
总的来说,《Linux高性能服务器编程》的随书代码涵盖了从基础的网络编程到高级的并发模型、内存管理和性能优化等多个方面,是学习和实践Linux服务器开发的宝贵资源。通过深入研究这些代码,读者不仅可以提升自己的...
在MacOsx操作系统中,有时候我们需要远程操控Linux服务器进行系统管理和软件开发等工作,这时,VNC(Virtual Network Computing)技术为我们提供了一个可视化解决方案。VNCViewer是一款功能强大的VNC客户端工具,...
Linux服务器开发: 1. 算法与设计模式专栏 2. 后台组件编程专栏 3. 基础组件开发专栏 4. 开源框架 5. 网络服务 6. 性能测试 7. 代码工程化 8. 互联网云盘项目 高级架构 1. 源码分析 2. 中间件开发 3. Linux内核 4....
为了提高并发性能,Linux服务器通常采用多线程模型。主线程负责监听新的连接请求,一旦有新的连接,就创建一个工作线程来处理这个请求。这可以通过`pthread_create()`创建线程,`pthread_join()`等待线程结束,`...
《Linux高性能服务器编程》这本书是Linux服务器开发领域的权威指南,由具有丰富经验的Linux软件开发工程师游双倾力打造。本书旨在深入探讨如何利用Linux系统实现高性能的服务器应用,覆盖了网络协议、服务器编程的...
服务器开发往往关注性能,面试中可能会讨论如何通过缓存、负载均衡、数据库优化、代码优化等手段提升系统性能。理解CPU、内存、磁盘I/O等资源的瓶颈分析和调优方法也非常重要。 总之,Linux C/C++服务器后台开发...