После нескольких дней поиска в Интернете, переполнение стека, Google ,. Всюду я не могу понять, что происходит с PHP-fpm после часа работы.PHP Fpm процесс убивает мой сайт: процесс блокируется статусом D
Описание проблемы:
У меня есть Ubuntu 16.04 VPS, где я установил PHP-FPM и Nginx и небольшой Redis-сервер для хранения сессий. У меня есть 4 веб-сайта под PHP-fpm. Все сайты хороши, только одна из них имеет эту проблему.
PHP-FPM взаимодействует с Nginx с использованием сокетов.
После того как часы работали правильно, внезапно процессы PHP-FPM не работали и имеют статус D, когда я запускаю команду htop. Вот скриншот вывода команды HTOP:
После поиска в Интернете, я получил этот статус D означает, что процесс ждет ресурса.
Я добавил больше памяти для MySQL Server, но ничего не происходит. Сервер MySQL отлично работает, когда я выполняю команды из workbench или любого другого приложения.
Возможно, это проблема с памятью?
Я добавил память для VPS, и теперь она работает с 6 ГБ памяти (большая часть памяти не используется). 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;
}
Последняя вещь: До 2 недель я запускал Ubuntu 14.04, и я обновил свой сервер до Ubuntu 16.04, и у меня много проблем. Но этот, я не могу точно понять происхождение этой проблемы.
Я использую Ocache для кэширования кода, и я увеличил все параметры, чтобы получить больше памяти, а веб-сайт отлично работает, а кеш никогда не заполняется.
Я уже многократно перезапускал сервер, чтобы применить конфигурацию.
Диск: 50% полный. У меня много места.
Обратите внимание, что когда процесс PHP-fpm заблокирован, я перезапустил всю службу и несколько секунд спустя, у меня такая же проблема. Я сделал то же самое для nginx, и у меня такая же проблема. Единственный способ сделать работу на сайте - перезагрузить всю систему.
Пожалуйста, любая помощь приветствуется!
Давайте сделаем шаг назад и рассмотрим это целостно. Удалите весь трафик с сервера. Удалите тестовую страницу с помощью ничего, кроме ' Php phpinfo();' в ней. Получили ли вы ответ? Затем, ударив его несколько сотен раз. Все еще получаешь ответы? Укладываются ли процессы? Если это нормально, добавьте что-то, что загружает сеансы. В прошлый раз, когда у меня была такая проблема, в Redis была блокировка данных сеанса. Сторонний компонент, который я использовал, был глючит, поэтому я просто провел день и переписал его. Но я не знаю, если это ваша проблема. Начните с основ, отлаживайте оттуда. – Brad
Спасибо @Brad, но я не могу остановить сервер, потому что он онлайн :( Я думаю, что проблема связана с количеством открытых сокетов, как говорят журналы nginx, но я увеличил число до 4096, и у меня такая же проблема У меня есть лак перед nginx, поэтому не весь трафик отправляется на php-fpm. – skonsoft
Вы упомянули, что у вас есть другие серверы? Нельзя ли тратить трафик от этого и временно балансировать между остальными? Можете ли вы построить новый сервер? чтобы экспериментировать с ним, а затем разрезать трафик на него, когда вы его работаете? – Brad