php5-fpm: сервер дійшов до pm.max_children


41

У мене є Nginx + php5-fpm . Кілька разів на годину мій веб-сайт застрягає, і в логфайлі я бачу таке:

ПОПЕРЕДЖЕННЯ: Сервер [pool www] дійшов до налаштування pm.max_children (5), розглянути можливість його підвищення.

Файл /etc/php5/fpm/pool.d/www.conf містить таку конфігурацію:

pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3

Сервер: AMD Opteron ™ 3280, Octo-Core, 8x 2,4 ГГц, 16 Гб DIMM (DDR3).

Я поняття не маю, які цифри слід ввести у файл www.conf для цього сервера. Чи можу я допомогти комусь? Дякую

Відповіді:


40

Є багато можливих причин, через які ваш PHP-FPM досягне max_children. Найпоширеніші з них:

  • Багато паралельних запитів від ваших клієнтів
  • Повільне виконання скриптів PHP
  • Дуже низька настройка max_children

Дивлячись на характеристики вашої машини, припускаючи, що немає нічого іншого, ніж працює PHP + Nginx, я думаю, ви могли б встановити його набагато вище 5. Ви кажете, що у вас 8 ядер, зазвичай Nginx потребує набагато менше процесора, ніж PHP, тому з 5 дітьми ви, ймовірно, ніколи не зможете ними скористатися. Зазвичай я встановлюю це на зразок кількості ядер х 2 або кількості ядер х 4 , залежно від споживання пам'яті ваших PHP-скриптів.


Це веб-сайт для знайомств з PHP-чатом, і користувачі надсилають мільйони миттєвих повідомлень. Вчора ввечері, коли в мене було ~ 300 користувачів в Інтернеті, команда netstat -an | grep 80 | wc - результат був майже 400.
user1821484

1
У мене фактично є подібний веб-сайт знайомств. Я думаю, вам точно потрібно більше дітей PHP. Моя конфігурація така: 20 кк одночасних користувачів в Інтернеті, 12 машин PHP з 8 ядрами кожен, 32 працівники на кожній машині PHP. Це працює досить добре. Ви також повинні подивитися, скільки вільної пам'яті у вас є, я підозрюю, що у вас є, якщо тільки ваш PHP не величезний. Якщо у вас вільна пам'ять, чому б не використати її для ще кількох працівників?
повтор

@ user1821484 Це правильно; pm.max_childrenє занадто низьким . Значення 10 є розумним для невеликого сервера VPS з 1 Гб оперативної пам’яті; у вас набагато більший сервер. Підвищуйте це значення до тих пір, поки не припините отримувати помилки, а потім знову підніміть його, якщо ви отримаєте стрибок трафіку.
Майкл Хемптон

Дякуємо за відповіді. Я збільшив налаштування pm.max_children до 10, і тепер я почав отримувати цю помилку: ПОПЕРЕДЖЕННЯ: [пул www] здається зайнятим (можливо, вам доведеться збільшити pm.start_servers або pm.min / max_spare_servers), нерестуючи 16 дітей, є 0 простою, і 8 дітей. Чи може хтось підказати мені, що мені потрібно збільшити? Спасибі.
користувач1821484

ядра х 2 або ядра х 4 звучать для мене дуже низько. У мене є машина з 8 ядрами і 8 ГБ оперативної пам’яті з pm.max_children = 48, і ми все ще отримуємо сервер, досягнутий попереджень pm.max_children . Ця машина ніде не обмежується процесором або обмеженням пам’яті. Кращим підходом, на мою думку, було б оптимізувати цей параметр у поєднанні з відповідними параметрами nginx (або apache) та вибрати значення, визначивши, скільки пам'яті споживає кожен процес PHP.
С. Імп

19

Я виявив, що встановлення значення pm.max_requests (яке коментується за замовчуванням) допомогло виправити ці помилки. Цей параметр змушує дочірні запити відновлюватись після виконання певної кількості запитів і може бути корисним, якщо в коді чи сторонніх контурах є витоки пам'яті.

В /etc/php-fpm.d/www.conf :

pm.max_requests = 500

13

Це посилання може бути корисним - воно пояснює, як обчислити кількість дочірніх процесів, виходячи з обсягу пам’яті в системі:


7
Ця відповідь буде марною, як тільки посилання відійде.
miken32

2
В основному, посилання говорить ... Відповідне значення для pm.max_children можна обчислити так: pm.max_children = Загальна оперативна пам’ять, призначена для веб-сервера / Максимальний розмір дочірнього процесу
jaywhy13
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.