dannyzhang 发表于 2011-12-21 08:44

Apache MPM worker中的几个参数

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 最近发现自己是个干杂活儿的人,因此把本博的名字都改成了“不求甚解”,纯粹都为了解决眼前的问题,这样的工作方式已经完完全全背离了自己的习惯。废话少说,切入正题,最近对Apache中的一些参数做了些了解,下面就记录一下我的理解。<br><br><div id="codeText" class="codeText"><ol style="margin:0 1px 0 0;padding:5px 0;" start="1" class="dp-css"><li><span style="color:#000000;"># worker MPM<br></span></li><li>
# <span style="color:#0000FF;">ThreadLimit</span><span style="color:#0000CC;">:</span> maximum setting of <span style="color:#0000FF;">ThreadsPerChild</span><br></li><li>
# <span style="color:#0000FF;">ServerLimit</span><span style="color:#0000CC;">:</span> maximum setting of <span style="color:#0000FF;">StartServers</span><br></li><li>
# <span style="color:#0000FF;">StartServers</span><span style="color:#0000CC;">:</span> initial number of server processes to start<br></li><li>
# <span style="color:#0000FF;">MaxClients</span><span style="color:#0000CC;">:</span> maximum number of simultaneous client connections<br></li><li>
# <span style="color:#0000FF;">MinSpareThreads</span><span style="color:#0000CC;">:</span> minimum number of worker threads which are kept spare<br></li><li>
# <span style="color:#0000FF;">MaxSpareThreads</span><span style="color:#0000CC;">:</span> maximum number of worker threads which are kept spare<br></li><li>
# <span style="color:#0000FF;">ThreadsPerChild</span><span style="color:#0000CC;">:</span> constant number of worker threads in each server process<br></li><li>
# <span style="color:#0000FF;">MaxRequestsPerChild</span><span style="color:#0000CC;">:</span> maximum number of requests a server process serves<br></li><li>
<span style="color:#0000CC;">&lt;</span><span style="color:#0000FF;">IfModule</span> worker.c<span style="color:#0000CC;">&gt;</span><br></li><li>
<span style="color:#0000FF;">ThreadLimit</span>      125<br></li><li>
<span style="color:#0000FF;">ServerLimit</span>      320<br></li><li>
<span style="color:#0000FF;">StartServers</span>         5<br></li><li>
<span style="color:#0000FF;">MaxClients</span>      8000<br></li><li>
<span style="color:#0000FF;">MinSpareThreads</span>    125<br></li><li>
<span style="color:#0000FF;">MaxSpareThreads</span>   1250<br></li><li>
<span style="color:#0000FF;">ThreadsPerChild</span>    125<br></li><li>
<span style="color:#0000FF;">MaxRequestsPerChild</span>1000<br></li><li>
<span style="color:#0000CC;">&lt;</span><span style="color:#0000CC;">/</span><span style="color:#0000FF;">IfModule</span><span style="color:#0000CC;">&gt;</span></li></ol></div>其中最重要的参数是
<span style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Tahoma; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; font-size: medium;">ThreadsPerChild和</span>
<span style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Tahoma; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; font-size: medium;">MaxClients:<br></span><div id="codeText" class="codeText"><ol style="margin:0 1px 0 0;padding:5px 0;" start="1" class="dp-css"><li><span style="color:#000000;">##<span style="color:#0000FF;">ThreadsPerChild</span>   每个子进程建立的线程数,子进程在启动时建立这些线程后就不再建立新的线程了</span></li><li>##<span style="color:#0000FF;">MaxClients</span><font color="#000000">允许同时伺服的最大接入请求数量(在worker下就是最大线程数量)</font></li></ol></div><ol style="margin:0 1px 0 0;padding:5px 0;" start="1" class="dp-css"><li><div id="codeText" class="codeText"><ol style="margin:0 1px 0 0;padding:5px 0;" start="1" class="dp-css"><li><span style="color:#000000;">##<font color="#0000F0">ServerLimit</font>:对最大子进程数的上限,该值必须大<font color="#000000">于等于</font><font color="#000000">MaxClients/<span style="color:#0000FF;">ThreadsPerChild</span></font></span>
</li><li>##<font color="#0000F0">ThreadLimit</font><font color="#000000">:对ThreadsPerChild的上限,该值必须大于等于
ThreadsPerChild,如果将ThreadLimit设置成一个高出实际需要很多的ThreadsPerChild值,将会有过多的共享内存被
分配,应当和ThreadsPerChild可能达到的最大值保持一致.</font><br></li><li>
##<font color="#0000F0">StartServers</font><font color="#000000">:服务器启动时的服务进程数目,该值肯定小于等于ServerLimit</font><br></li><li>
##<font color="#0000F0">MinSpareThreads和MaxSpareThreads</font><font color="#000000">:通过新建或结束子进程的方式,将空闲线程的总数维持在这个范围内</font><br></li><li>
##<font color="#0000F0">MaxRequestsPerChild</font><font color="#000000">:用于控制服务器建立新进程和结束旧进程的频
率,其实是一个为了防止内存溢出的参数,每个子进程在其生存期内允许伺服的最大请求数量。到达MaxRequestsPerChild的限制后,子进程将
会结束。对于KeepAlive链接,只有第一个请求会被计数。事实上,它改变了每个子进程限制最大链接数量的行为。</font></li></ol></div><span style="color:#000000;"><font color="#0000F0"><span style="color:#0000FF;"></span></font></span>可以通过检查HTTPServer/logs/error_log日志,判断MaxClients是否需要增加,如果有下面的报错,就说明apache自上次重启至今,曾经发生过达到MaxClients的情况:</li><li><br></li><li><div id="codeText" class="codeText"><ol style="margin:0 1px 0 0;padding:5px 0;" start="1" class="dp-css"><li>Tue Jun 07 16:36:03 2011] server reached MaxClients setting, consider raising the MaxClients setting</li></ol></div></li></ol>需要注意的是,这样的报错并不会出现多次,当第二次达到MaxClients时,error_log不会记录。<br>还有一种可以实时看到连接数的方法,就是打开
<span style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Tahoma; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; font-size: medium;">server-status</span>页面,设置方法如下:<br>1. 去掉以下部分的注释<br><div id="codeText" class="codeText"><ol style="margin:0 1px 0 0;padding:5px 0;" start="1" class="dp-css"><li><span style="color:#000000;"><span style="color:#0000FF;">LoadModule</span> status_module modules/mod_status.so<br></span></li><li>
<span style="color:#0000CC;">&lt;</span><span style="color:#0000FF;">IfModule</span> mod_status.c<span style="color:#0000CC;">&gt;</span><br></li><li>
<span style="color:#0000FF;">ExtendedStatus</span> <span style="color:#FF0000;">On</span><br></li><li>
<span style="color:#0000CC;">&lt;</span><span style="color:#0000CC;">/</span><span style="color:#0000FF;">IfModule</span><span style="color:#0000CC;">&gt;</span></li></ol></div>2.修改以下部分<br><div id="codeText" class="codeText"><ol style="margin:0 1px 0 0;padding:5px 0;" start="1" class="dp-css"><li><span style="color:#000000;"><span style="color:#0000CC;">&lt;</span><span style="color:#0000FF;">Location</span> /server-status<span style="color:#0000CC;">&gt;</span><br></span></li><li>
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000FF;">SetHandler</span> server-status<br></li><li>
&nbsp;&nbsp;#<span style="color:#0000FF;">Order</span> <span style="color:#0000FF;">deny</span><span style="color:#0000CC;">,</span><span style="color:#0000FF;">allow</span><br></li><li>
&nbsp; # <span style="color:#0000FF;">Deny</span> <span style="color:#FF0000;">from</span> <span style="color:#FF0000;">all</span><br></li><li>
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000FF;">Allow</span> <span style="color:#FF0000;">from</span> <span style="color:#FF0000;">all</span><br></li><li>
<span style="color:#0000CC;">&lt;</span><span style="color:#0000CC;">/</span><span style="color:#0000FF;">Location</span><span style="color:#0000CC;">&gt;</span></li></ol></div>重启ihs<br>使用:http://yourhost/server-status 可以进入监控页面<br>如果浏览器支持刷新,可以http://your_host/server-status?refresh=5 以便每 5 秒钟刷新一次<br><br>在打开的监控页面中:"." Open slot with no current process,这里面的单个进程的“.”的数量其实对应与ThreadLimit这个值。<br><div id="codeText" class="codeText"><ol style="margin:0 1px 0 0;padding:5px 0;" start="1" class="dp-css"><li><span style="color:#000000;"><span style="color:#0000CC;">&lt;</span><span style="color:#0000FF;">IfModule</span> worker.c<span style="color:#0000CC;">&gt;</span><br></span></li><li>
<span style="color:#0000FF;">ThreadLimit</span>       10<br></li><li>
<span style="color:#0000FF;">ServerLimit</span>       2<br></li><li>
<span style="color:#0000FF;">StartServers</span>      1<br></li><li>
<span style="color:#0000FF;">MaxClients</span>      2<br></li><li>
<span style="color:#0000FF;">MinSpareThreads</span>1<br></li><li>
<span style="color:#0000FF;">MaxSpareThreads</span>2<br></li><li>
<span style="color:#0000FF;">ThreadsPerChild</span>   1<br></li><li>
<span style="color:#0000FF;">MaxRequestsPerChild</span> 1<br></li><li>
<span style="color:#0000CC;">&lt;</span><span style="color:#0000CC;">/</span><span style="color:#0000FF;">IfModule</span><span style="color:#0000CC;">&gt;</span></li></ol></div>httpd.conf的MPM配置如上例,在监控页面中的输出如下,其中有2个进程,各10个ThreadLimit,但由于ThreadsPerChild的限制,其实很多.是没有用的。<br><div id="codeText" class="codeText"><ol style="margin:0 1px 0 0;padding:5px 0;" start="1" class="dp-css"><li>W........._.........</li></ol></div>
页: [1]
查看完整版本: Apache MPM worker中的几个参数