Назад | Перейти на главную страницу

Nginx + php-fpm - Каждый процесс php-fpm 70-100% процессора при запуске

У меня ситуация, при которой происходит следующее:


ОБНОВЛЕНИЕ: я реализовал memcache для хранения сеансов php - потому что фреймворк сильно зависит от пользовательских сеансов, а природа нашей системы такова, что сотрудники часто используют несколько вкладок одновременно - каждая проверяет сеансы, чтобы подтвердить способности / данные пользователя / и т. ... так что я надеюсь увидеть некоторое увеличение производительности от этого - добро пожаловать, прокомментируйте это, если хотите - я посмотрю, как это пойдет завтра, когда мы пройдем через наши пиковые времена с большим объемом.

Пара вещей, которые следует учитывать (заранее извиняюсь, если вы уже это учли): Прежде всего, убедитесь, что вы оптимизировали конфигурацию nginx и вызывайте php-fpm только в случае крайней необходимости. Последнее, что вы хотите сделать, - это позволить php обрабатывать такие вещи, как статические HTML-страницы (что он с радостью сделает).

Во-вторых, поскольку вы используете php-fpm, я предлагаю более агрессивно подходить к вопросу о том, как долго дети php-fpm могут жить. Вам нужно найти золотую середину между недолговечными потоками / дочерними элементами и стабильностью. ИМХО, значения по умолчанию php-fpm слишком щедры для любой производственной системы. Чем дольше воркеру разрешено обслуживать запросы, тем более нестабильным он будет. Также существует более высокий риск утечки памяти, и если эта структура, на которую вы ссылаетесь, имеет ошибки, такие как бесконечные циклы, которые могут вызывать у вас проблемы с загрузкой процессора, это не должно повредить.

Я бы уменьшил количество для pm.max_requests для ваших производственных бассейнов. Я думаю, что по умолчанию 200. Я бы начал с 50 и посмотрел, к чему это приведет.

В случае неудачи / дополнения к этому вы также можете попробовать эти глобальные параметры (AFAIK все они отключены по умолчанию):

emergency_restart_threshold 3
emergency_restart_interval 1m
process_control_timeout 5s

Что это значит? Если 3 дочерних процесса PHP-FPM завершаются с SIGSEGV или SIGBUS (т.е. сбой) в течение 1 минуты, предполагается, что PHP-FPM перезапустится автоматически. Дочерние процессы ждут 5 секунд реакции на сигналы от мастера.

Вот хороший обзор всех параметров конфигурации, которые я упомянул здесь, а также других: http://myjeeva.com/php-fpm-configuration-101.html

Надеюсь, эти советы вам помогут! Не забудьте настроить и наблюдать, к сожалению, для всего этого нет практического правила, как вы заметили, существует слишком много переменных, которые влияют на поведение и стабильность PHP.

Наконец, задокументировано средство ограничения ЦП, о котором вы спрашивали. Вот, но я прибегу к нему только в том случае, если вы исчерпаете все остальные варианты. Если вы выберете этот путь, я определенно буду следить за возможным взаимодействием между настройками PHP-FPM и вашей конфигурацией limits.conf. В таком случае etckeeper может быть палочкой-выручалочкой! :)

Удачи!

Рубен

Вы ведь используете кеширование кода операции?

Раньше здесь использовался APC, но он долгое время был ошибочным, и был заменен на Zend Opcache, который теперь является частью PHP, начиная с версии 5.5, и имеет обратный порт в PECL для версий 5.3 и 5.4.