Php fpm pool грузит процессор
У меня есть ситуация, в которой происходит следующее:
У нас на сайте одновременно меньше 100 пользователей - поэтому эта ситуация также невероятно смущает - что наш процессор очень высок.
Мы используем очень неизвестный, возможно, интенсивно работающий с php, сомнительно ужасный Framework вместо хорошо известных, хорошо документированных, хорошо продуманных других сред, таких как WordPress или Drupal, в которых есть много документации о кэшировании (а также плагины который обрабатывает кеширование) php на платформе nginx + php_fpm.
Таким образом, у нас есть около 6 открытых процессов php-fpm, которые при запуске запускают по отдельности БОЛЬШОЕ (30+ и часто около 99%) количество процессоров - и я не имею ни малейшего представления, как помешать им использовать столько процессоров , Я не могу сказать, какие php-скрипты вызывают эти всплески, потому что они происходят постоянно . обычно работает только 1 или 2, но когда все 6 запускаются, мы максимизируем все 8 процессоров.
Мы выполнили эту настройку, потому что, как я понимаю, наша память на самом деле потрясающая (htop показывает 472/7000 + мегабайт, без подкачки и т. Д.), И мы могли бы обрабатывать гораздо больше процессов и разбивать строку в ожидании получения обработанный - НО, к сожалению, поскольку каждый процесс слишком интенсивен на нашем процессоре во время работы - мы в конечном итоге загоняем наш процессор через крышу - поэтому мы не можем обрабатывать достаточное количество процессов.
Вопрос в том, что мы можем сделать, чтобы уменьшить использование процессора процессами php-fpm, чтобы мы могли увеличить настройки в этом конфигурационном файле пула для php-fpm, а также да, /var/log/php5-fpm.log кричит на нас, чтобы увеличить наших детей и настроить / увеличить наши минимальные / максимальные / стартовые серверы. Но это делает нашу нагрузку в среднем сумасшедшей, как говорилось ранее. Как мы можем сделать это без необходимости использовать кеш или каковы наши варианты?
Моя идея? Я читал кое-что об использовании cpulimit, чтобы гарантировать, что ни один процесс не займет больше, чем выделенное количество процессоров - но разве это замедлит процесс, чтобы его нельзя было использовать? Или, таким образом, мы могли бы увеличить нашу способность запускать больше, чем несколько процессов - я также подумал о запуске двух пулов - один для нашего сайта, ориентированного на будущее (на который обращаются клиенты), и другой для бэкенда (который влияет на наш сайт, ориентированный на будущее, когда время -отчетные отчеты запускаются).
Я потратил несколько дней на исследования, поиск в Google и т. Д. По этой теме - и это трудно, потому что ситуация каждого человека настолько уникальна для их системы - проблема в том, что такая специфическая неслыханная, возможно, плохо написанная - структура - делает трудно найти решение. Мы пока не можем просто отказаться от этой структуры - мне нужно найти какое-то решение.
ОБНОВЛЕНИЕ: я реализовал memcache для хранения php-сессий - потому что фреймворк в значительной степени зависит от пользовательских сессий, а природа нашей системы такова, что сотрудники часто используют несколько вкладок одновременно - каждая из них возвращается к сессиям для подтверждения способностей / пользовательских данных / и т. Д. . так что я надеюсь увидеть некоторое увеличение производительности от этого - пожалуйста, прокомментируйте это, если хотите, - я посмотрю, как это будет завтра, когда мы преодолеем наши пиковые периоды увеличения объема.
Nginx не очень хорош для ресурсоемких веб-приложений - но наш высокий процессор плох - действительно плох - и мы работаем над его исправлением. Не нужно настраивать максимальное количество клиентов, потому что оно ДОЛЖНО быть способным поддерживать приличное количество клиентов - но высокая загрузка ЦП на процесс искажает эту возможность. Мы переключились на apache только потому, что он немного лучше при высокой загрузке процессора, но в конечном итоге эта проблема более показательна для проблемы веб-приложения, и для ее решения может потребоваться некоторое время, но сейчас нет времени, чтобы начать ее исправлять.
Когда вы идете к врачу, и он говорит вам принять определенные лекарства - потому что он знает, что вы не будете слушать высказывания «перестаньте пить газировку и едите фастфуд» - именно поэтому для меня не было большого ответа - потому что правда На самом деле никаких настроек или быстрых исправлений - только грустная правда, что мы должны кардинально изменить само наше веб-приложение.
К счастью, если у вас есть эта проблема с популярным фреймворком, у вас может быть возможность использовать кеширование и обильную документацию по этому поводу - но мы находимся в некоторых неясных случайных вещах, которые мы не можем изменить, кроме самого фреймворка. Ура!
Итак, насколько я понимаю, opcache хранит ваш PHP-код в двоичном виде и может быть использован php-fpm гораздо быстрее (кэширование), но вы также должны использовать кеширование объектов. Например, хранение всей выходной страницы в виде объекта в чем-то вроде memcached. Это на самом деле кеширует вывод страницы (или другие вещи, которые вы хотите, например, сеансы php и т. Д.) . Далее, вы также можете использовать лак, который является обратным прокси-сервером - но в основном это посредник между запросом и вашим сервером, так что ваш сервер не получает запросы напрямую - и он работает из памяти для обслуживания кэшированных URL-адресов.
Varnish хорош для этого - хранит в памяти кэшированную копию того, что он получил с сервера, - поэтому лак берет на себя большую часть нагрузки. Мой нынешний работодатель работает на nginx, и мы используем лак и memcached. К счастью, у фреймворка, в котором мы сейчас находимся, есть собственный механизм кэширования для определения кэша страниц (выводимых данных страницы). На моей последней работе мне пришлось самому написать это в фреймворке - это было не весело, но сработало. Апач - я бы не стал переключаться обратно, если у вас нет времени, чтобы починить nginx . Я ненавидел возвращаться, но это Единственное решение не полностью убить наш проект, пока я написал механизм кэширования.
Несколько вещей для рассмотрения (заранее извиняюсь, если вы уже рассмотрели это): Прежде всего, убедитесь, что вы оптимизировали конфигурацию nginx и запускаете php-fpm только тогда, когда это абсолютно необходимо. Последнее, что вы хотите сделать, это позволить php обрабатывать такие вещи, как статические HTML-страницы (что он с удовольствием сделает).
Во-вторых, поскольку вы используете php-fpm, я предлагаю быть более агрессивным в отношении того, как долго детям php-fpm разрешено жить. Вам нужно найти место между короткоживущими нитями / детьми и стабильностью. По умолчанию php-fpm слишком велик для любой производственной системы. Чем дольше работнику разрешено обслуживать запросы, тем более нестабильным он станет. Существует также более высокий риск утечек памяти, и если в этой платформе, на которую вы ссылаетесь, есть ошибки, такие как бесконечные циклы, которые могут вызвать у вас горе от загрузки процессора, это не должно повредить.
Я бы уменьшил количество pm.max_requests для ваших производственных пулов. Я думаю, что по умолчанию 200. Я бы начал с 50 и посмотрел, куда это вас приведет.
В противном случае вы также можете попробовать эти глобальные параметры (AFAIK они все отключены по умолчанию):
Что это значит? Если 3 дочерних процесса PHP-FPM завершаются с SIGSEGV или SIGBUS (то есть сбоем) в течение 1 минуты, то PHP-FPM должен перезапуститься автоматически. Дочерние процессы ждут 5 секунд для реакции на сигналы от мастера.
Надеюсь, что эти советы помогут вам! Не забывайте подстраиваться и наблюдать, к сожалению, кажется, что для всего этого не существует практического правила, как вы заметили, слишком много переменных влияют на поведение и стабильность PHP.
Наконец, средство ограничения ресурсов процессора, о котором вы спрашивали, задокументировано здесь , но я бы прибегнул к нему, только если вы исчерпаете все остальные варианты. Если вы выберете этот путь, я определенно буду следить за возможным взаимодействием между настройками PHP-FPM и вашей конфигурацией limit.conf. В этот момент etckeeper может быть спасителем! :)
Я собираюсь попробовать ограничить max_requests завтра - Кажется, что каждый процесс, который мы разрешаем, хочет съесть процессор, так что это может быть хорошей идеей. Мы используем пороги экстренного перезапуска, но мои цифры были немного выше - я попробую ваши и посмотрю, как идут дела. Спасибо за вашу тщательность - очень ценится. Хотите узнать ваши мысли о кешировании? Мне интересно, означает ли использование php-кэширования, что фреймворк должен быть адаптирован для этого. Я довольно новичок в этой концепции.
Вы используете кеширование кода операции, верно?
Раньше это был APC, который использовался здесь, но это было довольно долго, и он был заменен Zend Opcache , который теперь является частью PHP с 5.5 и имеет обратный порт в PECL для 5.3 и 5.4.
Я заинтересован в этом Zend OpCache - мы находимся на 5.3 - Если бы вы могли расширить этот ответ, я был бы очень признателен!
У нас был xcache - но теперь я выбрал Zend Opcache, установил его и подтвердил, что он работает и работает в phpinfo (). Я дам вам знать, если наша производительность лучше, в результате скрещивает пальцы
Мне пришлось отключить zend opcache на данный момент - все работало, за исключением любого файла css или js, созданного динамическим php. Я пытался занести эти файлы в черный список из opcache - но либо черный список не работал, либо я не могу сказать, почему opcache заставляет nginx получить 502 ошибки шлюза ТОЛЬКО для этих файлов. Какие они мне нужны для шаблона, и они являются частью плохой основы. В логах nginx я получил тонны ошибок чтения - ошибка подключения 104-х узлов.
Есть сервер заббикс версии 3.0. Работал всегда исправно. Недавно стал жутко тормозить. Исследования показали, что плодятся процессы php-fpm и жутко грузят систему. Причем отследить какую-то закономерность пока что не удалось.
[23-Jan-2018 14:55:17.187223] DEBUG: pid 8266, fpm_pctl_perform_idle_server_maintenance(), line 379: [pool www] currently 20 active children, 0 spare children, 20 running children. Spawning rate 1
[23-Jan-2018 14:55:18.188435] DEBUG: pid 8266, fpm_pctl_perform_idle_server_maintenance(), line 379: [pool www] currently 20 active children, 0 spare children, 20 running children. Spawning rate 1
[23-Jan-2018 14:55:19.189574] DEBUG: pid 8266, fpm_pctl_perform_idle_server_maintenance(), line 379: [pool www] currently 20 active children, 0 spare children, 20 running children. Spawning rate 1
[23-Jan-2018 14:55:19.304932] WARNING: pid 8266, fpm_request_check_timed_out(), line 271: [pool www] child 9011, script '/usr/share/zabbix/map.php' (request: "GET /map.php") executing too slow (13.250784 sec), logging
[23-Jan-2018 14:55:19.305105] WARNING: pid 8266, fpm_request_check_timed_out(), line 271: [pool www] child 8353, script '/usr/share/zabbix/map.php' (request: "GET /map.php") executing too slow (12.110724 sec), logging
[23-Jan-2018 14:55:19.305144] DEBUG: pid 8266, fpm_got_signal(), line 76: received SIGCHLD
[23-Jan-2018 14:55:19.305169] NOTICE: pid 8266, fpm_children_bury(), line 227: child 8353 stopped for tracing
[23-Jan-2018 14:55:19.305175] NOTICE: pid 8266, fpm_php_trace(), line 144: about to trace 8353
[23-Jan-2018 14:55:19.305548] NOTICE: pid 8266, fpm_php_trace(), line 172: finished trace of 8353
[23-Jan-2018 14:55:19.305563] NOTICE: pid 8266, fpm_children_bury(), line 227: child 9011 stopped for tracing
[23-Jan-2018 14:55:19.305568] NOTICE: pid 8266, fpm_php_trace(), line 144: about to trace 9011
[23-Jan-2018 14:55:19.305729] NOTICE: pid 8266, fpm_php_trace(), line 172: finished trace of 9011
[23-Jan-2018 14:55:19.305742] DEBUG: pid 8266, fpm_got_signal(), line 76: received SIGCHLD
[23-Jan-2018 14:55:19.305748] DEBUG: pid 8266, fpm_event_loop(), line 419: event module triggered 1 events
[23-Jan-2018 14:55:20.190686] DEBUG: pid 8266, fpm_pctl_perform_idle_server_maintenance(), line 379: [pool www] currently 20 active children, 0 spare children, 20 running children. Spawning rate 1
[23-Jan-2018 14:55:32.640866] WARNING: pid 8266, fpm_request_check_timed_out(), line 271: [pool www] child 9040, script '/usr/share/zabbix/map.php' (request: "GET /map.php") executing too slow (13.057358 sec), logging
[23-Jan-2018 14:55:32.641051] DEBUG: pid 8266, fpm_got_signal(), line 76: received SIGCHLD
[23-Jan-2018 14:55:32.641077] NOTICE: pid 8266, fpm_children_bury(), line 227: child 9040 stopped for tracing
[23-Jan-2018 14:55:32.641085] NOTICE: pid 8266, fpm_php_trace(), line 144: about to trace 9040
[23-Jan-2018 14:55:32.641415] NOTICE: pid 8266, fpm_php_trace(), line 172: finished trace of 9040
[23-Jan-2018 14:55:32.641428] DEBUG: pid 8266, fpm_event_loop(), line 419: event module triggered 1 events
[23-Jan-2018 14:55:33.205565] DEBUG: pid 8266, fpm_pctl_perform_idle_server_maintenance(), line 379: [pool www] currently 20 active children, 0 spare children, 20 running children. Spawning rate 1
[23-Jan-2018 14:55:39.211917] DEBUG: pid 8266, fpm_pctl_perform_idle_server_maintenance(), line 379: [pool www] currently 20 active children, 0 spare children, 20 running children. Spawning rate 1
[23-Jan-2018 14:55:39.308203] WARNING: pid 8266, fpm_request_check_timed_out(), line 271: [pool www] child 8969, script '/usr/share/zabbix/map.php' (request: "GET /map.php") executing too slow (10.989382 sec), logging
[23-Jan-2018 14:55:39.308357] DEBUG: pid 8266, fpm_got_signal(), line 76: received SIGCHLD
[23-Jan-2018 14:55:39.308381] NOTICE: pid 8266, fpm_children_bury(), line 227: child 8969 stopped for tracing
[23-Jan-2018 14:55:39.308388] NOTICE: pid 8266, fpm_php_trace(), line 144: about to trace 8969
[23-Jan-2018 14:55:39.308678] NOTICE: pid 8266, fpm_php_trace(), line 172: finished trace of 8969
[23-Jan-2018 14:55:39.308691] DEBUG: pid 8266, fpm_event_loop(), line 419: event module triggered 1 events
[23-Jan-2018 14:55:40.213576] DEBUG: pid 8266, fpm_pctl_perform_idle_server_maintenance(), line 379: [pool www] currently 20 active children, 0 spare children, 20 running children. Spawning rate 1
[23-Jan-2018 14:57:09.329814] [pool www] pid 9040
script_filename = /usr/share/zabbix/map.php
[0x00007fe2fed799e0] get() /usr/share/zabbix/include/classes/api/services/CMap.php:256
[0x00007ffe350accc0] get() unknown:0
[0x00007fe2fed78f48] call_user_func_array() /usr/share/zabbix/include/classes/api/clients/CLocalApiClient.php:123
[0x00007fe2fed78d20] callMethod() /usr/share/zabbix/include/classes/api/wrappers/CFrontendApiWrapper.php:97
[0x00007fe2fed78c18] callClientMethod() /usr/share/zabbix/include/classes/api/wrappers/CApiWrapper.php:94
[0x00007fe2fed787e0] callMethod() /usr/share/zabbix/include/classes/api/wrappers/CFrontendApiWrapper.php:63
[0x00007fe2fed786b8] callMethod() /usr/share/zabbix/include/classes/api/wrappers/CApiWrapper.php:82
[0x00007ffe350acfc0] __call() unknown:0
[0x00007fe2fed77520] get() /usr/share/zabbix/include/maps.inc.php:366
[0x00007fe2fed75490] add_elementNames() /usr/share/zabbix/map.php:105
[23-Jan-2018 14:57:19.325910] [pool www] pid 8996
script_filename = /usr/share/zabbix/map.php
[0x00007fe2fed799a0] get() /usr/share/zabbix/include/classes/api/services/CMap.php:261
[0x00007ffe350accc0] get() unknown:0
[0x00007fe2fed78f08] call_user_func_array() /usr/share/zabbix/include/classes/api/clients/CLocalApiClient.php:123
[0x00007fe2fed78ce0] callMethod() /usr/share/zabbix/include/classes/api/wrappers/CFrontendApiWrapper.php:97
[0x00007fe2fed78bd8] callClientMethod() /usr/share/zabbix/include/classes/api/wrappers/CApiWrapper.php:94
[0x00007fe2fed787a0] callMethod() /usr/share/zabbix/include/classes/api/wrappers/CFrontendApiWrapper.php:63
[0x00007fe2fed78678] callMethod() /usr/share/zabbix/include/classes/api/wrappers/CApiWrapper.php:82
[0x00007ffe350acfc0] __call() unknown:0
[0x00007fe2fed774e0] get() /usr/share/zabbix/include/maps.inc.php:366
Несколько дней назад заметил, что сайт стал очень сильно тормозить, загрузка одной страницы до 10 секунд, хотя раньше было не более двух, сайт Wordpress, работает на VPS CentOS 7 (2 Гб ОЗУ, 4 CPU x 2,2 Ghz) с Nginx + PHP-FPM. Поиск медленных скриптов через slow.log ничего не дал, часто попадает в лог файл index.php (выполняется более 5 секунд). Увеличение мощности сервера на одно ядро тоже. Кэширование включено через плагин W3 Total Cache, страницы кэшируются на диск, а база данных и объекты wordpress в memcached. Посещаемость до 15к уникальных пользователей в сутки. Пытался отсеять ботов с помощью модуля nginx testcookie, отсеиваются только боты поисковых систем, но да, тогда нагрузка падает, правда это не вариант. Да и директива Crawl-daily в robots.txt есть. Если W3TC отключить, PHP вообще падает по 502, а страницы начинают загружаться не быстрее, чем за 40-50 секунд. Что со всем этим можно сделать? Ниже конфигурационные файлы и статистика:
Глобальный конфиг Nginx:
Вообще мне кажется, что проблема или в вордпрессе, или в mysql.
Я, конечно, посоветую вам сделать nginx вот так:
а для fpm что-то подобное:
Но вряд ли это вас спасет. В момент провисаний запросов попробуйте в top половить особо жрущие процессы. Если там mysql расплодился - опять же, во время провисания смотрите show processlist и смотрите, какой запрос повис. И пройдитесь mysqltuner'ом по базе.
Но вообще вот только что попинал сайт - какие-то страницы работают нормально, какие-то нет.
slow-log в студию
Хм, спасибо. Настройки Nginx похоже помогли чуть, судя по pingdom время ожидания ответа от Nginx уменьшилось с 400 до 200 мс, но с PHP ничего не изменилось, к сожалению.
Лог есть, да только там ничего нет полезного:
Отключил плагин redirection, лог больше не пополняется так интенсивно, но ситуация не улучшилась.
И заодно конфиг fpm (который основной, а не ваш пул)
и совсем до кучи - strace -cp по любому процессу fpm
l0stparadise ★★★★★ ( 10.07.17 16:27:55 )
Последнее исправление: l0stparadise 10.07.17 16:31:21 (всего исправлений: 2)
Там иногда SIGSEGV бывают, а так конечно /var/log/nginx *error_log*
Проверьте, какие расширения грузятся + включено ли кэширование байт-кода
Меня смущают вот эти три строчки минимум. ХЗ что вам посоветовать. В идеале strace'ом ловить, какие файлы пытается читать fpm и решать проблему с ними, но тут с вашей нагрузкой задача та еще.
Но если тыкать пальцем в небо - предположений у меня два.
Первое - это что-то, работающее через open_basedir. В конфигах ничего подобного вроде нет, но вы можете создать файлик с кодом
, открыть через браузер и посмотреть, есть ли там такая переменная. Если есть - жестко отключите ее (или в php.ini, или в конфиге fpm для вашего пула - второй вариант лучше). Ну или ищите, откуда она тянется.
Второе - у вас php-сессии хранятся файлами. Попробуйте завернусь php-сессии в memcached (вроде я его видел у вас на скрине) или в redis. Вряд ли это даст какой-то значимый эффект, но может и получится.
Покажи, сколько занимают каталоги с кешем Покажи, сколько записей в таблицах с кешем в базе данных Можешь отсортировать записи из mysql slow_log по времени выполнения?
мож сессии надо в мемкашу тоже засунуть. надо посмотреть на waitы при большой загрузке.
у нас есть писанинка, которая лочит файлы сессий и на 50 клиентах -) так что надо проверять.
Так движок ведь известен - wordpress, у него такой проблемы нет. Я практически уверен, что причина в брутфорсе админки.
Значение open_basedir - no value. Так понимаю, что она отключена, завтра еще попробую сессии PHP добавить в memcached.
Я вот думаю, допустим это даже поисковики, они же не будут писать комментарии, рыть поиск и т д. Они запрашивают обычные страницы. Им должна отдаваться статика (кэширование включено), а значит никакой нагрузки на PHP быть не должно. А она есть. Есть ли какой-нибудь инструмент, чтобы посмотреть при такой нагрузке что, кто и где делает, например, анализатор логов access.log? Как понять откуда та нагрузка?
Пытался закрыть доступ к wp-admin, но сейчас вечер, нагрузка немного упала
Не вижу связи.
Переименуй хотя бы wp-login.php.
А второе, что надо смотреть - это iotop/iostat. Хостишься на своем сервере или вдс?
fgrep -c 'wp-login.php'
Папка с кєшем от w3tc занимает 68 мегабайт, в memcached занято около 19 мб, если я правильно понял:
access.log анализировать можно(и нужно) с помощью стандартного набора из cat,tail,awk,sort и uniq.
С помощью конвеера из данных команд с нужными параметрами вы можете получить статистику по количеству запросов к тому или иному URL, статистику по количеству запросов для каждого или наиболее активных IP и т.п.
Но, как правило, одних логов в подобной ситуации не достаточно, что-бы понять почему именно длительное время висят запросы к скриптам сайта нужен strace одного из нагруженных обработчиков php-fpm.
Просто найдите обработчик php создающий наибольшую нагрузку(ps и atop), а потом трейсите по pid процесса. Трейсить лучше с опцией -o в файл, так как данных при вашей посещаемости будет скоре всего немало, затем нужно просто поискать места, где возникают Timeout, множественные ошибки доступа к файлам, или мелькают очень часто повторяющиеся идентичные блоки из набора определённых системных вызовов(такое бывает, если в результате логической ошибки код в скриптах где-то зациклен).
lucentcode ★★★★★ ( 10.07.17 22:57:08 )
Последнее исправление: lucentcode 10.07.17 22:57:54 (всего исправлений: 1)
И еще неплохо было бы написать, с чего все началось. Были ли тормоза изначально, или появились недавно? Какие то изменения может были?
Да, есть брут, но там не очень активно. Идет четыре попытки с одного IP, потом IP меняется, видимо попадает в бан wordpress. Интервал между сериями в несколько минут. Попробую закрыть и посмотрю что будет. Спасибо!
Раньше все работало отлично, если брать тот же pingdom, то сайт загружался за плюс минус две секунды. Ничего не менялось. Буквально три дня назад нагрузка начала расти и вот до сих пор.
Ну если ничего не менялось, то можно рассмотреть вариант с хостером: например диски начали тормозить.
Глянь iotop/iostat.
Значит пропускаем.
Тут видишь какое дело: если бы это например различные боты долбили страницы, то тормозить не должно - у тебя же все закешировано в статику.
Если бы проблема была с mysql - то в топе бы висел мускул, а не php-fpm.
Ну и хоть это не сильно поможет, но все равно - php7 с включенным opcache же юзаешь, разумеется?
Может какой-то вордпрес плагин заглючил, попробуй повыключать и посмотреть на результаты.
Использую php5 из официальных репозиториев и без opcache.
нет ли особо жирного контента ?
php-fpm может подвисать при ресайзе жирных картинок, например.
Надо обязательно переехать на 7, но это не отменяет того вопроса, что раньше не тормозило а теперь начало :) Конкретно wp чуть ли не в 2 раза быстрее работает на 7, по сравнению с 5. Ну это так, оффтоп.
xtraeft ★★☆☆ ( 11.07.17 00:42:32 )
Последнее исправление: xtraeft 11.07.17 00:43:17 (всего исправлений: 1)
Медиафайлы есть, но насколько я знаю wordpress их обрабатывает во время загрузки, а пользователям отдает уже статику.
Погуглите «fail2ban wordpress». Скрипт будет сканить логи на предмет login failed и банить эти ipшники с помощью iptables на промежуток времени, который вы сами зададите. Скажем, пять попыток с одного ip за сутки - неделя бана. Таким образом запросы с брутящих адресов не будут доходить до php.
Плюсую этого господина. Можно для верности на время оставить один обработчик php-fpm, запустить стрейс (-ff -ttt -T), выполнить тормозящий запрос, дождаться его завершения, остановить стрейс и рестартовать fpm с нормальными настройками. А потом смотреть где тормозит php
Так там же не с одного ип брутят, а ботнетами. Размораживайся :)
Оптимальное решение - ограничить доступ всем ip кроме своего.
Да это понятно. Но я не думаю, что там с каждого ip всего по одному запросу, поэтому какую-то часть он отрежет. Не настолько крупный сайт, чтобы какой-то более изощренный ботнет на несколько дней натравлять.
Но вообще да, резануть доступ к wp-login для всех вообще - решение интереснее :)
Не настолько крупный сайт, чтобы какой-то более изощренный ботнет на несколько дней натравлять.
Это не так работает, конкретно на какие-то сайты никто ничего не направляет: берется большой список доменов и чекается, это ж бизнес.
Но я не думаю, что там с каждого ip всего по одному запросу
Чаще всего именно так.
Запросы на wp-login все еще есть, но теперь та страница закрыта аутентификацией Nginx. Теперь они php трудностей не составляют, нагрузка на процессор от php упала. Всем спасибо. Возможно действительно только в этом было дело. Вот даже сейчас есть:
Но вообще очень странно, что запросы на одну страницу смогли так уложить сайт.
Мда, школьничек какой-то с одного ip брутит :)
т.е. можно было простым логическим путем (методом исключения) выяснить причину, тем самым сузив интервал поиска в разы: отключить или как-то по иному закрыть доступ к внешней сети .
since yesterday after a update, I have some problems with my nextcloud.
My system hangs if I navigate to index.php/apps/activity/ and nextcloud beginns to create thumbs.
Raspberry Pi 3 / NextcloudPi 12.0.2
The text was updated successfully, but these errors were encountered:
Dynamic
- Spawns new processes when traffic load increases.
- Spawning processes will put some load on the CPU.
- Frees up memory that can be used by other services when traffic is low.
nachoparker commented Aug 24, 2017 •
nice, I didn't know that one ;)
Would you be willing to retest this with only pm.max_children = 3 and the other parameters unmodified, and report if it works well for you ?
If it does, we can introduce it by default in the configuration, or, if you are feeling brave, you can submit a PR with this ;)
ttoopp commented Aug 24, 2017
Okay, I put some new pics (50 a 10 MB) on my nextcloud. Change the conf to
restart php7.0-fpm.service, open the folder with the pics in my browser and check the load.
After 10 seconds (load over 37) I get no reaction (ssh and web) from the Pi and have to wait few minutes until I can work again.
For me is pm.max-_childern = 3 the better solution :) everyone has to decide for themselves ;)
I'm trying to get more information on how PHP children work. I can't find any documentation, blog or anything which would give general answers. I was wondering if you could help me out.
Does one PHP worker equal to one CPU core? I mean having 64 workers on a 32 core VM is unnecessary since they can only use a maximum of 32 cores?
What does a request include (pm.max_requests)? An Nginx request like "index.php"?
When I check PHP status and see "active processes", what's that? Is that one request? One PHP function? A call to a MySQL DB? A PHP worker?
How does PHP handle the Nginx requests coming in regarding workers? I mean on a high level. Is there a queue? Does it depend on the functions, extensions in the PHP file? For example, having 2 PHP children and opening one "index.php" every second when the processing time is .9 seconds. What happens?
When does FPM log lines like the one below? When all the workers have stuff to do or when there's a request which can't be fulfilled since all workers are busy? As you see my questions above, I don't know how the requests(one dynamic file)->manual functions (calculate_cart_items_shipping_cost())->PHP functions(round(3.14159)) work in this regard.
WARNING: [pool www] server reached pm.max_children setting (5), consider raising it.
ttoopp commented Aug 24, 2017
ttoopp commented Aug 24, 2017
Okay I think I found the issue. When nextcloud begin creating the preview thumbs for the website, the php-fpm7.0 services crash my Pi. There was 100 pics with each 10 MB, so the Pi need many power for creating the thumbs.
5 processes are to much for he Pi
ttoopp commented Aug 24, 2017
Do you have the other original values? I have overwritten the original :)
endrureza commented Jun 10, 2019
is it not better to set pm as static for high traffic web ? i mean, use dynamic will be getting confused to the setting. Cause of the adjustment of pm.max_children , pm.start_servers, pm.min_spare_servers and pm.max_spare_servers.
holmberd commented Apr 12, 2019 •
@Yv-o-rL one php-fpm child process handles one request.
WARNING: [pool www] server reached pm.max_children setting (5), consider raising it.
The warning means that you are hitting the upper limit of how many requests you can handle with your current configuration. The request will be queued until a worker becomes available to handle the request. Reason for this is that your pm.max_children is set too low, i.e. you have more requests than the number of workers can handle.
endrureza commented Jan 19, 2020
i have a dedicated server which have 128 gb of ram and xeon processor with 1gbps bandwidth. I have installed centminmod on my server but the issue I am facing is that when my traffic raise to 3000 realtime the server stop responding.
What I am looking for what will be the configuration of php-fpm so it can handle 10000 realtime users
My configuration is this`global]
; Log level
; Possible Values: alert, error, warning, notice, debug
; Default Value: notice
log_level = warning
pid = /var/run/php-fpm/php-fpm.pid
error_log = /var/log/php-fpm/www-error.log
emergency_restart_threshold = 10
emergency_restart_interval = 1m
process_control_timeout = 10s
include=/usr/local/nginx/conf/phpfpmd/*.conf[www]
user = nginx
group = nginxlisten = 127.0.0.1:9000
listen.allowed_clients = 127.0.0.1
listen.backlog = 65535;listen = /tmp/php5-fpm.sock
listen.owner = nginx
listen.group = nginx
listen.mode = 0660pm = static
pm.max_children = 3072
; Default Value: min_spare_servers + (max_spare_servers - min_spare_servers) / 2
pm.start_servers = 100
pm.min_spare_servers = 10000
pm.max_spare_servers = 15000
pm.max_requests = 10000; PHP 5.3.9 setting
; The number of seconds after which an idle process will be killed.
; Note: Used only when pm is set to 'ondemand'
; Default Value: 10s
pm.process_idle_timeout = 10s;rlimit_files = 65536
rlimit_core = 0; The timeout for serving a single request after which the worker process will
; be killed. This option should be used when the 'max_execution_time' ini option
; does not stop script execution for some reason. A value of '0' means 'off'.
; Available units: s(econds)(default), m(inutes), h(ours), or d(ays)
; Default Value: 0
;request_terminate_timeout = 0
; Default Value: 0
;request_slowlog_timeout = 0
slowlog = /var/log/php-fpm/www-slow.logpm.status_path = /phpstatus
ping.path = /phpping
ping.response = pong; Limits the extensions of the main script FPM will allow to parse. This can
; prevent configuration mistakes on the web server side. You should only limit
; FPM to .php extensions to prevent malicious users to use other extensions to
; exectute php code.
; Note: set an empty value to allow all extensions.
; Default Value: .php
security.limit_extensions = .php; catch_workers_output = yes
php_admin_value[error_log] = /var/log/php-fpm/www-php.error.log
php_admin_value[disable_functions] = shell_exec.
`
your ram is quite high, what about your cpu ? as for my problem, it has nothing to do with ram, it's the cpu. and i kinda solve this one not only from setting the php setting, but also using horizontal scaling (ex: load balancer)
nachoparker commented Aug 24, 2017
Yes, I have read before in the NC forums that the thumbnail generation brings the whole pi down. They recommend to disable the pics app IIRC.
Maybe we should disable it by default?
Good info! I'll play with those parameters ;)
synetalsolutions commented Jan 18, 2020
i have a dedicated server which have 128 gb of ram and xeon processor with 1gbps bandwidth. I have installed centminmod on my server but the issue I am facing is that when my traffic raise to 3000 realtime the server stop responding.
What I am looking for what will be the configuration of php-fpm so it can handle 10000 realtime users
My configuration is this
`global]
; Log level
; Possible Values: alert, error, warning, notice, debug
; Default Value: notice
log_level = warning
pid = /var/run/php-fpm/php-fpm.pid
error_log = /var/log/php-fpm/www-error.log
emergency_restart_threshold = 10
emergency_restart_interval = 1m
process_control_timeout = 10s
include=/usr/local/nginx/conf/phpfpmd/*.conf
[www]
user = nginx
group = nginx
listen = 127.0.0.1:9000
listen.allowed_clients = 127.0.0.1
listen.backlog = 65535
;listen = /tmp/php5-fpm.sock
listen.owner = nginx
listen.group = nginx
listen.mode = 0660
pm = static
pm.max_children = 3072
; Default Value: min_spare_servers + (max_spare_servers - min_spare_servers) / 2
pm.start_servers = 100
pm.min_spare_servers = 10000
pm.max_spare_servers = 15000
pm.max_requests = 10000
; PHP 5.3.9 setting
; The number of seconds after which an idle process will be killed.
; Note: Used only when pm is set to 'ondemand'
; Default Value: 10s
pm.process_idle_timeout = 10s;
rlimit_files = 65536
rlimit_core = 0
; The timeout for serving a single request after which the worker process will
; be killed. This option should be used when the 'max_execution_time' ini option
; does not stop script execution for some reason. A value of '0' means 'off'.
; Available units: s(econds)(default), m(inutes), h(ours), or d(ays)
; Default Value: 0
;request_terminate_timeout = 0
; Default Value: 0
;request_slowlog_timeout = 0
slowlog = /var/log/php-fpm/www-slow.log
pm.status_path = /phpstatus
ping.path = /phpping
ping.response = pong
; Limits the extensions of the main script FPM will allow to parse. This can
; prevent configuration mistakes on the web server side. You should only limit
; FPM to .php extensions to prevent malicious users to use other extensions to
; exectute php code.
; Note: set an empty value to allow all extensions.
; Default Value: .php
security.limit_extensions = .php
; catch_workers_output = yes
php_admin_value[error_log] = /var/log/php-fpm/www-php.error.log
php_admin_value[disable_functions] = shell_exec.
`
nachoparker commented Aug 24, 2017
Do you think this parameter is really important? I suspect that we can leave this off.
Also another question, once you reduced the number of children, did the thumbnail generation work while not hogging the whole system?
Static
- Each process sits in memory at all times, how much memory is consumed will vary for each server.
- CPU experiences less load spikes when traffic spikes; since there is no overhead in spawning new processes.
ttoopp commented Aug 24, 2017
Okay I think I found the issue. When nextcloud begin creating the preview thumbs for the website, the php-fpm7.0 services crash my Pi. There was 100 pics with each 10 MB, so the Pi need many power for creating the thumbs.
5 processes are to much for he Pi
nachoparker commented Aug 24, 2017
The rest are the same
holmberd commented Jun 10, 2019
@endrureza neither is better than the other. Each one can have a better fit for a particular use-case, and it's up to the developer of that system to consider the trade-offs.
Читайте также: