PHP5-FPM进程在访问大型PHP文件时会消耗100%的CPU



我有一个非常奇怪的问题。服务器上有一个test.php文件,其中大约有3k行代码(100kB)。代码什么都不做,它是一个相当大的类的定义,有很多参数和函数,但该类从未被实例化或以任何方式使用。

我以每秒100个请求的速度访问test.php,直到它被访问1000次。之后,我确保服务器是平静的,并再次运行测试。最初的几次跑步通常都很好。然后,下面的运行有一些超时请求。下一次运行有更多超时请求。然后,如果我再做一次,几乎所有的请求都会失败,而top显示了几个php5-fpm在做一些需要100%CPU的事情。服务器通常需要几分钟才能平静下来,在这种状态下,任何尝试执行HTTP请求的操作都会导致504错误。

使用静态文件(例如test.html)或空的test2.php进行相同的测试,其中只有php打开-关闭标记,不会产生有趣的结果,一切都运行顺利。

服务器是一个Nginx AWS EC2实例。到目前为止,我试着玩configs,但没有成功。以下是一些可能相关的参数。

root@ip-...:~# cat /proc/cpuinfo
processor   : 0
vendor_id   : GenuineIntel
cpu family  : 6
model       : 23
model name  : Intel(R) Xeon(R) CPU           E5430  @ 2.66GHz
stepping    : 10
cpu MHz     : 2659.994
cache size  : 6144 KB
fdiv_bug    : no
hlt_bug     : no
f00f_bug    : no
coma_bug    : no
fpu     : yes
fpu_exception   : yes
cpuid level : 13
wp      : yes
flags       : fpu tsc msr pae cx8 cmov pat pse36 clflush dts mmx fxsr sse sse2 ss ht pbe nx lm constant_tsc up arch_perfmon pebs bts aperfmperf pni dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm dca sse4_1 lahf_lm dts tpr_shadow vnmi flexpriority
bogomips    : 5319.98
clflush size    : 64
cache_alignment : 64
address sizes   : 38 bits physical, 48 bits virtual
power management:
root@ip-...:~# nproc
1

www.conf

pm.max_requests = 500
pm.max_children = 5
pm = dynamic

nginx.conf

worker_processes 4;
events {
worker_connections 768;
}
http {
gzip on;
client_body_timeout 300;
client_header_timeout 300;
send_timeout 300;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
}

我试着把它减少到1个nginx工人+1个php孩子,以及玩一些其他的东西,但这些东西似乎都没有任何区别。据我所知,记忆永远不会被交换。任何关于其他可以调试或检查的想法,都将不胜感激!

使用apc。这将把解析后的PHP文件缓存为操作码,并跳过一次又一次的解析。

最新更新