Вопрос или проблема
Я не разработчик php и не знаю, как настроить сервер, но у меня есть такая проблема. В статистике RAM и процессора на моем сервере отображаются некоторые слайды (CPU https://disk.yandex.ru/i/BvtYfNCUGmAb1A и RAM https://disk.yandex.ru/i/WgSEYqJKU0gZFg). На сервере работают 4 приложения, 2 php и 2 js, и у него 8 ядер и 16 ГБ оперативной памяти.
В php-журналах есть такие строки:
WARNING: [pool web] кажется, занят (вам может потребоваться увеличить pm.start_servers или pm.min/max_spare_servers), порождая 8 дочерних процессов, 10 в бездействии и всего 31 дочерний процесс
WARNING: [pool web] кажется, занят (вам может потребоваться увеличить pm.start_servers или pm.min/max_spare_servers), порождая 32 дочерних процесса, 0 в бездействии и всего 53 дочерних процесса
WARNING: [pool web] сервер достиг настройки pm.max_children (64), рассмотрите возможность повышения
Иногда бывают такие:
NOTICE: Завершение ...
NOTICE: выходим, до свидания!
NOTICE: fpm работает, pid 4182079
NOTICE: готов к обработке соединений
NOTICE: интервал мониторинга systemd установлен на 10000ms
ps -ylC php-fpm --sort:rss
S UID PID PPID C PRI NI RSS SZ WCHAN TTY TIME CMD
S 0 1623 1532 0 80 0 22332 20315 ep_pol ? 00:00:02 php-fpm
S 33 224785 1623 0 80 0 32404 24662 inet_c ? 00:00:03 php-fpm
S 33 2094 1623 0 80 0 33164 25185 inet_c ? 00:00:03 php-fpm
S 33 2093 1623 0 80 0 34428 25171 inet_c ? 00:00:04 php-fpm
free -hl
total used free shared buff/cache available
Mem: 15Gi 7.1Gi 2.2Gi 83Mi 6.5Gi 8.3Gi
Low: 15Gi 13Gi 2.2Gi
High: 0B 0B 0B
Swap: 4.0Gi 8.0Mi 4.0Gi
Текущие настройки pm
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
Возможно, эту проблему можно решить, настроив pm max_children, start_servers, min_spare_servers, max_spare_servers, но я боюсь сделать это хуже.
Если я сделаю эти настройки:
pm.max_children = 6
pm.start_servers = количество ядер процессора х 4
pm.min_spare_servers = количество ядер процессора х 2
pm.max_spare_servers = количество ядер процессора х 4
Могу ли я все сломать?
Ответ или решение
Конфигурация PHP-FPM на сервере: пошаговое руководство
При конфигурации PHP-FPM (PHP FastCGI Process Manager) важно правильно настроить параметры управления процессами, чтобы обеспечить эффективность работы ваших приложений и оптимизацию использования ресурсов сервера. В вашем случае сервер имеет 8 ядер процессоров и 16 ГБ оперативной памяти, а также запускает 4 приложения (2 на PHP и 2 на JavaScript). Ниже мы рассмотрим, как правильно подойти к настройке.
Анализ текущей конфигурации
На основе предоставленных вами логов и текущих настроек PHP-FPM, можно сделать выводы о том, что текущая конфигурация не соответствует нагрузке, которую испытывает сервер.
Ваши настройки:
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
На данный момент pm.max_children
установлен на 5, что явно недостаточно, поскольку в логах указано, что сервер достигает этого лимита и не может обрабатывать дополнительные запросы. Это ведет к замедлению работы приложений и потенциальным сбоям при высоких нагрузках.
Рекомендации по настройке
Для оптимизации параметров управления процессами вам потребуется изменить конфигурацию следующим образом:
-
pm.max_children: это максимальное количество процессов, которые могут быть созданы. Рекомендуется установить это значение с учетом доступной оперативной памяти. Обычно, чтобы оценить количество процессов, можно использовать следующую формулу:
[
\text{pm.max_children} = \frac{\text{Общая память (ВБ)}}{\text{Память на один процесс (ВБ)}}
]Если один процесс PHP-FPM использует, например, 50 МБ, то:
[
\text{pm.max_children} = \frac{16 \times 1024}{50} \approx 327
]Однако стоит учесть, что сервер также используется и для других задач, поэтому начнем с более консервативного значения:
pm.max_children = 30
-
pm.start_servers: это количество процессов, которое будет создано при запуске. Для вашего сервера, учитывая 8 ядер, можно установить:
pm.start_servers = 8
-
pm.min_spare_servers и pm.max_spare_servers: эти параметры определяют минимальное и максимальное количество неактивных процессов, которые должны поддерживаться на случай внезапного увеличения нагрузки. Рекомендуемые значения:
pm.min_spare_servers = 4 pm.max_spare_servers = 16
Общая конфигурация
С учетом вышесказанного, рекомендованные параметры конфигурации PHP-FPM будут выглядеть следующим образом:
pm = dynamic
pm.max_children = 30
pm.start_servers = 8
pm.min_spare_servers = 4
pm.max_spare_servers = 16
Тестирование
После изменения конфигурации важно протестировать, как ваше приложение справляется с новыми настройками. Наблюдайте за метриками CPU и RAM, а также за логами PHP-FPM, чтобы убедиться, что система работает стабильно, и нет сообщений об ошибках.
Заключение
Изменение параметров PHP-FPM может значительно улучшить производительность вашего сервера и уменьшить нагрузку на ресурсы. Однако всегда сохраняйте резервные копии текущих конфигураций и внимательно мониторьте результаты после внесения изменений. Если у вас возникнут сомнения или дополнительные вопросы, рекомендуется проконсультироваться с IT-специалистом для получения профессиональной помощи.