一直在尝试找出 LAMP 服务器 CPU 使用率过高的罪魁祸首

一直在尝试找出 LAMP 服务器 CPU 使用率过高的罪魁祸首

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

偶尔,我的服务器负载会达到 8+。top显示 httpd.worker 消耗了 120-150% 的 CPU,但访问速度似乎没有那么快。我确实注意到,当这种情况发生时,我们的 craftysyntax URL 似乎会不断出现。

我还安装了 mod_security 及其一套核心规则。

我正在绞尽脑汁想找出导致 CPU 使用率过高的原因。我的主要怀疑是 PHP 和 mod_security。

我在负载峰值期间有以下 oprofile 输出形式,但它没有告诉我哪个进程正在调用 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 没有链接(奇怪)。

答案1

将导致问题的实时进程的 pid 附加到 ltrace 中。看起来是某个错误的正则表达式,或者是调用次数很多的正则表达式。无论哪种情况,都必须先对其进行本地化。记得跟踪分支。

答案2

libpcre 是 perl 正则表达式。您的代码或 .htaccess 是否使用了大量(或非常复杂)的表达式?问题似乎确实出在 mod_security 上。

相关内容