Apache进程消耗太多的CPU

我有一个Ubuntu的Apache / PHP服务器运行PHP做appx 100点击/秒和在后台运行的PHP Cron。

无论stream量还是cron活动,我都会在某个Apache进程中偶尔遇到高CPU负载。 在我看来,它陷入某种循环或什么东西。

下面你会发现顶部和strace信息。

我怎样才能find不好的代码在哪里,是什么原因造成的?

top - 14:45:24 up 3 days, 3:38, 1 user, load average: 5.10, 5.88, 5.85 Tasks: 163 total, 5 running, 158 sleeping, 0 stopped, 0 zombie Cpu(s): 47.8%us, 18.5%sy, 0.0%ni, 10.2%id, 0.0%wa, 0.0%hi, 1.8%si, 21.6%st Mem: 7885012k total, 3858484k used, 4026528k free, 177444k buffers Swap: 0k total, 0k used, 0k free, 1037868k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 10736 www-data 20 0 769m 559m 478m R 69 7.3 29:08.30 apache2 10844 www-data 20 0 824m 601m 492m S 17 7.8 4:37.90 apache2 1016 root 20 0 242m 25m 4628 S 6 0.3 162:07.93 scalarizr 9030 www-data 20 0 879m 619m 492m S 4 8.0 5:06.82 apache2 20216 www-data 20 0 747m 228m 170m S 4 3.0 0:01.94 apache2 10807 www-data 20 0 814m 584m 492m S 3 7.6 4:54.10 apache2 10455 www-data 20 0 831m 574m 492m S 3 7.5 4:32.65 apache2 10495 www-data 20 0 849m 592m 492m S 3 7.7 4:41.10 apache2 10884 www-data 20 0 840m 581m 492m S 3 7.6 4:25.06 apache2 ^CProcess 10736 detached % time seconds usecs/call calls errors syscall ------ ----------- ----------- --------- --------- ---------------- 74.55 0.148052 1 109755 gettimeofday 25.36 0.050370 0 164634 clock_gettime 0.09 0.000178 0 54878 poll ------ ----------- ----------- --------- --------- ---------------- 100.00 0.198600 329267 total root@ec2-67-202-54-36:~# ^C 

我build议启用Apache mod_status并打开ExtendedStatus。 Slicehost有一个关于如何完成这个(我会使用“elinks”包与“l”“,但这是个人喜好)的优秀文章 。 当您查看Apache服务器状态URL时,将会有一个PID,VHost和Request列 – 他们应该在查找被调用的URI方面有很长的路要走,您可以使用它来追溯到正在运行的特定代码。

以下是Slicehost文章的定制版本,以启用mod_status:

 sudo apt-get install elinks sudo /usr/sbin/a2enmod status sudo sh -c "echo 'ExtendedStatus On' > /etc/apache2/conf.d/extendedstatus" sudo vi /etc/apache2/sites-available/server-status <Location /server-status> SetHandler server-status Order deny,allow Deny from all Allow from localhost </Location> sudo /usr/sbin/a2ensite server-status sudo apachectl configtest sudo service apache2 reload 

然后查看服务器状态:

 elinks -dump -dump-width 256 http://localhost/server-status 

神圣的马霍尼! 你的Apache似乎消耗太多的内存。 它运行的是什么? 是否有吨的Apache模块加载? 你有没有使用内存友好规则的mod_security? 你的网站是否像Magenta一样从地狱里跑出来的东西? 而且,真正让你的PHP脚本真的好奇当前时间的东西。 :d

那么无论如何,对于PHP分析,您可以使用XDebug并分析结果,例如KCacheGrind ,它以graphics易于阅读的forms向您显示结果。

对于实时性能分析,现代Linux发行版具有perf命令,它与传统的top类似,但是可以深入到单个进程,如果愿意,可以在汇编层面看到发生了什么。

你应该使用一个debugging器,例如xdebug ,通过你的程序来寻找无限循环。

有几个选项可以用来隔离你的问题。

显然你想检查你的日志,并确定是否有任何问题正在报告。

 /var/log/access_log /var/log/php_error /var/log/error_log 

顶部运行时按下C也会给你提供有关如此高CPU运行的进程的额外数据

由于dialtOne提到你可以安装mod_status以获得更多的细节。

我不知道如何使用PHP,但在机器上安装memcache和APC将提供一些额外的资源节省。 使用memcache,您将需要configuration代码以首先查找其用于数据库查找的高速caching。 这可以节省大量的重复访问的网站上的经常性数据库查找的开销。

调整你的记忆设置在PHP和任何你的数据库使用也可以帮助控制负载。

这是在你的php.ini中,无论你的数据库configuration文件是什么。

如果您正在使用数据库调用,则可以查找较慢的查询。

其他选项正在扩展你的subprocess和每个subprocess的数量,这可以在httpd.conf中configuration。

5的负载不是最糟糕的取决于你有多less处理器。 我以前见过的一些较大的networking服务器真的很高负载,网站仍然交付良好。 这真的是你想花多less精力来调整网站。

祝你好运!