Apache调优之MPM调优

247 阅读4分钟
原文链接: zhuanlan.zhihu.com

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模式,通常主要设置的参数如下:

<IfModule mpm_event.c>

StartServers 10 //默认为4

MinSpareServers 10 //默认16

MaxSpareServers 15 //默认512

ServerLimit 20 //默认32

MaxClients 1000

ThreadsPreChild 30 //最大64,默认是25

MaxRequestsPerChild 10000

MaxConnectionsPerChild 10000 //最大10000

</IfModule>


参数说明:

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模块

<IfModule mpm_event_module>

StartServers 10

MinSpareThreads 75

MaxSpareThreads 150

ThreadsPerChild 50

ServerLimit 200

MaxRequestWorkers 10000

MaxConnectionsPerChild 0

</IfModule>