У меня есть ситуация, в которой происходит следующее:
Мы находимся на линоде с 8-ядерным, 8 ГБ оперативной памяти, 2,6 ГГц - используя nginx + php-fpm - мы получаем очень высокие графики использования процессора (которые мы не хотим быть такими плохими соседями VPS) ...
У нас на сайте одновременно меньше 100 пользователей - поэтому эта ситуация также невероятно смущает - что наш процессор очень высок.
Мы используем очень неизвестный, возможно, интенсивно работающий с php, сомнительно ужасный Framework вместо хорошо известных, хорошо документированных, хорошо продуманных других сред, таких как WordPress или Drupal, в которых есть много документации о кэшировании (а также плагины который обрабатывает кеширование) php на платформе nginx + php_fpm.
Таким образом, у нас есть около 6 открытых процессов php-fpm, которые при запуске запускают по отдельности БОЛЬШОЕ (30+ и часто около 99%) количество процессоров - и я не имею ни малейшего представления, как помешать им использовать столько процессоров , Я не могу сказать, какие php-скрипты вызывают эти всплески, потому что они происходят постоянно ... обычно работает только 1 или 2, но когда все 6 запускаются, мы максимизируем все 8 процессоров.
Мой файл pool.d / www.conf имеет следующие настройки:
pm = dynamic pm.max_children = 10 pm.start_servers = 4 pm.min_spare_servers = 2 pm.max_spare_servers = 6
Мы выполнили эту настройку, потому что, как я понимаю, наша память на самом деле потрясающая (htop показывает 472/7000 + мегабайт, без подкачки и т. Д.), И мы могли бы обрабатывать гораздо больше процессов и разбивать строку в ожидании получения обработанный - НО, к сожалению, поскольку каждый процесс слишком интенсивен на нашем процессоре во время работы - мы в конечном итоге загоняем наш процессор через крышу - поэтому мы не можем обрабатывать достаточное количество процессов.
Вопрос в том, что мы можем сделать, чтобы уменьшить использование процессора процессами php-fpm, чтобы мы могли увеличить настройки в этом конфигурационном файле пула для php-fpm, а также да, /var/log/php5-fpm.log кричит на нас, чтобы увеличить наших детей и настроить / увеличить наши минимальные / максимальные / стартовые серверы. Но это делает нашу нагрузку в среднем сумасшедшей, как говорилось ранее. Как мы можем сделать это без необходимости использовать кеш или каковы наши варианты?
Моя идея? Я читал кое-что об использовании cpulimit, чтобы гарантировать, что ни один процесс не займет больше, чем выделенное количество процессоров - но разве это замедлит процесс, чтобы его нельзя было использовать? Или, таким образом, мы могли бы увеличить нашу способность запускать больше, чем несколько процессов - я также подумал о запуске двух пулов - один для нашего сайта, ориентированного на будущее (на который обращаются клиенты), и другой для бэкенда (который влияет на наш сайт, ориентированный на будущее, когда время -отчетные отчеты запускаются).
Я потратил несколько дней на исследования, поиск в Google и т. Д. По этой теме - и это трудно, потому что ситуация каждого человека настолько уникальна для их системы - проблема в том, что такая специфическая неслыханная, возможно, плохо написанная - структура - делает трудно найти решение. Мы пока не можем просто отказаться от этой структуры - мне нужно найти какое-то решение.
ОБНОВЛЕНИЕ: я реализовал memcache для хранения php-сессий - потому что фреймворк в значительной степени зависит от пользовательских сессий, а природа нашей системы такова, что сотрудники часто используют несколько вкладок одновременно - каждая из них возвращается к сессиям для подтверждения способностей / пользовательских данных / и т. Д. ... так что я надеюсь увидеть некоторое увеличение производительности от этого - пожалуйста, прокомментируйте это, если хотите, - я посмотрю, как это будет завтра, когда мы преодолеем наши пиковые периоды увеличения объема.
Ответы:
Несколько вещей для рассмотрения (заранее извиняюсь, если вы уже рассмотрели это): Прежде всего, убедитесь, что вы оптимизировали конфигурацию 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 секунд для реакции на сигналы от мастера.
Вот хороший обзор всех параметров конфигурации, которые я упомянул здесь, а также других: http://myjeeva.com/php-fpm-configuration-101.html
Надеюсь, что эти советы помогут вам! Не забывайте подстраиваться и наблюдать, к сожалению, кажется, что для всего этого не существует практического правила, как вы заметили, слишком много переменных влияют на поведение и стабильность PHP.
Наконец, средство ограничения ресурсов процессора, о котором вы спрашивали, задокументировано здесь , но я бы прибегнул к нему, только если вы исчерпаете все остальные варианты. Если вы выберете этот путь, я определенно буду следить за возможным взаимодействием между настройками PHP-FPM и вашей конфигурацией limit.conf. В этот момент etckeeper может быть спасителем! :)
Удачи!
Rouben
источник
Вы используете кеширование кода операции, верно?
Раньше это был APC, который использовался здесь, но это было довольно долго, и он был заменен Zend Opcache , который теперь является частью PHP с 5.5 и имеет обратный порт в PECL для 5.3 и 5.4.
источник