PHP Fpm 进程正在终止我的网站 : process is blocked with status D

标签 php linux ubuntu nginx

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

问题描述:

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

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

正常工作数小时后,当我运行 htop 命令时,PHP-FPM 进程突然无法工作并且状态为 D。这是 htop 命令输出的屏幕截图:

demonstration

在网上查了一下,状态D表示进程正在等待资源。

我为 MySQL 服务器添加了更多内存,但没有任何反应。当我从工作台或任何其他应用程序执行命令时,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 全局配置:

worker_processes 2;
worker_rlimit_nofile 100000;

pid /run/nginx.pid;

events {
        worker_connections 1024;
        multi_accept on;
}

最后一件事:两周前,我运行的是 Ubuntu 14.04,我已将服务器升级到 Ubuntu 16.04,但我遇到了很多问题。但是这个,我无法准确理解这个问题的根源。

我正在使用 Ocache 来缓存代码,我增加了所有参数以获得更多内存,并且网站工作正常并且缓存永远不会满。

我已经多次重启服务器以应用配置。

光盘:已满 50%。我有很多空间。

请注意,当 PHP-fpm 进程被阻止时,我重新启动了整个服务,几秒钟后,我遇到了同样的问题。我为 nginx 做了同样的事情,我遇到了同样的问题。 使网站正常工作的唯一方法是重新启动整个系统

拜托,欢迎任何帮助!

最佳答案

经过几天寻找解决方案,问题与 Linux inode 无关,与内存无关,与套接字无关...

与应用程序代码有关。

我使用 Symfony2 框架,出于某些原因,我将参数“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%"

关于PHP Fpm 进程正在终止我的网站 : process is blocked with status D,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38426603/

相关文章:

用于在不同时间运行的作业的 Linux Crontab 表达式

c++ - 为什么pthread_join()返回0而不是我的线程的返回值?

ubuntu - 将应用程序添加到 'Open with other applications' 对话框

apache - Ubuntu 16.04 - Apache 2.4.18 - 请求 URI 太长

php - 什么是安全 token 以及为什么在表单中使用它?

php - 标签系统的数据库结构

python - "[Errno 13] Permission denied"仅在 Ubuntu 服务器上尝试更新/更改文档时

PHP foreach 数据库结果

php - 我怎样才能在 laravel 的 Controller 中获取 lang

linux - 构建 caffe 时出错 - 找不到 -lhdf5_hl