0

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

4

1 回答 1

0

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

于 2012-11-21T10:52:44.360 回答