MPM(多处理模块)
Apache2.x一般常用的有prefork、worker、event三种常用的mpm,查看当前使用模块可以使用httpd -l prefork
这个多路处理模块(MPM)实现了一个非线程型的、预派生的web服务器,这个MPM具有很强的自我调节能力,只需要很少的配置指令调整。最重要的是将MaxClients设置为一个足够大的数值以处理潜在的请求高峰,同时又不能太大,以致需要使用的内存超出物理内存的大小。主要的配置参数如下:
- StartServers:服务启动时启动的子进程数,比如配置为5,在httpd启动后通过ps -ef|grep httpd将看到6个http进程,其中一个为主进程以root用户运行,其他5个为子进程以apache(不同安装会有所不同)用户运行,该5个进程的父进程pid为主进程的pid
- MinSpareServers:最少空闲的子进程数,当空闲的进程数小于该值时,apache会派生出一些子进程,以达到该值
- MaxSpareServers:最多空闲的子进程数,当空闲的进程数大于该值时,apache会结束掉一些子进程,以达到该值
- ServerLimit:控制同时存在的最多的子进程数,用于控制MaxClients最大值
- MaxClients:同时存在的最多的子进程数,一般默认值为256,如果系统访问量大的话,需要调整该值,但是在修改该值时不能大于ServerLimit设置的值。该配置是影响prefork模式下处理能力的关键参数,当发现服务器负载比较低,但是访问慢的情况下,一般就是该值比较低,好多请求都在排队中,排队的请求个数通过参数ListenBacklog配置,例如默认配置下的256,同时最多处理的请求数为256个,通过ps -ef|grep httpd发现httpd的进程数始终都是257个,其中一个为主进程,其余256个为子进程,即设置的MaxClients的值,该配置项参数名称在2.3以后改为MaxRequestWorkers
- MaxRequestsPerChild:每个子进程处理的最大请求数,当请求的总的请求数超过该值时,Apache就会kill掉该子进程,配置为0时,则该子进程不会结束。该配置主要影响内存的使用,当设置为0时,即不结束子进程,可能会存在内存用尽的情况,所以推荐修改该值为一个非0值
worker
此多路处理模块(MPM)使网络服务器支持混合的多线程多进程。由于使用线程来处理请求,所以可以处理海量请求,而系统资源的开销小于基于进程的MPM。主要的配置参数如下:
- StartServers:初始启动的子进程数
- MinSpareThreads:最少空闲的线程数
- MaxSpareThreads:最多空闲的线程数
- ThreadsPerChild:每个子进程生成的工作线程的数量,该值是固定的,默认值为25,ThreadsPerChild的最大缺省值是64,如果负载较大,64也是不够的。这时要显式使用 ThreadLimit指令,它的最大缺省值是20000。
- MaxRequestWorkers:最多数量的工作线程数,该值主要是由子进程数*ThreadsPerChild得来,该值是影响性能的关键因素,该值默认设置为400,即需要的子进程数为400/ThreadsPerChild=16,如果在访问量大的情况下,400是不够的,该值定义了最多处理的请求连接数,而且MaxRequestWorkers必须为ThreadsPerChild的整数倍,如果设置的不是ThreadsPerChild的整数倍,Apache会自动调整为ThreadsPerChild的整数倍,如果设置该值大于400时,同时需要设置ServerLimit(最多子进程数)的值,例如设置MaxRequestWorkers为2000,则需要的子进程数为2000/25=80,则ServerLimit的值必须设置为>=80
- MaxConnectionsPerChild:每个子进程处理的最多请求数,当超过该请求数时,则该子进程会被kill掉,重新生成新的子进程
event
该模块在Apache2.4中才从实验状态改为稳定状态,event的配置参数同worker的配置,该模块主要解决的是HTTP中的“keep alive”问题,尽管HTTP的Keepalive方式能减少TCP连接数量和网络负载,但是 Keepalive需要和服务进程或者线程绑定,这就导致一个繁忙的服务器会耗光所有的线程。event使用一个专用的线程来处理这些keep alive的请求,当客户端发送keep alive的请求连接后,请求处理完成后,工作线程不用维持保持连接的状态,这个状态由专门的线程来保持,当后续请求到达后,该线程会将此请求转给工作线程去处理,这就不需要所有的工作线程都保持连接的状态,特别是在timeout时间比较长的情况下,导致工作线程在keep alive状态下无法释放,从而提高了系统的处理能力。但是在https的情况下,该模块无法使用,会使用worker模块来处理。
总结
在apace2.2中,主要使用的prefork和worker模块,event模块是在Apache2.4以后才到达稳定状态的,一般是Apache2.4默认的MPM,主要是为了提高Apache的并发处理能力,但是在使用这些mpm之前,最好理解各个mpm的工作原理以及各自的性能瓶颈在哪里,只有这样才能用好Apache,不至于掉到坑里出不来了