Apache Prefork、Worker和Event三种MPM分析

Apache Prefork、Worker和Event三种MPM分析,第1张

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:具有最大连接数的服务器进程服务。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/778497.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-03
下一篇 2022-05-03

发表评论

登录后才能评论

评论列表(0条)

保存