我有一个非常奇怪的问题。服务器上有一个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孩子以及玩其他一些东西,但这些事情似乎没有任何区别。从我可以告诉记忆永远不会被交换。关于还有什么可以调试或检查的任何想法都将受到高度赞赏!
答案 0 :(得分:0)
使用apc
。这会将解析后的PHP文件缓存为操作码,并跳过一遍又一遍地解析它。