1.先从各自使用的多路复用IO模型提及:
select模型:(apache使用,因为受模块等限制,用的很少)
linux
poll:nginx
poll是unix沿用select本身从新实现了一遍,惟一解决的问题是poll 没有最大文件描述符数量的限制web
epoll模型:(nginx使用)apache
epoll带来了两个优点,大幅度提高了性能:编程
固然epoll也有必定的局限性, epoll只有Linux2.6才有实现 ,而其余平台都没有,这和apache这种优秀的跨平台服务器,显然是有些背道而驰了。
简单来讲epoll是select的升级版,单进程管理的文件描述符没有最大限制。但epoll只有linux平台可以使用。做为跨平台的Apache没有使用。
2.再看一下Apache经常使用的两种并发策略:
1) perfork模式的工做原理:
当Apache被启动时,Apache会自动建立StartServers个进程,而且尽力将空闲进程数保持在MinSpareServers和MaxSpareServers之间。
若是空闲进程小于MinSpareServers,Apache将会以大约每秒1个的速度新建进程。
若是空闲进程小于MaxSpareServers,Apache将会删除多余的空闲进程,释放服务器资源。
进程数的最大值由MaxClients控制,在Apache1.3中最大只能设置为256,但在Apache2.0中,能够经过在配置开头增长ServerLimit项目来突破256的限制,此时必须MaxClients ≤ ServerLimit ≤ 20000
MaxRequestsPerChild用来控制每一个进程在处理了多少次请求以后自动销毁,这个参数能够设置为0表示无限(即不销毁进程)
2) worker模式的工做原理:
由主控制进程生成“StartServers”个子进程,每一个子进程中包含固定的ThreadsPerChild线程数,各个线程独立地处理请求。
一样,为了避免在请求到来时再生成线程,MinSpareThreads和MaxSpareThreads设置了最少和最多的空闲线程数;而MaxClients设置容许的最大线程总数。
若是现有子进程中的线程总数不能知足负载,控制进程将派生新的子进程。
每一个子线程处理服务请求次数由MaxRequestPerChild定义。 缺省的设置值为0,即响应无限此请求。
默认生成3个子进程来处理请求。
两种策略的缺陷:
perfork模式:每个链接建立一个进程,每一个进程内单线程。对于一个负载相对较高的网站来讲,256的进程限制是不够的,若是服务器已经达到256的极限,那么接下去的访问就须要排队,这也就是为何某些服务器负载不高,可是访问却很慢的缘由之一。数组
worker模式:也是多进程处理,也会建立多个进程和多个线程,若是进程数达到管理员设置的阀值,则会拒绝新的请求。
两种模式都会建立多个进程或线程,而每一个进程或线程都会为其分配cpu和内存(线程要比进程小的多,因此worker支持比perfork高的并发),并发过大会榨干服务器资源。服务器
3.Nginx的工做原理:
Nginx并不会为每个的web请求建立新的进程,相反,管理员能够配置Nginx主进程的工做进程的数量(一个常见的作法是为每个CPU配置一个工做进程)。全部这些进程都是单线程的。
每个工做进程能够处理数千个并发的请求。它经过一个线程来异步非阻塞的完成了这些工做(epoll),而没有使用多线程的编程模型。
nginx的优点:
采用单线程来异步非阻塞处理请求,不会为每一个请求分配cpu和内存资源,节省了大量资源,同时也减小了大量的CPU的上下文切换。因此才使得Nginx支持更高的并发。网络