<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>GzV8.com &#187; mpm</title>
	<atom:link href="http://www.gzv8.com/archives/tag/mpm/feed" rel="self" type="application/rss+xml" />
	<link>http://www.gzv8.com</link>
	<description>互联网引擎</description>
	<lastBuildDate>Thu, 06 Jan 2011 04:08:28 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>合理设置apache httpd的最大连接数</title>
		<link>http://www.gzv8.com/archives/218</link>
		<comments>http://www.gzv8.com/archives/218#comments</comments>
		<pubDate>Thu, 11 Mar 2010 07:29:26 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[MaxClients]]></category>
		<category><![CDATA[MaxRequestsPerChild]]></category>
		<category><![CDATA[MinSpareServers]]></category>
		<category><![CDATA[mpm]]></category>
		<category><![CDATA[ServerLimit]]></category>
		<category><![CDATA[StartServers]]></category>
		<category><![CDATA[最大]]></category>
		<category><![CDATA[连接数]]></category>

		<guid isPermaLink="false">http://www.gzv8.com/?p=218</guid>
		<description><![CDATA[合理设置apache httpd的最大连接数
转载自：http://hi.baidu.com/rainchen/blog/item/095f0a551fa802c5b645ae46.html





手头有一个网站在线人数增多，访问时很慢。初步认为是服务器资源不足了，但经反复测试，一旦连接上，不断点击同一个页面上不同的链接，都能迅速打开，这种现象就是说明apache最大连接数已经满了，新的访客只能排队等待有空闲的链接，而如果一旦连接上，在keeyalive 的存活时间内（KeepAliveTimeout，默认5秒）都不用重新打开连接，因此解决的方法就是加大apache的最大连接数。
1.在哪里设置？
服务器的为FreeBSD 6.2 ，apache 2.24，使用默认配置（FreeBSD 默认不加载自定义MPM配置），默认最大连接数是250
在/usr/local/etc/apache22/httpd.conf中加载MPM配置（去掉前面的注释）：
# Server-pool management (MPM specific)
Include etc/apache22/extra/httpd-mpm.conf
可见的MPM配置在/usr/local/etc/apache22/extra/httpd-mpm.conf，但里面根据httpd的工作模式分了很多块，哪一部才是当前httpd的工作模式呢？可通过执行 apachectl -l 来查看：
Compiled in modules:
              core.c
              prefork.c
              http_core.c
              mod_so.c
看到prefork 字眼，因此可见当前httpd应该是工作在prefork模式，prefork模式的默认配置是：
&#60;IfModule mpm_prefork_module&#62;
                StartServers                      5
                MinSpareServers                   5
                MaxSpareServers                  10
                MaxClients                      150
                MaxRequestsPerChild               0
&#60;/IfModule&#62;
2.要加到多少？
连接数理论上当然是支持越大越好，但要在服务器的能力范围内，这跟服务器的CPU、内存、带宽等都有关系。
查看当前的连接数可以用：
ps aux &#124; grep httpd &#124; wc -l
或：
pgrep httpd&#124;wc -l
计算httpd占用内存的平均数:
ps aux&#124;grep -v grep&#124;awk &#8216;/httpd/{sum+=$6;n++};END{print sum/n}&#8217;
由于基本都是静态页面，CPU消耗很低，每进程占用内存也不算多，大约200K。
服务器内存有2G，除去常规启动的服务大约需要500M（保守估计），还剩1.5G可用，那么理论上可以支持1.5*1024*1024*1024/200000 = 8053.06368
约8K个进程，支持2W人同时访问应该是没有问题的（能保证其中8K的人访问很快，其他的可能需要等待1、2秒才能连上，而一旦连上就会很流畅）
控制最大连接数的MaxClients ，因此可以尝试配置为：
&#60;IfModule mpm_prefork_module&#62;
                StartServers                      5
                MinSpareServers                   5
                [...]]]></description>
			<content:encoded><![CDATA[<div>合理设置<a onclick="tagshow(event, 'apache');" href="javascript:;" target="_self"><strong>apache</strong></a> httpd的最大连接数</div>
<div><a onclick="tagshow(event, '%D7%AA%D4%D8');" href="javascript:;" target="_self"><strong>转载</strong></a>自：<a href="http://hi.baidu.com/rainchen/blog/item/095f0a551fa802c5b645ae46.html">http://hi.baidu.com/rainchen/blog/item/095f0a551fa802c5b645ae46.html</a></div>
<table border="0">
<tbody>
<tr>
<td>
<div id="blog_text">
<p>手头有一个网站在线人数增多，访问时很慢。初步认为是服务器资源不足了，但经反复<a onclick="tagshow(event, '%B2%E2%CA%D4');" href="javascript:;" target="_self"><strong>测试</strong></a>，一旦连接上，不断点击同一个页面上不同的链接，都能迅速打开，这种现象就是说明apache最大连接数已经满了，新的访客只能排队等待有空闲的链接，而如果一旦连接上，在keeyalive 的存活时间内（KeepAliveTimeout，默认5秒）都不用重新打开连接，因此解决的方法就是加大apache的最大连接数。</p>
<p>1.在哪里设置？</p>
<p>服务器的为FreeBSD 6.2 ，apache 2.24，使用默认配置（FreeBSD 默认不加载<a href="http://httpd.apache.org/docs/2.2/mod/mpm_common.html" target="_blank">自定义MPM配置</a>），默认最大连接数是250</p>
<p>在/usr/local/etc/apache22/httpd.conf中加载MPM配置（去掉前面的注释）：<br />
# Server-pool management (MPM specific)<br />
Include etc/apache22/extra/httpd-mpm.conf</p>
<p>可见的MPM配置在/usr/local/etc/apache22/extra/httpd-mpm.conf，但里面根据httpd的<a onclick="tagshow(event, '%B9%A4%D7%F7');" href="javascript:;" target="_self"><strong>工作</strong></a>模式分了很多块，哪一部才是当前httpd的工作模式呢？可通过执行 apachectl -l 来查看：<br />
Compiled in modules:<br />
              core.c<br />
              prefork.c<br />
              http_core.c<br />
              mod_so.c</p>
<p>看到prefork 字眼，因此可见当前httpd应该是工作在prefork模式，prefork模式的默认配置是：<br />
&lt;IfModule mpm_prefork_module&gt;<br />
                StartServers                      5<br />
                MinSpareServers                   5<br />
                MaxSpareServers                  10<br />
                MaxClients                      150<br />
                MaxRequestsPerChild               0<br />
&lt;/IfModule&gt;</p>
<p>2.要加到多少？</p>
<p>连接数理论上当然是支持越大越好，但要在服务器的能力范围内，这跟服务器的CPU、内存、带宽等都有关系。</p>
<p>查看当前的连接数可以用：<br />
ps aux | grep httpd | wc -l</p>
<p>或：<br />
pgrep httpd|wc -l</p>
<p>计算httpd占用内存的平均数:<br />
ps aux|grep -v grep|awk &#8216;/httpd/{sum+=$6;n++};END{print sum/n}&#8217;</p>
<p>由于基本都是静态页面，CPU消耗很低，每进程占用内存也不算多，大约200K。</p>
<p>服务器内存有2G，除去常规启动的服务大约需要500M（保守估计），还剩1.5G可用，那么理论上可以支持1.5*1024*1024*1024/200000 = 8053.06368</p>
<p>约8K个进程，支持2W人同时访问应该是没有问题的（能保证其中8K的人访问很快，<a onclick="tagshow(event, '%C6%E4%CB%FB');" href="javascript:;" target="_self"><strong>其他</strong></a>的可能需要等待1、2秒才能连上，而一旦连上就会很流畅）</p>
<p>控制最大连接数的MaxClients ，因此可以尝试配置为：<br />
&lt;IfModule mpm_prefork_module&gt;<br />
                StartServers                      5<br />
                MinSpareServers                   5<br />
                MaxSpareServers                  10<br />
                ServerLimit                    5500<br />
                MaxClients                     5000<br />
                MaxRequestsPerChild               100<br />
&lt;/IfModule&gt;</p>
<p>注意，MaxClients默认最大为250，若要超过这个值就要显式设置ServerLimit，且ServerLimit要放在MaxClients之前，值要不小于MaxClients，不然重启httpd时会有提示。</p>
<p>重启httpd后，通过反复执行pgrep httpd|wc -l 来观察连接数，可以看到连接数在达到MaxClients的设值后不再增加，但此时访问网站也很流畅，那就不用贪心再设置更高的值了，不然以后如果网站访问突增不小心就会耗光服务器内存，可根据以后访问压力趋势及内存的占用变化再逐渐调整，直到找到一个最优的设置值。</p>
<p>(MaxRequestsPerChild不能设置为0，可能会因内存泄露导致服务器崩溃）</p>
<p><a href="http://www.chedong.com/tech/apache_install.html#scale" target="_blank">更佳最大值计算的公式</a>：</p>
<p>apache_max_process_with_good_perfermance &lt; (total_hardware_memory / apache_memory_per_process ) * 2<br />
apache_max_process = apache_max_process_with_good_perfermance * 1.5</p>
</div>
</td>
</tr>
</tbody>
</table>
]]></content:encoded>
			<wfw:commentRss>http://www.gzv8.com/archives/218/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>什么是MPM？</title>
		<link>http://www.gzv8.com/archives/91</link>
		<comments>http://www.gzv8.com/archives/91#comments</comments>
		<pubDate>Thu, 11 Mar 2010 04:25:51 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[mpm]]></category>

		<guid isPermaLink="false">http://www.gzv8.com/?p=91</guid>
		<description><![CDATA[MPM（Multi -Processing Modules，多路处理模块）是Apache2.0中影响性能的最核心特性。是Apache 2.x才支持的一个可插入的并发模型，在编译的时候，我们只可以选择一个并发模型
格式
–with-mpm=MPM Choose the process model for Apache to use.
MPM={beos&#124;worker&#124;prefork&#124;mpmt_os2&#124; perchild&#124;leader&#124;threadpool}
1、Beos、mpmt_os2分别是BeOS和OS/2上缺省的MPM
2、perchild主要设计目的是以不同的用户和组的身份来运行不同的子进程.这在运行多个需要CGI的虚拟主机时特别有用,会比1.3版中的SuExec 机制做得更好.
3、leader和threadpool都是基于worker的变体,还处于实验性阶段,某些情况下并不会按照预期设想的那样工作,所以 Apache官方也并不推荐使用.
4、prefork如果不用“–with-mpm”显式指定某种MPM,prefork就是LInux/Unix平台上缺省的MPM.它所采用的预派生子 进程方式也是 Apache 1.3中采用的模式.prefork本身并没有使用到线程,2.0版使用它是为了与1.3版保持兼容性;另一方面,prefork用单独的子进程来处理不 同的请求,进程之间是彼此独立的,这也使其成为最稳定的MPM之一.
prefork的工作原理是,控制进程在最初建立“StartServers”个子进程后,为了满足MinSpareServers设置的需要创建一个进 程,等待一秒钟,继续创建两个,再等待一秒钟,继续创建四个……如此按指数级增加创建的进程数,最多达到每秒32个,直到满足 MinSpareServers设置的值为止.这就是预派生（prefork）的由来.这种模式可以不必在请求到来时再产生新的进程,从而减小了系统开销 以增加性能.
5、worker相对于prefork,worker是2.0 版中全新的支持多线程和多进程混合模型的MPM.由于使用线程来处理,所以可以处理相对海量的请求,而系统资源的开销要小于基于进程的服务器.但是, worker也使用了多进程,每个进程又生成多个线程,以获得基于进程服务器的稳定性.这种MPM的工作方式将是Apache 2.0的发展趋势.
worker的工作原理是,由主控制进程生成“StartServers”个子进程,每个子进程中包含固定的ThreadsPerChild 线程数,各个线程独立地处理请求.同样,为了不在请求到来时再生成线程,MinSpareThreads和MaxSpareThreads设置了最少和最 多的空闲线程数;而MaxClients设置了所有子进程中的线程总数.如果现有子进程中的线程总数不能满足负载,控制进程将派生新的子进程.
]]></description>
			<content:encoded><![CDATA[<p>MPM（Multi -Processing Modules，多路处理模块）是Apache2.0中影响性能的最核心特性。是Apache 2.x才支持的一个可插入的并发模型，在编译的时候，我们只可以选择一个并发模型</p>
<p>格式<br />
–with-mpm=MPM Choose the process model for Apache to use.<br />
MPM={beos|worker|prefork|mpmt_os2| perchild|leader|threadpool}</p>
<p>1、Beos、mpmt_os2分别是BeOS和OS/2上缺省的MPM</p>
<p>2、perchild主要设计目的是以不同的用户和组的身份来运行不同的子进程.这在运行多个需要CGI的虚拟主机时特别有用,会比1.3版中的SuExec 机制做得更好.</p>
<p>3、leader和threadpool都是基于worker的变体,还处于实验性阶段,某些情况下并不会按照预期设想的那样工作,所以 Apache官方也并不推荐使用.</p>
<p>4、prefork如果不用“–with-mpm”显式指定某种MPM,prefork就是LInux/Unix平台上缺省的MPM.它所采用的预派生子 进程方式也是 Apache 1.3中采用的模式.prefork本身并没有使用到线程,2.0版使用它是为了与1.3版保持兼容性;另一方面,prefork用单独的子进程来处理不 同的请求,进程之间是彼此独立的,这也使其成为最稳定的MPM之一.<br />
prefork的工作原理是,控制进程在最初建立“StartServers”个子进程后,为了满足MinSpareServers设置的需要创建一个进 程,等待一秒钟,继续创建两个,再等待一秒钟,继续创建四个……如此按指数级增加创建的进程数,最多达到每秒32个,直到满足 MinSpareServers设置的值为止.这就是预派生（prefork）的由来.这种模式可以不必在请求到来时再产生新的进程,从而减小了系统开销 以增加性能.</p>
<p>5、worker相对于prefork,worker是2.0 版中全新的支持多线程和多进程混合模型的MPM.由于使用线程来处理,所以可以处理相对海量的请求,而系统资源的开销要小于基于进程的服务器.但是, worker也使用了多进程,每个进程又生成多个线程,以获得基于进程服务器的稳定性.这种MPM的工作方式将是Apache 2.0的发展趋势.<br />
worker的工作原理是,由主控制进程生成“StartServers”个子进程,每个子进程中包含固定的ThreadsPerChild 线程数,各个线程独立地处理请求.同样,为了不在请求到来时再生成线程,MinSpareThreads和MaxSpareThreads设置了最少和最 多的空闲线程数;而MaxClients设置了所有子进程中的线程总数.如果现有子进程中的线程总数不能满足负载,控制进程将派生新的子进程.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gzv8.com/archives/91/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

