Почему на моем сервере открыто множество PHP-процессов?

Почему на моем сервере открыто множество PHP-процессов?

Сегодня я увидел, что мой сайт не работает, поэтому я подключился по ssh к серверу и выполнил ps -eF. Я вижу около 200 процессов PHP, которые работают уже 4 часа.

Apache собран с использованием mpm event и mod fcgid.

Я завершил все процессы PHP, и теперь все работает нормально. Почему это происходит? Это ожидаемое поведение?

Я не совсем понимаю, как Apache отслеживает количество PHP-процессов и их идентификаторы, поэтому было бы неплохо, если бы кто-нибудь дал ссылку, когда я смогу почитать об этом.

Также я использовал команду "ab" (Apache Benchmark), чтобы проверить, происходит ли это все время, поэтому я запустил ее около 4-5 раз подряд с 30 одновременными запросами, и снова было запущено около 150 процессов PHP, когда я продолжаю запускать "ab", теперь она не порождает больше процессов, и веб-сайт все еще работает. Чтобы было ясно, 4-5 раз, когда я выполнял "ab", не были одним и тем же временем, как только один процесс "ab" завершался, я запускал другой, но каждый раз, когда я выполнял "ab", я делал 30 одновременных запросов.

Пожалуйста, пролейте свет на это! Спасибо :)

решение1

Да, это ожидаемое поведение. Похоже, у вас одновременно запущено 5 копий ab. Это привело к тому, что ваши 150 процессов PHP обрабатывали 30 запросов для каждого из ваших 5 процессов ab.

Apache работает лучше всего, когда все его потоки могут работать в памяти. Будет нагрузка, при которой потоки необходимо будет выгрузить на диск. Время отклика быстро ухудшится, когда это произойдет. Уничтожение процессов, как вы это сделали, повысит производительность. Производительность сервера может ухудшиться в этом случае. Если максимальное количество потоков настроено слишком высоко, относительно легко выполнить DOS (отказ в обслуживании), используя это поведение.

Другая причина, по которой вы можете столкнуться с проблемами, — это если два процесса блокируются на двух ресурсах. Если другим процессам нужен какой-либо из этих ресурсов, они могут не ответить. Apache ограничит количество процессов, созданных в этом случае. Завершение любого из заблокированных процессов должно устранить проблему. В зависимости от обычного порядка блокировки может потребоваться завершение определенного процесса для предотвращения повторной блокировки. Это окажет незначительное или вообще не окажет влияния на производительность сервера.

Ошибки программирования также могут привести к зависанию потоков. Это может привести к зависанию тедов, как вы видели. Найти, что произошло, сложно постфактум, но содержимое журналов вашего сервера Apache может помочь. Проверьте журнал ошибок на наличие проблем. Журнал доступа может содержать записи для запросов, которые зависли примерно в то время, когда вы завершили процессы.

Apache должен завершить некоторые процессы, если они не используются в течение определенного периода времени. Это контролируется параметром MaxSpareThreads. Проверьте ваш файл управления, в котором должны быть некоторые комментарии о параметрах для потоков, серверов и клиентов. Значения по умолчанию обычно хороши.

Если есть проблемы с кодом, MaxRequestsPerChildчасто помогает установка значения в диапазоне от 5000 до 100. Чем меньше число, тем чаще нужно создавать новые потоки и тем сложнее серверу Apache работать.

EDIT: Apache откроет несколько потоков при запуске. Это зависит от взаимодействия нескольких параметров. См.Документация по конфигурации MPMдля получения подробной информации о параметрах. Это не зависит от загрузки сервера и обычно является минимальным числом потоков, которые работающий сервер будет поддерживать.

Связанный контент