MPM全称:Multi-Processing Module(多线程处理模块)
MPM处理的模式有很多种:prefork MPM、worker MPM、BeOS MPM、NetWare MPM、OS/2 MPM、WinNT MPM
类UNIX常用的模式有三种:prefork 、worker 、event
确定当前操作安装的MPM模块
windows下:
在cmd窗口输入执行以下命令:
C:\wamp\Apache2\bin\httpd.ex -l
C:\Documents and Settings\Administrator>C:\wamp\Apache2\bin\httpd.exe -l
Compiled in modules:
core.c
mod_win32.c
mpm_winnt.c
http_core.c
mod_so.c
类unix下:
执行以下命令
./usr/local/apache2/bin/apachectl -l
Compiled in modules:
core.c
mod_so.c
http_core.c
event.c
对于windows的服务器一般使用的是winnt.c的模块
对于类unix一般使用的是prefork 、worker 、event三种模块中的一种。下面我们介绍这三种模块的工作原理。
prefork模块
当apache启动之后,系统会生成一个httpd的进程,再由这个进程生成多个子进程,每个子进程只能生成一个线程,每个线程只能处理一个HTTP讲求,如果HTTP请求处理完成后,就会将这个线程和子进程销毁,那么如处理高并发请求时,即如果有很多的HTTP请求从客户端向上服务器时,就得不停的创建子进程和线程,这样会带更的CPU资源的消耗。
worker模块
当apache启动之后,系统会生成一个httpd的进程,再由这个进程生成多个子进程,每个子进程只能生成多个线程,这个可以最大限度发挥并发作用。因为worker模块相当于prefork模块最大的优点是即使我们同时处理多HTTP请求,系统资源的消耗会降到最小化。
但是其它最大的缺点:
一:由于同一个子进程生成的线程是共享相同的内存的,所以如果有某个线程出现异常时,会导致父子进程出现异常。
二:如果某线程出现长连接等待时,其它的线程必须也是在长时间等待。
event模块
为了解决worker模块存在的问题,event模块在worker模块的基础上添加了一个关于管理与分配线程的程序,这样来更的分配系统资源去处理我们的HTTP请求,避免worker模块存在的问题。
通常在类UNIX操作系统下我们使用event模式,通常主要设置的参数如下:
参数说明:
StartServers:表示当apache服务器一启动时,系统生成出来的进程数
MinSpareServers:表示最小空闲进程数,之所以设置最小空闲进程数,是因为会有一些突发情况需要处理,所以空闲的进程主要是用于处理突发情况。
MaxSpareServers:表示最大空闲进程数,如果空闲的进程数超过最大的空闲进程,就会将多余地空闲的进程释放。
ServerLimit:表示允许最多可以产生多少进程数
MaxClients:表示允许同时处理HTTP请求数,如果设置为0就表示不限制。如果设置具体的值M,如果客户端同时提交的HTTP数超过M,那么就是会出排队的情况,如果排队请求超过了timeout的时间限制,那么就会将多这个HTTP直接拒绝。
关于MaxClients值的计算,有一个参考的计算方法如下:
MaxClients ≈ (RAM -size_all_other_processes)/(size_apache_process)
RAM:表示物理内存
size_all_other_processes:表示其它的任务所消耗的内存
size_apache_process:每个HTTP进程所消耗的内存大小
如以下实例:
系统:VPS(虚拟专用服务器)Linux RedHat5 128MB RAM
Apache:2.2 mpm_prefork、mod_php、mod_rewrite、mod_ssl及其它一些模块
其他服务:MySQL、BIND、Sendmail
报告的系统内存:120MB
报告的httpd进程大小:7-13MB
假设Apache可用内存为:90MB
最佳的设置:
StartServers 5
MinSpareServers 5
MaxSpareServers 10
ServerLimit 15
MaxClients 15
MaxRequestsPerChild 2000
MaxRequestsPerChild:表示每个纯种最多可以处理的HTTP请求,如果设置为0就表示不限制,如果设置一个固定值M,那么如果这个线程处理的HTTP请求超过M时,就会将这个线程释放。
如何对mpm调优的步骤如下:
1.启动MPM模块,让其进行工作,在httpd.conf,将以下面代码前的#去掉
Include conf/extra/httpd-mpm.conf
2.在httpd-mpm.conf文件中修改mpm的值
./apache2/conf/extra/httpd-mpm.conf
之所以是修改mpm_event_module模块,是因为前面已经介绍过如何确定当前apache所安装的MPM模块
StartServers 10
MinSpareThreads 75
MaxSpareThreads 150
ThreadsPerChild 50
ServerLimit 200
MaxRequestWorkers 10000
MaxConnectionsPerChild 0