<?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>Fwolf's Blog &#187; httpd - Fwolf's Blog</title>
	<atom:link href="http://www.fwolf.com/blog/post/tag/httpd/feed" rel="self" type="application/rss+xml" />
	<link>http://www.fwolf.com/blog</link>
	<description>随心·随意·随缘·努力～</description>
	<lastBuildDate>Wed, 07 Jul 2010 07:07:52 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>[MediaTemple]虚拟主机内存优化的一点心得</title>
		<link>http://www.fwolf.com/blog/post/383</link>
		<comments>http://www.fwolf.com/blog/post/383#comments</comments>
		<pubDate>Mon, 18 Feb 2008 17:41:13 +0000</pubDate>
		<dc:creator>Fwolf</dc:creator>
				<category><![CDATA[Hosted]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[ddos]]></category>
		<category><![CDATA[httpd]]></category>
		<category><![CDATA[MediaTemple]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[named]]></category>
		<category><![CDATA[optimize]]></category>
		<category><![CDATA[ram]]></category>

		<guid isPermaLink="false">http://www.fwolf.com/blog/post/383</guid>
		<description><![CDATA[今天下午好像有人对服务器ddos，或者大量灌spam（我不敢说每个人都安装了anti spam插件，即使安装了，“应对”spammer也要消耗服务器资源），http服务器耗尽服务器资源后挂掉，一会儿被watchdog重启，过不了多一会儿再次挂掉。。。以前也尝试过优化apache，不过今天似乎终于摸到了一点儿窍门。 我们合租的MediaTemple服务器cpu负载不高，内存相对紧张： top - 23:39:45 up 16 days, 7:24, 2 users, load average: 0.58, 0.50, 0.47 Tasks: 46 total, 1 running, 45 sleeping, 0 stopped, 0 zombie Cpu(s): 9.9% us, 2.5% sy, 0.0% ni, 87.6% id, 0.0% wa, 0.0% hi, 0.0% si Mem: 689496k total, 550892k used, 138604k free, 0k buffers 所以优化主要针对如何节约内存。主机内存实际是256M，可能是多核的缘故，总显示接近700M内存，不过对应的各个进程占用的内存也相应增加了。MediaTemple的KB中有一篇(dv) HOWTO: Performance [...]]]></description>
			<content:encoded><![CDATA[<p>今天下午好像有人对服务器ddos，或者大量灌spam（我不敢说每个人都安装了anti spam插件，即使安装了，“应对”spammer也要消耗服务器资源），http服务器耗尽服务器资源后挂掉，一会儿被watchdog重启，过不了多一会儿再次挂掉。。。以前也尝试过优化apache，不过今天似乎终于摸到了一点儿窍门。</p>

<p>我们合租的MediaTemple服务器cpu负载不高，内存相对紧张：</p>

<pre><code>top - 23:39:45 up 16 days,  7:24,  2 users,  load average: 0.58, 0.50, 0.47
Tasks:  46 total,   1 running,  45 sleeping,   0 stopped,   0 zombie
Cpu(s):  9.9% us,  2.5% sy,  0.0% ni, 87.6% id,  0.0% wa,  0.0% hi,  0.0% si
Mem:    689496k total,   550892k used,   138604k free,        0k buffers
</code></pre>

<p>所以优化主要针对如何节约内存。主机内存实际是256M，可能是多核的缘故，总显示接近700M内存，不过对应的各个进程占用的内存也相应增加了。MediaTemple的KB中有一篇<a href="http://kb.mediatemple.net/article.php?id=771">(dv) HOWTO: Performance tuning (Optimization)</a>，先按照这个来优化一下，主要分为三个部分。</p>

<h4>优化Apache(httpd)</h4>

<p>缩短超时时限：</p>

<pre><code>#Timeout 120
Timeout 30
</code></pre>

<p>调整prefork参数，我调整的结果是：</p>

<pre><code>&lt;IfModule prefork.c&gt;
#1/1/3
StartServers       1
MinSpareServers    1
MaxSpareServers    3
# 50 ?
ServerLimit       20
MaxClients        20
MaxRequestsPerChild  2000
&lt;/IfModule&gt;
</code></pre>

<p>StartServers是开始的httpd进程数，Min和Max SpareServers是最少和最多空闲进程数，ServerLimit和MaxClients是总进程数限制，这两个参数一般来说是相同的，httpd所消耗的总内存数就和这个相关（实际进程数还会多两个，应该是负责管理子进程的“父进程”），内存不够可以把这两个数值进一步缩小，但这也同时对应着httpd同时处理的并发数。MaxRequestsPerChild是每个进程在处理多少个任务后自杀，根据需要和相关设置还会再启动新的子进程，这种机制有利于释放一些内存碎片。</p>

<p>MaxClients不够会在log产生错误信息，可以用下面的命令查询：</p>

<pre><code>grep -i maxclient /var/log/httpd/error_log
</code></pre>

<p>可以根据情况再调整MaxClients的值，但如果内存就是短缺，又能有什么办法呢？</p>

<h4>优化Mysql</h4>

<p>设置缓存，在my.cnf的<code>[mysqld]</code>段中增加：</p>

<pre><code># Cache
query-cache-type = 1
query-cache-size = 16M
</code></pre>

<p>虽然会多占用一些内存，但能加快处理的速度，尽快把等待队列“消化”掉，还是有利于加速的。在mysql中可以查询cache使用情况：</p>

<pre><code>mysql&gt; show status like 'Qcache%';
+-------------------------+----------+
| Variable_name           | Value    |
+-------------------------+----------+
| Qcache_free_blocks      | 12       |
| Qcache_free_memory      | 13028408 |
| Qcache_hits             | 35117    |
| Qcache_inserts          | 751      |
| Qcache_lowmem_prunes    | 0        |
| Qcache_not_cached       | 56       |
| Qcache_queries_in_cache | 377      |
| Qcache_total_blocks     | 872      |
+-------------------------+----------+
8 rows in set (0.00 sec)
...... some times late ......
mysql&gt; show status like 'Qcache%';
+-------------------------+---------+
| Variable_name           | Value   |
+-------------------------+---------+
| Qcache_free_blocks      | 88      |
| Qcache_free_memory      | 8837920 |
| Qcache_hits             | 164437  |
| Qcache_inserts          | 3572    |
| Qcache_lowmem_prunes    | 0       |
| Qcache_not_cached       | 432     |
| Qcache_queries_in_cache | 1177    |
| Qcache_total_blocks     | 2579    |
+-------------------------+---------+
8 rows in set (0.00 sec)
</code></pre>

<p>调整query-cache-size的值让Qcache_lowmem_prunes保持在0最好，设置太大了也是浪费内存。</p>

<h4>关闭不需要的服务</h4>

<p>比如named，域名解析使用域名注册商提供的就足够了，关闭spamassassin，邮件服务仅限于对外发送邮件，不接收：</p>

<pre><code>chmod 644 /etc/init.d/psa-spamassassin
</code></pre>

<p>watchdog暂时不建议关闭，人不在的时候它会自动重启服务，还是有一点用处的。</p>

<h4>其它优化设置</h4>

<p>从其它地方还看到可以开启KeepAlive：</p>

<pre><code>KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 15
</code></pre>

<p>这样每个连接可以发送100次请求，超时时间为15秒。如果KeepAliveTimeout减少一些，MaxKeepAliveRequests还可以设置得更大一点。</p>

<p>还可以启用apache的压缩输出功能：</p>

<pre><code>&lt;ifmodule mod_deflate.c&gt;
#   DeflateCompressionLevel 2
    AddOutputFilterByType DEFLATE text/html text/plain text/xml application/x-httpd-php application/x-javascript text/css
&lt;/ifmodule&gt;
</code></pre>

<p>简单观察一下，开启deflate之后，服务器cpu idle值大概会减少15~20%，国外主机数据传输本身就慢，希望这些花销值得。</p>

<pre><code>top - 01:39:03 up 16 days,  9:23,  3 users,  load average: 2.16, 2.09, 1.97
Tasks:  48 total,   1 running,  47 sleeping,   0 stopped,   0 zombie
Cpu(s): 24.1% us,  8.4% sy,  0.0% ni, 67.6% id,  0.0% wa,  0.0% hi,  0.0% si
Mem:    689496k total,   431452k used,   258044k free,        0k buffers
Swap:        0k total,        0k used,        0k free,        0k cached
</code></pre>

<h4>结果</h4>

<p>现在看一下结果，<code>ps -U apache u</code>能看到一共有20个apache进程在运行，占用内存总量为：</p>

<pre><code>root@fwolf:~# ps -U apache u|awk '{S+=$6} END {print S}'
385396
</code></pre>

<p>随着服务运行，内存使用量还会增加（所以MaxRequestsPerChild别设太大，定期重启一些进程）。再看看那个疑似对我ddos的家伙：</p>

<pre><code>root@fwolf:~# netstat -nap|grep :80|wc -l
513
root@fwolf:~# netstat -nap|grep TIME_WAIT|wc -l
9
root@fwolf:~# netstat -nap|grep 124.115|wc -l
464
root@fwolf:~# netstat -nap|grep 124.115.0|wc -l
376
root@fwolf:~# netstat -nap|grep 124.115.4|wc -l
93
</code></pre>

<p>此时服务器访问稍慢，有时会超时，但起以前动不动内存不足，httpd挂掉要好一些了。查了一下，这个IP地址属于“陕西省西安市 电信”，地址总换，但基本都在上面两个网段之内。</p>

<p>再后来，访问量降下来之后，系统就恢复正常了，优化应该还是对服务器速度有一些作用的。</p>

<pre><code>root@fwolf:~# netstat -nap|grep :80|wc -l; netstat -nap|grep TIME_WAIT|wc -l
69
47
</code></pre>

<p>最后贴两张后台流量图表，异常大概开始于18号下午16点，导致18号流量剧增。服务器时间是西8区，所以小时图表中的0点就是16点。按天的那个图表不知为什么出不来，不过注意18号的流量只是前9个小时的就是了。</p>

<p><a href="http://img181.imageshack.us/my.php?image=plesk8211203355872619sr4.png" target="_blank"><img src="http://img181.imageshack.us/img181/8158/plesk8211203355872619sr4.th.png" border="0" alt="Free Image Hosting at www.ImageShack.us" /></a></p>

<p><a href="http://img232.imageshack.us/my.php?image=plesk8211203355495991zh3.png" target="_blank"><img src="http://img232.imageshack.us/img232/8916/plesk8211203355495991zh3.th.png" border="0" alt="Free Image Hosting at www.ImageShack.us" /></a></p>

<p>另外，合租的兄弟们，<a href="http://www.mediatemple.net/webhosting/dv/details.htm#php5">现在新的dv主机默认是PHP 5.2了</a>，咱们啥时候升级呢？</p>

<h4>参考</h4>

<ul>
<li><a href="http://jed.dzhope.com/read.php/272.htm">再议apache优化</a></li>
<li><a href="http://hi.baidu.com/swgweb/blog/item/dba900e94cbe9b3cb90e2d18.html">APACHE优化之apache的内存使用</a></li>
<li><a href="http://tech.idv2.com/2007/08/09/about-apache-perf-tuning/">谈谈Apache的优化</a></li>
</ul>

<h4>Update @ 2008-01-19</h4>

<p>看来我的担心是多余的，mod_deflate启用之后并没有耗费太多系统资源，访问量恢复正常之后，cpu load也恢复了正常：</p>

<pre><code>top - 16:15:45 up 17 days, 0 min,  1 user,  load average: 0.04, 0.05, 0.07
Tasks:  51 total,   1 running,  50 sleeping,   0 stopped,   0 zombie
Cpu(s):  1.8% us,  0.7% sy,  0.0% ni, 95.9% id,  1.7% wa,  0.0% hi,  0.0% si
Mem:    689496k total,   510200k used,   179296k free,        0k buffers
Swap:        0k total,        0k used,        0k free,        0k cached
</code></pre>

<p>好像启用了KeepAlive后httpd进程轮换得特别快，不像以前半天不重生一个。现在可以清楚的看到18号全天的流量图标了，再补两张图：</p>

<p><a href="http://img341.imageshack.us/my.php?image=plesk8211203409271331vr2.png" target="_blank"><img src="http://img341.imageshack.us/img341/3262/plesk8211203409271331vr2.th.png" border="0" alt="Free Image Hosting at www.ImageShack.us" /></a></p>

<p><a href="http://img401.imageshack.us/my.php?image=plesk8211203409395882kx1.png" target="_blank"><img src="http://img401.imageshack.us/img401/2183/plesk8211203409395882kx1.th.png" border="0" alt="Free Image Hosting at www.ImageShack.us" /></a></p>

<p>按每小时400M流量计算，每秒流量为110K，不知道算是个什么样的水平。</p>

<h4>Update @ 2008-01-19</h4>

<p>关闭named服务后，jail环境的ssh用户使用wget下载文件会遇到<code>Name or service not known</code>错误，把<code>/etc/resolv.conf</code>也配置到chroot中就可以了。有趣的是，如果named服务启动着就不存在这个问题。</p>

<p>顺便还把denyhosts装上了，daemon模式运行，占内存不多，攻击者还不少呢，值得。参考：<a href="http://www.sofee.cn/blog/2006/10/22/51/">使用DenyHosts阻止SSH暴力破解</a></p>

	Tags: <a href="http://www.fwolf.com/blog/post/tag/apache" title="Apache" rel="tag">Apache</a>, <a href="http://www.fwolf.com/blog/post/tag/ddos" title="ddos" rel="tag">ddos</a>, <a href="http://www.fwolf.com/blog/post/tag/hosted" title="Hosted" rel="tag">Hosted</a>, <a href="http://www.fwolf.com/blog/post/tag/httpd" title="httpd" rel="tag">httpd</a>, <a href="http://www.fwolf.com/blog/post/tag/mediatemple" title="MediaTemple" rel="tag">MediaTemple</a>, <a href="http://www.fwolf.com/blog/post/tag/mysql" title="mysql" rel="tag">mysql</a>, <a href="http://www.fwolf.com/blog/post/tag/named" title="named" rel="tag">named</a>, <a href="http://www.fwolf.com/blog/post/tag/optimize" title="optimize" rel="tag">optimize</a>, <a href="http://www.fwolf.com/blog/post/tag/ram" title="ram" rel="tag">ram</a><br />

	<h4>Related posts</h4>
	<ul class="st-related-posts">
	<li><a href="http://www.fwolf.com/blog/post/411" title="由一个错误学到的一些php安全配置问题 (2008-07-13)">由一个错误学到的一些php安全配置问题</a> (4)</li>
	<li><a href="http://www.fwolf.com/blog/post/407" title="生成用于web服务器的openssl证书 (2008-06-25)">生成用于web服务器的openssl证书</a> (1)</li>
	<li><a href="http://www.fwolf.com/blog/post/347" title="升级MT dv 3.0主机到php5 (2007-08-09)">升级MT dv 3.0主机到php5</a> (9)</li>
	<li><a href="http://www.fwolf.com/blog/post/343" title="MT主机控制面板Plesk合租用户使用指南 (2007-07-27)">MT主机控制面板Plesk合租用户使用指南</a> (12)</li>
	<li><a href="http://www.fwolf.com/blog/post/406" title="麻烦一连串儿 (2008-06-23)">麻烦一连串儿</a> (8)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://www.fwolf.com/blog/post/383/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
