坚持试图追查在LAMP服务器上高CPU使用率的罪魁祸首

我使用Rackspace IUS社区存储库的PHP 5.1在RedHat Enterprise 5.5上运行Apache。

偶尔,我有8 +负载的服务器尖峰。 top显示httpd.worker消耗120-150%的CPU,但命中似乎没有那么快。 我注意到,当这种情况发生时,我们的工艺语法URL似乎不断出现。

我也有一个核心规则集安装了mod_security。

我疯狂地想弄清楚是什么导致了高CPU使用率。 我的主要嫌疑人是PHP和mod_security。

我有一个负载峰值期间的以下oprofile输出forms,但它不告诉我哪个进程正在调用libpcre:

 % opreport CPU: Intel Architectural Perfmon, speed 2793.09 MHz (estimated) Counted CPU_CLK_UNHALTED events (Clock cycles when not halted) with a unit mask of 0x00 (No unit mask) count 100000 CPU_CLK_UNHALT...| samples| %| ------------------ 7061182 91.9105 libpcre.so.0.0.1 206901 2.6931 php-cgi 142239 1.8514 mod_security2.so 138121 1.7978 vmlinux 53809 0.7004 libc-2.5.so 20909 0.2722 libapr-1.so.0.2.7 16585 0.2159 oprofiled 9230 0.1201 oprofile 

仅供参考, ldd显示mod_security链接到libpcre,但php-cgi不是(怪异的)。

附上ltrace导致问题的现场过程的PID。 它看起来像一些不好的正则expression式,或正则expression式被调用了很多。 无论哪种情况,都要先把它本地化。 记得按照叉子。

libpcre是perl的正则expression式。 你的代码或.htaccess使用了很多(或非常复杂的)expression式吗? 这看起来好像问题是植根于mod_security。