ApachePrefork、Worker和Event三种MPM分析
2.xApache支持插件式并行处理模块,称为多路处理模块(MPM)。编译apache时,您必须只选择一个MPM。对于类UNIX系统,有几种不同的MPM可供选择,这将影响apache的速度和可伸缩性。
PreforkMPM:这个多路复用模块(MPM)实现了一个非线程的、预派生的web服务器,其工作方式类似于Apache1.3。它适用于没有线程安全库并且需要避免线程兼容性问题的系统。最好的MPM要求每个请求相互独立,这样,如果一个请求出错,不会影响其他请求。
这款MPM自我调节能力很强,只需要几个配置指令就可以调节。最重要的是将MaxClients设置为一个足够大的值,以处理潜在的请求高峰,但不要大到所需的内存超过物理内存的大小。
工作者MPM:这个多处理模块(MPM)使网络服务器能够支持混合多线程和多进程。因为线程是用来处理请求的,所以可以处理大量的请求,系统资源的开销比基于进程的MPM要少。但是,它也使用多进程,每个进程有多个线程,以获得基于进程的MPM的稳定性。
每个进程可以拥有的线程数量是固定的。服务器将根据负载增加或减少进程的数量。单独的控制流程(父流程)负责建立子流程。每个子进程可以设置与ThreadsPerChild一样多的服务线程和一个监视线程,监视线程监视访问请求并将其传递给服务线程进行处理和响应。
无论是Worker模式还是Prefork模式,Apache总是试图保留一些空闲或空空闲的子进程(空空闲的服务线程池)来满足即将到来的请求。通过这种方式,客户端在获得服务之前不需要等待子流程生成。
事件MPM:上述两种稳定的MPM方法在非常繁忙的服务器应用程序下有一些缺点。虽然HTTP的Keepalive方法可以减少TCP连接的数量和网络负载,但是Keepalive需要与服务进程或线程绑定,这就导致了繁忙的服务器会消耗所有线程。事件MPM是解决这一问题的新模型,它将服务过程与连接分离开来。当服务器有很快的处理速度和很高的点击率时,可用线程的数量是关键的资源约束。这时,事件MPM法是最有效的。作为工作人员MPM工作的繁忙服务器可以承受每秒数万次的访问(例如,在大型新闻服务网站的高峰期),而事件MPM可以用于处理更高的负载。值得注意的是,事件MPM不能在安全的HTTP(HTTPS)访问下工作。
对于事件模式,apache给出以下警告:
这个MPM是实验性的,所以它可能会也可能不会像预期的那样工作。
这个MPM目前处于实验状态,它可能不会像预期的那样工作。
如何配置三种MPM
Pref是UNIX平台上默认的MPM,其预派生的子进程模式也是apache1.3中采用的模式。Prefork本身不使用线程,2.0版本使用它来保持与1.3版本的兼容性;另一方面,perfork使用单独的子进程来处理不同的请求,并且这些进程相互独立,这使得它成为最稳定的MPM之一。
如何查看目前安装的Apache的三个MPM?
[root@localhost apache]# httpd -l
Compiled in modules:
core.c prefork.c
http_core.c
mod_so.c
如果你看到perfork.c,这意味着它目前处于perforkMPM模式。Worker.c表示为workerMPM模式。
那么如何设置阿帕奇的MPM呢?
当您需要apache配置安装时,您需要指定模式:
[root@localhost httpd-2.4.1]# ./configure --prefix=/usr/local/apache2worker --enable-so --with-mpm=worker [root@localhost httpd-2.4.1]# make
[root@localhost httpd-2.4.1]# make install
指定-with-MPM=NAME选项以指定MPM,NAME是您要使用的MPM的名称。如果未指定模式,则默认为预加工MPM。
那么如何将其配置为事件MPM?
和我上面的方法一样,我只需要在安装过程中添加以下参数:-enable-non-portable-atoms=yes。
请注意,旧的CPU可能不支持事件MPM。
三个MPM参数的分析
无论你安装的是apache的哪个MPM
打开.../Apache/conf/extra/httpd-MPM.conf文件,并找到以下配置:
#perforkMPM
<IfModule mpm_prefork_module>StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxRequestWorkers 250
MaxConnectionsPerChild 0</IfModule>
#StartServers:服务器进程启动的数量。
#MinSpareServers:服务器进程的最小数量,保存以备后用。
#MaxSpareServers:服务器进程的最大数量,保存起来供以后使用。
#MaxRequestWorkers:允许启动的最大服务器进程数。
#MaxConnectionsPerChild:具有最大连接数的服务器进程服务。
Prefork控制流程最初建立“StartServers”子流程后,为了满足MinSpareServers设置的需求,创建一个流程,等待一秒,继续创建两个,再等待一秒,继续创建四个...因此,以指数方式增加已创建进程的数量,最多每秒32个进程,直到达到MinSpareServers设置的值。这种模式消除了在请求到达时生成新进程的需要,从而减少了系统开销并提高了性能。MaxSpareServers设置空空闲进程的最大数量。如果空空闲进程的数量大于这个值,Apache会自动杀死一些冗余的进程。不要把这个值设置的太高,但是如果它小于MinSpareServers,Apache会自动调整为MinSpareServers+1。如果站点负载很重,请考虑同时增加MinSpareServers和MaxSpareServers。
MaxRequestsPerChild设置每个子进程可以处理的请求数。每个子进程将在处理完“MaxRequestsPerChild”请求后自行销毁。0表示无限,即子进程永远不会被销毁。虽然默认设置0可以使每个子进程处理更多的请求,但是如果将其设置为非零值,则有两个重要的好处:
1.它可以防止意外的内存泄漏。2.当服务器负载下降时,子进程的数量会自动减少。
因此,该值可以根据服务器的负载进行调整。
MaxRequestWorkers指令集还限制了服务请求的数量。任何连接尝试通常会在MaxRequestWorkerslimit处排队,最多有几个ListenBacklog指令。
apache2.3.13之前的MaxRequestWorkers版本称为MaxClients。
(MaxClients是这些指令中最重要的,它设置了Apache可以同时处理的请求,是对Apache性能影响最大的参数。它的默认值150远远不够。如果请求总数达到了这个值(可以通过ps-ef|grephttp|wc-l来确认),下面的请求将会排队,直到一个处理的请求完成。这是系统资源剩余多,HTTP访问慢的主要原因。虽然理论上该值越大,可以处理的请求越多,但是Apache的默认限制不能大于256。)
#工人MPM
<IfModule mpm_worker_module>StartServers 3
MinSpareThreads 75
MaxSpareThreads 250
ThreadsPerChild 25
MaxRequestWorkers 400
MaxConnectionsPerChild 0</IfModule>
#StartServers:服务器进程启动的初始数量。
#MinSpareThreads:工作线程的最小数量,保存以备后用。
#MaxSpareThreads:工作线程的最大数量,保存以备后用。
#ThreadsPerChild:每个服务器进程中有固定数量的工作线程。
#MaxRequestWorkers:工作线程的最大数量
#MaxConnectionsPerChild:具有最大连接数的服务器进程服务。
Worker由主控制进程生成为“StartServers”子进程,每个子进程包含固定数量的ThreadsPerChild线程,每个线程独立处理请求。同样,为了在请求到达时不生成线程,MinSpareThreads和MaxSpareThreads设置了空空闲线程的最小和最大数量;
MaxRequestWorkers设置同时连接的客户端的最大总数。如果现有子进程中的线程总数不能满足负载,控制进程将产生新的子进程。
MinSpareThreads和MaxSpareThreads的最大默认值分别为75和250。这两个参数对Apache的性能影响不大,可以根据实际情况进行调整。
ThreadsPerChild是MPM工人中与绩效关系最密切的指令。ThreadsPerChild的最大默认值是64,如果负载重的话是不够的。此时,要显式使用ThreadLimit指令,其最大默认值为20000。
在工作模式下可以同时处理的请求总数由子进程总数乘以ThreadsPerChild值确定,该值应大于或等于MaxRequestWorkers。如果负载很重,并且现有子流程的数量无法满足,则控制流程将产生新的子流程。默认的最大子进程数是16,当它增加时,需要显式声明ServerLimit(最大值是20000)。注意,如果显式声明ServerLimit,其值乘以ThreadsPerChild必须大于或等于MaxRequestWorkers,MaxRequestWorkers必须是ThreadsPerChild的整数倍,否则Apache会自动调整到相应的值。
#MPM事件[/S2/]
<IfModule mpm_event_module>StartServers 3
MinSpareThreads 75
MaxSpareThreads 250
ThreadsPerChild 25
MaxRequestWorkers 400
MaxConnectionsPerChild 0</IfModule>
#StartServers:服务器进程启动的初始数量。
#MinSpareThreads:工作线程的最小数量,保存以备后用。
#MaxSpareThreads:工作线程的最大数量,保存以备后用。
#ThreadsPerChild:每个服务器进程中有固定数量的工作线程。
#MaxRequestWorkers:工作线程的最大数量
#MaxConnectionsPerChild:具有最大连接数的服务器进程服务。
评论列表(0条)