apache的MPM模块
不同的操作系统默认使用不同的MPM
Netware | mpm_netware |
OS/2 | mpmt_os2 |
Unix | prefork,worker 或 event,取决于平台特性 |
Windows | mpm_winnt |
这里只讨论一下linux相关的 prefork,worker和event
要求 更高伸缩性的站点可以选择使用线程的 MPM,即 worker 或 event; 需要可靠性或者与旧软件兼容的站点可以使用 prefork。
prefork模块
apache会在启动的时候预先维护几个空闲或备用的进程,这些进程已经随时可以提供服务,通过这种方式
客户端不需要因为等待子进程被fork而降低用户体验
相关的调节性能参数
# prefork MPM
# StartServers: 服务开启时默认启动的工作进程数,不包括主进程
# MinSpareServers: 最小空闲进程数,如果少于设置的数量,父进程会创建新的子进程,并且产生的速度是
第一秒1个 第二秒2个,第三秒4个 以指数形势增长,直到每秒产生32个子进程,
只有满足设置的数量才会停止创建子进程
# MaxSpareServers: 最大空闲进程数,空闲的进程是不处理请求的进程,如果存在多余设置的值,父进程
会主动终止多余的子进程
# MaxRequestWorkers: 并发请求的最大数,一条进程最多能处理多少个请求
# MaxConnectionsPerChild: 每个子进程在生命周期内所能够服务的最多请求个数
默认的设置
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxRequestWorkers 250
MaxConnectionsPerChild 0
</IfModule>
worker模块
这是一个多进程多线程的混合的模式,她也会预先fork一些子进程,然后每个子进程创建一些线程,当请求过来的时候,
会分配线程来提供服务,因为线程会更轻量所以在高并发的场景这个模式会用的比较多
相关的调节参数
# worker MPM
# StartServers: apache启动时候创建的子进程数量
# MinSpareThreads: 最小空闲线程数,如果服务
器中没有足够的空闲线程,则会创建子进程,直到空闲线程数量大于设定值
# MaxSpareThreads: 最大空闲线程数
# ThreadsPerChild: 该指令设置每个子进程创建的线程数
# MaxRequestWorkers: 每个子进程在生命周期内所能够服务的最多请求个数,0表示不限定
# MaxConnectionsPerChild:一个子进程最大处理的连接数
默认的设置
<IfModule mpm_worker_module>
StartServers 3
MinSpareThreads 75
MaxSpareThreads 250
ThreadsPerChild 25
MaxRequestWorkers 400
MaxConnectionsPerChild 0
</IfModule>
event模块
event是基于worker的一个模块,一个父进程启动子进程,每个子进程根据ThreadsPerChild的值创建固定数量的线程,尽管HTTP的Keepalive方式能减少TCP连接数量和网络负载,但是 Keepalive需要和服务进程或者线程绑定,这就导致一个繁忙的服务器会耗光所有的线程。 Event MPM是解决这个问题的一种新模型,他可以将keepalive的连接转移到监听的线程,如果有新的请求过来,将会转发到第一个可用的线程,这样就可以缓解由于keepalive服务器繁忙而线程耗尽的问题,注意一点,event MPM需要Linux系统(Linux 2.6+)对EPoll的支持,才能启用。还有,需要补充的是HTTPS的连接(SSL),它的运行模式仍然是类似worker的方式,线程会被一直占用,直到连接关闭。
# event MPM
# StartServers: apache启动时候创建的子进程数量
# MinSpareThreads: 最小空闲线程数,如果服务器中没有足够的
空闲线程,则会创建子进程,直到空闲线程数量大于设定值
# MaxSpareThreads: 最大空闲线程数
# ThreadsPerChild: 该指令设置每个子进程创建的线程数
# MaxRequestWorkers: 每个子进程在生命周期内所能够服务的最多请求个数,0表示不限定
# MaxConnectionsPerChild:一个子进程最大处理的连接数
<IfModule mpm_event_module>
StartServers 3
MinSpareThreads 75
MaxSpareThreads 250
ThreadsPerChild 25
MaxRequestWorkers 400
MaxConnectionsPerChild 0
</IfModule>
Nginx的工作原理
NGINX有一个主进程和一个或多个工作进程。如果缓存被启用,缓存加载器和缓存管理器进程也启动时运行。主进程的主要目的是读取和评估配置文件,并维护工作进程。工作进程执行请求的实际处理。所有进程均是仅含有一个线程,并主要通过“共享内存”的机制实现进程间通信。主进程以root用户身份运行,而worker、 cache loader和cache manager均应以非特权用户身份运行。NGINX依靠依赖操作系统的机制来有效地在工作进程中分配请求。工作进程的数量由nginx.conf配置文件中的worker_processes指令定义,可以设置为固定值,也可以配置为自动调整为可用CPU核心数。
Nginx支持多种连接处理方法select,poll,epoll,kqueue,/dev/poll,eventport
参考:unix网络编程