问题描述:
我有一个Ubuntu 16.04 VPS,我已经安装了PHP-FPM和Nginx以及一个小型redis-server来存储会话.我有4个网站在PHP-fpm下运行.所有网站都很好,只有其中一个有这个问题.
工作了几个小时后,当我运行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
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做了同样的事情,我遇到了同样的问题.使网站工作的唯一方法是重新启动整个系统.
欢迎任何帮助!
解决方法
它与应用程序代码有关.
我使用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%"
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。