PHP Fpm进程正在查杀我的网站:进程被阻止状态为D.

时间:2016-07-17 22:39:26

标签: php linux ubuntu nginx

经过几天的网络搜索,Stack Overflow,Google,。无处不在,我无法理解PHP-fpm在正常工作几小时后会发生什么。

问题描述:

我有一个Ubuntu 16.04 VPS,我安装了PHP-FPM和Nginx以及一个小型redis服务器来存储会话。我有4个网站在PHP-fpm下运行。所有网站都很好,只有其中一个有这个问题。

PHP-FPM使用套接字与Nginx通信。

在运行正常的情况下,当我运行htop命令时,突然PHP-FPM进程无效并且状态为 D 。以下是htop命令输出的屏幕截图:

demonstration

在互联网上搜索后,我得到了状态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做了同样的事情,我遇到了同样的问题。 让网站运作的唯一方法是重启整个系统

请欢迎任何帮助!

2 个答案:

答案 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上切换处理器),但希望此解决方案可能对某人有所帮助。