На 8-ядерном VPS с 24 ГБ оперативной памяти заканчивается память? Практическое руководство по экстремальной настройке пула процессов PHP-FPM с помощью HestiaCP.

Количество одновременно работающих пользователей, которое может обработать сервер, зависит не от количества ядер, а от объема памяти, потребляемого каждым процессом.

Это заявление может прозвучать как провокация, но это самый реальный и болезненный опыт в сфере эксплуатации и технического обслуживания.

Почему память является ключевым узким местом?

Многие, увидев VPS с 8-ядерным процессором и 24 ГБ оперативной памяти, подсознательно думают, что на нём легко можно запустить сотни процессов PHP-FPM.

Однако в действительности объем памяти, используемой одним PHP-процессом для RSS, часто достигает 200 МБ.

Это результат, полученный в ходе реального тестирования через командную строку:

ps --no-headers -o rss -p $(pgrep php-fpm) | awk '{sum+=$1} END {print sum/NR/1024 " MB"}'

В сложной структуре HestiaCP и многоплагиновой среде, особенно без оптимизации OPcache, 200 МБ — это норма.

Это означает, что именно объем памяти, а не процессор, является жестким ограничением, определяющим максимальную параллельность выполнения.

На 8-ядерном VPS с 24 ГБ оперативной памяти заканчивается память? Практическое руководство по экстремальной настройке пула процессов PHP-FPM с помощью HestiaCP.

Рекомендуемый конфигурационный файл (php-fpm.conf)

pm = dynamic
pm.max_children = 80
pm.start_servers = 16
pm.min_spare_servers = 8
pm.max_spare_servers = 24
pm.max_requests = 500
pm.process_idle_timeout = 10s
request_terminate_timeout = 60s

Логика расчета параметров и основа настройки

Параметры конфигурацииУстановка значенияОсновные расчеты и основы настройки
pmdynamicДинамический режим позволяет гибко добавлять или удалять процессы в зависимости от требований к параллельному выполнению, обеспечивая баланс между скоростью отклика и использованием памяти.
pm.max_children80Общий объем памяти составляет 24 ГБ, за вычетом памяти ядра системы и... MySQL/RedisПосле Nginx для PHP остаётся примерно 16 ГБ памяти.16,384 MB / 200 MB ≈ 81.9Установка значения 80 может полностью исключить OOM (Out of Memory) при высокой параллельности выполнения.
pm.start_servers16Предварительный нагрев при запуске устанавливается на уровне, вдвое превышающем количество ядер ЦП (8 ядер × 2 = 16), чтобы гарантировать, что служба сможет мгновенно обрабатывать базовые параллельные задачи после перезапуска.
pm.min_spare_servers8Установите количество ядер ЦП на 8, чтобы гарантировать обработку новых запросов в любое время даже в периоды низкой нагрузки.
pm.max_spare_servers24Установите значение, равное в 3 раза большему числу ядер ЦП (8 ядер × 3 = 24), чтобы сохранить умеренное количество процессов после снижения нагрузки и справиться с небольшими колебаниями.
pm.max_requests500Если один процесс достигает большого базового объема в 200 МБ, уменьшение количества запросов до 500 приведет к уничтожению и повторному созданию процесса, что позволит быстрее устранить неявные утечки памяти.
pm.process_idle_timeout10sВне min_spare_servers Бездействующие процессы автоматически освобождаются и возвращаются в системную память через 10 секунд после начала отсутствия запросов.

Основные вспомогательные настройки и рекомендации по оптимизации

1. Механизм предотвращения похмелья с таймаутом

request_terminate_timeout = 60s Это ключ.

Она может принудительно завершать процессы, зависшие из-за взаимоблокировки базы данных или блокировки со стороны сторонних API.

Тем временем, Nginx fastcgi_read_timeout Его необходимо удерживать не менее 60 секунд, иначе клиент получит его преждевременно. 504 Gateway Timeout.

2. Стратегии преодоления проблем с памятью

Ограничение в 80 одновременно обрабатываемых процессов означает, что в условиях экстремальной параллельности система может обрабатывать максимум 80 динамических HTTP-запросов одновременно.

Если вы хотите еще больше повысить производительность, следует сосредоточиться на сокращении использования памяти каждым процессом.

  • Включить OPcache: 在 php.ini Средняя конфигурация opcache.enable=1 И opcache.memory_consumption=256Кэширование байт-кода может сократить объем памяти, используемой одним процессом, с 200 МБ до 60–100 МБ.
  • Разумный контроль memory_limit:будем php.ini средний memory_limit ограничено в 128M256MДля предотвращения появления отдельных некорректных скриптов无限Это потребляет много памяти.

Как только объем памяти, используемой отдельным процессом, снизится до 100 МБ...pm.max_children Его можно безопасно обновить до 150 Кроме того, возможности параллельной обработки данных увеличились почти вдвое.

Приведены авторитетные точки зрения.

В соответствии с рекомендациями, изложенными в официальной документации Nginx :

«Для предотвращения исчерпания ресурсов в приложениях FastCGI всегда следует использовать директивы тайм-аута».
(Источник: документация Nginx)

В официальном руководстве по PHP четко указано:

"pm.max_children определяет максимальное количество создаваемых дочерних процессов. Это наиболее важная директива."
(Источник: документация PHP-FPM)

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

Заключение: Мои взгляды и ключевые цитаты

В сценариях с высокой степенью параллелизма центральный процессор выступает в роли двигателя, память — в роли топливного бака, а PHP-FPM — в роли диспетчера автопарка.

Независимо от мощности двигателя, если топливного бака недостаточно, колонна далеко не проедет.

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

Суть оптимизации заключается в поиске оптимального баланса при ограниченных ресурсах.

Это не просто технология, но и философия.

Поэтому перестаньте верить, что «количество ядер определяет всё». На самом деле, предел параллелизма определяется вашим контролем над памятью.

Примите меры и оптимизируйте свой VPS до предела, максимально используя каждый свободный объем памяти.

Надеюсь, статья "8-ядерный VPS с 24 ГБ оперативной памяти испытывает нехватку памяти? Экстремальная настройка пула процессов PHP-FPM под HestiaCP", опубликованная в блоге Чен Вэйляна ( https://www.chenweiliang.com/ ), окажется для вас полезной.

Не стесняйтесь делиться ссылкой на эту статью: https://www.chenweiliang.com/cwl-34509.html

Чтобы раскрыть еще больше скрытых трюков🔑, присоединяйтесь к нашему каналу в Telegram!

Поделитесь и поставьте лайк, если вам понравилось! Ваши репосты и лайки — наша постоянная мотивация!

 

发表 评论

您的邮箱地址不会被公开。必填项已用*标注

Наверх