经过几天的网络搜索,Stack Overflow,Google,。无处不在,我无法理解PHP-fpm在正常工作几小时后会发生什么。
问题描述:
我有一个Ubuntu 16.04 VPS,我安装了PHP-FPM和Nginx以及一个小型redis服务器来存储会话。我有4个网站在PHP-fpm下运行。所有网站都很好,只有其中一个有这个问题。
PHP-FPM使用套接字与Nginx通信。
在运行正常的情况下,当我运行htop命令时,突然PHP-FPM进程无效并且状态为 D 。以下是htop命令输出的屏幕截图:
在互联网上搜索后,我得到了状态D意味着进程正在等待资源。
我为MySQL Server添加了更多内存但没有任何反应。当我从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 config:
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做了同样的事情,我遇到了同样的问题。 让网站运作的唯一方法是重启整个系统。
请欢迎任何帮助!
答案 0 :(得分:0)
经过几天寻找解决方案后,问题与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%"
答案 1 :(得分:0)
我遇到了类似的问题,并尝试调整上面提到的大部分参数。没有运行Symfony,只需使用nginx / php-fpm在Ubuntu 16.04上运行PHP 5.6。
服务器已运行好几周,突然它退出响应Web请求。我得到了很多&#34;打开套接字#nnn连接&#34; /var/log/nginx/error.log和&#34;服务器中的消息到达pm.max_children设置&#34; /var/log/php5.6-fpm.log中的消息
它使用AMD处理器在Profitbricks的虚拟服务器上运行。经过多次重启和重新启动以及几个小时没有成功,我已经没有想法,最后打电话给Profitbricks支持,看看是否有任何硬件或网络问题。没有报道,但他们建议将处理器类型从AMD改为Intel Xeon。
在我更改为XEON处理器后,服务器重新启动,一切正常。
我仍然不确定导致问题的原因(并且可能无法在许多VPS上切换处理器),但希望此解决方案可能对某人有所帮助。