PHP Fpm进程正在查杀我的网站:进程被阻止状态为D.
经过几天的网络搜索,Stack Overflow,Google,.无处不在,我无法理解
PHP-fpm在正常工作几小时后会发生什么.
问题描述: 我有一个Ubuntu 16.04 VPS,我已经安装了PHP-FPM和Nginx以及一个小型redis-server来存储会话.我有4个网站在PHP-fpm下运行.所有网站都很好,只有其中一个有这个问题. PHP-FPM使用套接字与Nginx通信. 工作了几个小时后,当我运行htop命令时,突然PHP-FPM进程无效并且状态为D.以下是htop命令输出的屏幕截图: 在互联网上搜索后,我得到了状态D意味着进程正在等待资源. 我为MySQL服务器添加了更多内存但没有任何反应.当我从workbench或任何其他应用程序执行命令时,MySQL服务器很好. 也许,这是一个记忆问题? 我为VPS添加了内存,它现在运行6 GB内存(大部分内存未使用). PHP-FPM在运行数小时后继续具有状态D. 也许它与打开的文件描述符有关? 我将打开的文件描述符的数量更改为2097152这是一个非常大的数字.我继续遇到同样的问题. 也许,这是套接字问题或Linux配置问题? 我已经增加了大多数Linux配置参数,如下所示: # Increase size of file handles and inode cache fs.file-max = 2097152 # unix sockets accept by default 127 connections. net.core.somaxconn = 4096 vm.swappiness = 0 vm.vfs_cache_pressure = 50 #Needed by redis vm.overcommit_memory = 1 # # 16MB per socket - which sounds like a lot,but will virtually never # consume that much. # net.core.rmem_max = 16777216 net.core.wmem_max = 16777216 # Increase the number of outstanding syn requests allowed. # c.f. The use of syncookies. net.ipv4.tcp_max_syn_backlog = 8192 但我继续遇到同样的问题.这是我在nginx日志中得到的: 2016/07/17 22:57:30 [alert] 1885#1885: *59394 open socket #156 left in connection 117 2016/07/17 22:57:30 [alert] 1885#1885: *59341 open socket #107 left in connection 118 2016/07/17 22:57:30 [alert] 1885#1885: *59385 open socket #148 left in connection 119 2016/07/17 22:57:30 [alert] 1885#1885: *59392 open socket #154 left in connection 121 我尝试过在网上找到的大多数推荐的解决方案,但没有成功. 我在PHP-fpm.conf中更改了这些参数. emergency_restart_threshold = 30 emergency_restart_interval = 180 process_control_timeout = 30 这是池的PHP-fpm配置: pm = ondemand pm.max_children = 30 pm.process_idle_timeout = 10s; pm.max_requests = 500 这是我的nginx站点配置: fastcgi_buffers 256 16k; fastcgi_max_temp_file_size 0; location ~ ^/index.php(/|$) { fastcgi_pass unix:/var/run/php5-fpm-mysite.com.sock; fastcgi_split_path_info ^(.+.php)(/.*)$; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; fastcgi_param DOCUMENT_ROOT $realpath_root; internal; } Nginx Global配置: worker_processes 2; worker_rlimit_nofile 100000; pid /run/nginx.pid; events { worker_connections 1024; multi_accept on; } 最后一件事:在2周之前,我运行的是Ubuntu 14.04,我已将服务器升级到Ubuntu 16.04,我遇到了很多问题.但是这一个,我无法准确理解这个问题的根源. 我正在使用Ocache缓存代码,我增加了所有参数以获得更多内存和网站工作正常,缓存永远不会满. 我已经多次重启服务器以应用配置. 光盘:50%已满.我有很多空间. 请注意,当PHP-fpm进程被阻止时,我重新启动了整个服务,几秒钟之后,我遇到了同样的问题.我为nginx做了同样的事情,我遇到了同样的问题.使网站工作的唯一方法是重新启动整个系统. 欢迎任何帮助! 解决方法
经过几天寻找解决方案后,问题与Linux inode无关,与内存无关且与套接字无关……
它与应用程序代码有关. 我使用Symfony2 Framework,由于某些原因,我将参数“auto_generate_proxy_classes”更改为true.我已经将代码推向了生产阶段. 当auto_generate_proxy_classes设置为true时,Doctrine将检查所有代理类并在每个请求中重新生成它们.因此,当我收到很多请求时,php-fpm进程将同时重新生成这些类.因此,进程被阻止,直到其他进程完成代码生成. 解: 代替: doctrine: dbal: .... orm: auto_generate_proxy_classes: true. 设置默认的Symfony2配置: doctrine: dbal: .... orm: auto_generate_proxy_classes: "%kernel.debug%" (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |