访问大型PHP文件时,PHP5-FPM进程占用100%的CPU

时间:2012-11-20 18:07:36

标签: performance nginx php

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

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

与静态文件(例如test.html)或只有php开关标签的空test2.php相同的测试,没有产生有趣的结果,一切运行顺利。

服务器是Nginx AWS EC2实例。到目前为止,我尝试过使用配置而没有运气。以下是一些可能相关的参数。

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孩子以及玩其他一些东西,但这些事情似乎没有任何区别。从我可以告诉记忆永远不会被交换。关于还有什么可以调试或检查的任何想法都将受到高度赞赏!

1 个答案:

答案 0 :(得分:0)

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