问题是我的PHP5-fpm日志不断报告慢脚本并杀死子线程.
专用服务器,quad xeon,32Gb Ram. 1个PHP应用程序/站点运行.
PHP应用程序:Nutshell,搜索引擎,结果触发curl请求.每次搜索的页面加载时间通常为2-3秒.
这就是我认为正在发生的事情
我有750个并发的PHP用户执行搜索.由于RAM限制,我只能设置pm.max_children = 400.我假设每个用户50Mb(子线程),所以= 20GB.我假设每个用户= 1个子线程.因此,pm.max_children不足以覆盖那些需要3秒钟进行搜索的750个活跃PHP用户.
所以我认为我看到用户排队,因为我看到3秒变成4-7秒.由于用户排队我认为脚本越来越慢触发错误日志消息而PHP5-fpm pm会杀死孩子?
这就是我认为正在发生的事情.我在下面提供了我的错误日志输出,Nginx,PHP5-fpm配置.
我真的很感激任何关于我是否可以调整我的配置的建议,如果确实pm.max_children应该至少等于你的最大并发用户,请记住我的PHP搜索打开大约3秒钟.我需要更多内存还是其他服务器?
这是我的记忆,但我只在大约30分钟前重新启动了Nginx
:/var/log# free -m total used free shared buffers cached Mem: 32151 26175 5975 0 186 13334 -/+ buffers/cache: 12654 19496 Swap: 32739 5 32734
PHP5-fpm:www.conf:
进程管理器设置为静态
我正在使用静态,因为我认为所有的孩子都可以立即使用,而不是产生时间,我只在盒子上运行1个应用程序.
;pm = dynamic pm = static ;pm.max_children = 10 pm.max_children = 400 ;pm.start_servers = 4 pm.start_servers = 150 ;pm.min_spare_servers = 2 pm.min_spare_servers = 32 ;pm.max_spare_servers = 6 pm.max_spare_servers = 64 ;pm.max_requests = 500 pm.max_requests = 10000
我应该澄清,我在高负载下看到的行为,一次有750个用户是缓存的搜索结果而不是缓存开始需要更长的时间.即>缓存为1秒,非缓存为4到7秒.因此,当用户排队等待时,我认为搜索时间会增加,并且它会在负载下缓慢运行到脚本运行缓慢的程度.触发通知,孩子被杀.
例如刚刚重启之后
[04-Jun-2013 20:11:07] NOTICE: Finishing ... [04-Jun-2013 20:11:11] NOTICE: exiting,bye-bye! [04-Jun-2013 20:11:12] NOTICE: fpm is running,pid 17899 [04-Jun-2013 20:11:12] NOTICE: ready to handle connections [04-Jun-2013 20:27:28] WARNING: [pool www] child 18200,script '/home/site/public_html/index.PHP' (request: "POST /index.PHP") executing too slow (10.827363 sec),logging [04-Jun-2013 20:27:28] WARNING: [pool www] child 18138,script '/home/site/public_html/index.PHP' (request: "POST /index.PHP") executing too slow (10.827034 sec),logging [04-Jun-2013 20:27:28] NOTICE: child 18138 stopped for tracing [04-Jun-2013 20:27:28] NOTICE: about to trace 18138 [04-Jun-2013 20:27:28] NOTICE: finished trace of 18138 [04-Jun-2013 20:27:28] NOTICE: child 18200 stopped for tracing [04-Jun-2013 20:27:28] NOTICE: about to trace 18200 [04-Jun-2013 20:27:28] NOTICE: finished trace of 18200 [04-Jun-2013 20:52:52] WARNING: [pool www] child 17948,script '/home/site/public_html/index.PHP' (request: "GET /index.PHP") executing too slow (11.724081 sec),logging [04-Jun-2013 20:52:52] NOTICE: child 17948 stopped for tracing [04-Jun-2013 20:52:52] NOTICE: about to trace 17948 [04-Jun-2013 20:52:52] ERROR: Failed to ptrace(PEEKDATA) pid 17948: Input/output error (5) [04-Jun-2013 20:52:52] NOTICE: finished trace of 17948 [04-Jun-2013 20:58:22] WARNING: [pool www] child 18287,script '/home/site/public_html/index.PHP' (request: "POST /index.PHP") executing too slow (10.701504 sec),logging [04-Jun-2013 20:58:22] NOTICE: child 18287 stopped for tracing [04-Jun-2013 20:58:22] NOTICE: about to trace 18287 [04-Jun-2013 20:58:22] NOTICE: finished trace of 18287 [04-Jun-2013 21:19:22] WARNING: [pool www] child 18224,script '/home/site/public_html/index.PHP' (request: "GET /index.PHP") executing too slow (10.005466 sec),logging [04-Jun-2013 21:19:22] WARNING: [pool www] child 18197,script '/home/site/public_html/index.PHP' (request: "GET /index.PHP") executing too slow (12.141221 sec),logging [04-Jun-2013 21:19:22] WARNING: [pool www] child 17946,script '/home/site/public_html/index.PHP' (request: "GET /index.PHP") executing too slow (11.107080 sec),logging [04-Jun-2013 21:19:22] NOTICE: child 17946 stopped for tracing [04-Jun-2013 21:19:22] NOTICE: about to trace 17946 [04-Jun-2013 21:19:22] NOTICE: finished trace of 17946 [04-Jun-2013 21:19:22] NOTICE: child 18197 stopped for tracing [04-Jun-2013 21:19:22] NOTICE: about to trace 18197 [04-Jun-2013 21:19:22] NOTICE: finished trace of 18197 [04-Jun-2013 21:19:22] NOTICE: child 18224 stopped for tracing [04-Jun-2013 21:19:22] NOTICE: about to trace 18224 [04-Jun-2013 21:19:22] NOTICE: finished trace of 18224 [04-Jun-2013 21:19:26] WARNING: [pool www] child 18197,script '/home/site/public_html/index.PHP' (request: "GET /index.PHP") execution timed out (15.475021 sec),terminating [04-Jun-2013 21:19:26] WARNING: [pool www] child 18055,script '/home/site/public_html/index.PHP' (request: "GET /index.PHP") executing too slow (12.927407 sec),logging [04-Jun-2013 21:19:26] NOTICE: child 18055 stopped for tracing [04-Jun-2013 21:19:26] NOTICE: about to trace 18055 [04-Jun-2013 21:19:26] NOTICE: finished trace of 18055 [04-Jun-2013 21:19:26] WARNING: [pool www] child 18197 exited on signal 15 (SIGTERM) after 4094.193190 seconds from start [04-Jun-2013 21:19:26] NOTICE: [pool www] child 5137 started [04-Jun-2013 21:24:49] WARNING: [pool www] child 17918,script '/home/site/public_html/index.PHP' (request: "GET /index.PHP") executing too slow (11.367854 sec),logging [04-Jun-2013 21:24:49] NOTICE: child 17918 stopped for tracing [04-Jun-2013 21:24:49] NOTICE: about to trace 17918 [04-Jun-2013 21:24:49] NOTICE: finished trace of 17918 [04-Jun-2013 21:24:53] WARNING: [pool www] child 18226,script '/home/site/public_html/index.PHP' (request: "GET /index.PHP") executing too slow (10.763667 sec),logging [04-Jun-2013 21:24:53] WARNING: [pool www] child 18206,script '/home/site/public_html/index.PHP' (request: "GET /index.PHP") executing too slow (12.060464 sec),logging [04-Jun-2013 21:24:53] WARNING: [pool www] child 18073,script '/home/site/public_html/index.PHP' (request: "GET /index.PHP") executing too slow (11.846097 sec),logging [04-Jun-2013 21:24:53] NOTICE: child 18073 stopped for tracing [04-Jun-2013 21:24:53] NOTICE: about to trace 18073 [04-Jun-2013 21:24:53] NOTICE: finished trace of 18073 [04-Jun-2013 21:24:53] NOTICE: child 18206 stopped for tracing [04-Jun-2013 21:24:53] NOTICE: about to trace 18206 [04-Jun-2013 21:24:53] NOTICE: finished trace of 18206 [04-Jun-2013 21:24:53] NOTICE: child 18226 stopped for tracing [04-Jun-2013 21:24:53] NOTICE: about to trace 18226 [04-Jun-2013 21:24:53] NOTICE: finished trace of 18226 [04-Jun-2013 21:24:56] WARNING: [pool www] child 5137,script '/home/site/public_html/index.PHP' (request: "GET /index.PHP") executing too slow (12.055624 sec),logging [04-Jun-2013 21:24:56] WARNING: [pool www] child 18206,script '/home/site/public_html/index.PHP' (request: "GET /index.PHP") execution timed out (15.395149 sec),terminating [04-Jun-2013 21:24:56] WARNING: [pool www] child 17996,script '/home/site/public_html/index.PHP' (request: "GET /index.PHP") executing too slow (12.145728 sec),logging [04-Jun-2013 21:24:56] WARNING: [pool www] child 17918,script '/home/site/public_html/index.PHP' (request: "GET /index.PHP") execution timed out (18.036700 sec),terminating [04-Jun-2013 21:24:56] NOTICE: child 17996 stopped for tracing [04-Jun-2013 21:24:56] NOTICE: about to trace 17996 [04-Jun-2013 21:24:56] NOTICE: finished trace of 17996 [04-Jun-2013 21:24:56] NOTICE: child 5137 stopped for tracing [04-Jun-2013 21:24:56] NOTICE: about to trace 5137 [04-Jun-2013 21:24:56] NOTICE: finished trace of 5137 [04-Jun-2013 21:24:56] WARNING: [pool www] child 17918 exited on signal 15 (SIGTERM) after 4424.343036 seconds from start [04-Jun-2013 21:24:56] NOTICE: [pool www] child 6706 started [04-Jun-2013 21:24:56] WARNING: [pool www] child 18206 exited on signal 15 (SIGTERM) after 4424.264130 seconds from start [04-Jun-2013 21:24:56] NOTICE: [pool www] child 6707 started [04-Jun-2013 21:24:59] WARNING: [pool www] child 17996,script '/home/site/public_html/index.PHP' (request: "GET /index.PHP") execution timed out (15.479201 sec),terminating [04-Jun-2013 21:24:59] WARNING: [pool www] child 17996 exited on signal 15 (SIGTERM) after 4427.655572 seconds from start [04-Jun-2013 21:24:59] NOTICE: [pool www] child 6708 started
这是我的Nginx配置
user www-data; worker_processes 4; pid /var/run/Nginx.pid; worker_rlimit_nofile 20000; events { #worker_connections 768; #worker_connections 19000; #multi_accept on; use epoll; #worker_connections 10240; worker_connections 4096; } http { ## # Basic Settings ## sendfile on; tcp_nopush on; tcp_nodelay on; #keepalive_timeout 65; #keepalive_timeout 5; #added client_body_timeout 15; client_header_timeout 15; keepalive_timeout 15; send_timeout 15;
site.conf
proxy_buffer_size 128k; proxy_buffers 4 256k; proxy_busy_buffers_size 256k; fastcgi_connect_timeout 60; fastcgi_send_timeout 180; fastcgi_read_timeout 180; fastcgi_buffer_size 128k; fastcgi_buffers 4 256k; #fastcgi_buffers 256 16k; #4096k total fastcgi_busy_buffers_size 256k; fastcgi_temp_file_write_size 256k; fastcgi_intercept_errors on;
PHP5-fpm通过TCP端口连接
谢谢
我通常会从5到50个PHP进程中进行任何操作,该范围的两端都有点特殊.通常10-15.对于性能非常高的磁盘系统,以及超过通常的16个核心,拥有更多进程可能是有意义的,但与拥有更多更便宜的服务器相比,这通常是错误的经济.根据我的经验,除非你有很多编写得非常糟糕的代码,否则在一台服务器上并行处理超过15个PHP进程通常没什么好处,如果有一个好处,它可能是稳定性而不是吞吐量,面对病态长期运行的请求堆积并且不留下备用流程.
如果您有多个具有单独进程池的代码库,则可能需要大量进程,但每个池可能不需要超过3到5个进程.
你确实需要很多Nginx工作者连接来处理静态文件.除了4096之外,不太可能有任何改进,只有在不寻常的情况下你会看到1000和4000之间的差异.(除非你主要服务于静态文件 – 这是一个完全不同的场景,但是因为你正在讨论这个问题上的PHP进程我不认为这是这种情况).
我怀疑你的超时时间太长了.如果没有任何结果,请断开连接并继续下一个连接.