我有一个非常奇怪的问题。服务器上有一个 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 worker + 1 个 php child 以及玩其他一些东西,但这些东西似乎都没有任何区别。据我所知,内存永远不会被交换。任何关于其他可以调试或检查的想法,将不胜感激!