我在 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 上。