PHP + Apache很长的等待时间

我遇到了一个砖墙故障排除我的专用websever。 最近,我的网站飙升的请求数量/每秒,它坠毁。

盒子原有8GB内存,8核心Xeon E3-1230,1TB 7,200 RPM磁盘(无RAID),100M专用networking。

在秒杀之后,我增加了RAM到24GB以支持更多的并发用户。

Apache似乎处理得很好,即使有3000个并发用户,它也会很快(非caching)返回HTML和静态内容。

为了进一步testingApache / HTML和Apache / PHP之间的差异,我运行了ab

test.htmltest.php都具有完全相同的静态内容,PHP不会调用任何include ,也不会与MySQL连接。

HTMLtesting

ab -n 500 -c 50 http://www.~~.com/test.html

 Connection Times (ms) min mean[+/-sd] median max Connect: 252 375 190.3 276 1399 Processing: 254 354 121.5 282 657 Waiting: 253 353 121.4 280 653 Total: 510 730 231.7 573 1675 

PHPtesting

ab -n 500 -c 50 http://www.~~~.com/test.php

 Connect: 248 275 51.1 267 1316 Processing: 256 4167 6210.2 2262 41489 Waiting: 253 4166 6210.2 2262 41489 Total: 509 4442 6212.4 2523 41754 

当访问PHP脚本时,Pingdom也会报告很长的等待时间。 在这里输入图像说明

我在WebPageTest.org上得到了类似的结果,虽然更好,第一次到字节是F

  Load Time **First Byte** Start Render DOM Elements Time Requests Bytes In Time Requests Bytes In First View 2.061s **0.839s** 0.000s 55 2.061s 20 428 KB 2.061s 20 430 KB 

这是我top结果: 在这里输入图像说明

I / Otesting

在重负载下,wa%可以在几毫秒内增加到95%。

在加载过程中我运行了iostat:

 avg-cpu: %user %nice %system %iowait %steal %idle 8.37 0.00 5.18 0.56 0.00 85.88 Device: rrqm/s wrqm/sr/sw/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util sda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 sda1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 sdb 0.00 45.50 3.00 48.00 136.00 748.00 17.33 3.05 59.76 2.53 12.90 sdb1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 sdb2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 sdb3 0.00 45.50 3.00 48.00 136.00 748.00 17.33 3.05 59.76 2.53 12.90 avg-cpu: %user %nice %system %iowait %steal %idle 4.00 0.00 3.56 0.69 0.00 91.75 Device: rrqm/s wrqm/sr/sw/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util sda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 sda1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 sdb 6.00 118.50 9.50 21.00 996.00 1116.00 69.25 0.29 9.44 1.66 5.05 sdb1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 sdb2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 sdb3 6.00 118.50 9.50 21.00 996.00 1116.00 69.25 0.29 9.44 1.66 5.05 

对我来说,这看起来不错,但我可能会错过一些东西。

我正在使用FCGI

 <IfModule mod_fcgid.c> FcgidMaxRequestLen 1547483648 FcgidMaxRequestInMem 52485760 FcgidIdleScanInterval 15000 FcgidBusyTimeout 15000 FcgidProcessLifeTime 7200 FcgidConnectTimeout 1800 FcgidIOTimeout 1800 PHP_Fix_Pathinfo_Enable 1 FcgidMaxRequestsPerProcess 1000 </IfModule> 

这里是我的Apache Conf(我正在使用2.4.x)

 Timeout 60 TraceEnable Off ServerSignature Off ServerTokens ProductOnly FileETag None StartServers 10 <IfModule prefork.c> MinSpareServers 5 MaxSpareServers 15 </IfModule> <IfModule itk.c> MinSpareServers 5 MaxSpareServers 15 </IfModule> ServerLimit 2200 MaxRequestWorkers 2000 MaxConnectionsPerChild 15000 KeepAlive On KeepAliveTimeout 1 MaxKeepAliveRequests 2000 

我查看了我的Apache错误日志和访问日志。 没有什么奇怪的报告。

我真的在这里挠头。

我试过closures防火墙。

我试过增加最大连接数。

我已经优化了mySQL并删除了很多慢速查询(大于0.5s)。

我还能做什么,有什么我可以用来帮助发现问题? 任何帮助将不胜感激。

PS:

值得注意的是,即使服务器被大量访问,PHPMyAdmin和cPanel仍然是非常敏感的。 除了网站上的PHP之外,没有别的东西可以滞后。

我认为你的问题只是你的硬盘访问时间。 Apache可以在内存中cachinghtml页面,但是php脚本不会被caching; 每次都需要执行。 因此,PHP解释器被调用,它从硬盘读取脚本。 这需要很多时间。 你的服务器上最慢的东西是你的硬盘。 在我的电脑上,从我的SSD和我的硬盘开始,应用程序之间存在着极大的差异(SSD的速度快了10倍!)。 如果你的硬盘工作,那么执行php脚本的延迟可能会大大增加。

可能的解决scheme:获得一个SSD(也许是一个小的只为经常访问的数据,如脚本),并尽量减less脚本调用(和硬盘访问)在您的服务器上。 确保文件系统经过了碎片整理(通常是自动完成的)。 如果你的php脚本经常创build相同的内容,请尝试将它们caching到一个html文件中。

这个答案也可以帮助你: https : //stackoverflow.com/questions/4181865/apache-php-caching

你正在testing的HTML文件只是一个普通文件,Apache所要做的只是做一些系统调用(打开,读取),然后提供其内容。

PHP OTOH实际上相当“重”select:它是一个完整的解释器(字节码编译器?)。 而且,由于您正在使用并发testing(-c),谁知道请求被复用到多less? 这不一定是apache的问题,而是PHP的问题。

我会做什么:

  1. 切换到Apache MPM(多进程中的multithreading)。

  2. 做顺序testing(没有多个并发请求),比较。

  3. 在apache进程上运行valgrind或者其他的东西,看看大部分的CPU时间花在哪里(apache或PHP)。

  4. 运行相同的testing,但通过nginx服务这个页面。 由于nginx基于asynchronous模式,而且速度非常快,如果得到相似的结果,PHP是罪魁祸首。

  5. 最后,您可以安装Zend Optimizer(30天免费试用版),或者像这样安装: https : //github.com/zendtech/ZendOptimizerPlus 。

真的,比较服务一个静态文件dynamic生成的网页是苹果桔子比较。 没有一个典型的解决scheme(Python mod-apache,Django,PHP等)在这方面会非常快,至less与提供静态文件相比。 Node.js也许是一个例外,因为在async模型中直接使用了“低级”编程网页。

PS你没有引用php.ini内容。 张贴和/或调整它。