PHP-FPM — це менеджер процесів PHP FastCGI. Це демон FastCGI, який дозволяє веб-сайту обробляти високе навантаження. Але іноді ця служба сама по собі викликає високе навантаження.
Щоб усунути проблему, перше, що потрібно зробити, це перевірили журнали помилок PHP-FPM, які доступні в такому місці, як
/var/log/php7.4-fpm.log
Розташування журналів помилок залежить від шляху встановлення та версії PHP. Під час перевірки журналу помилок ми виявили кілька попереджень, подібних до цього.
[12-Nov-2018 11:12:11] WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 32 children, there are 9 idle, and 89 total children
Це повідомлення означає, що пул PHP-FPM дуже зайнятий і не може впоратися з великим трафіком із наявними параметрами конфігурації.
PHP-FPM може призвести до високого навантаження на сервер з багатьох причин:
Перше, що зазвичай роблять власники серверів для негайного виправлення, це перезапуск служби PHP-FPM. Але простий перезапуск служби — це лише засіб для лікування, і незабаром ви побачите зростання навантаження.
Коли ми налагоджуємо такі проблеми із завантаженням, ми аналізуємо журнали та продуктивність сервера за певний період часу. Це допомагає нам точно визначити винуватця та вжити швидких заходів для його усунення.
Switch process manager
Менеджер процесів в основному буває трьох типів – динамічний, за вимогою та статичний. Продуктивність служби різко змінюється залежно від цього типу.
У динамічному типі кількість дочірніх процесів встановлюється динамічно на основі параметрів PHP-FPM у файлі conf. Але це тип, який вимагає багато пам’яті.
У статичному типі кількість дочірніх процесів фіксується параметром pm.max_children, але цей тип не є гнучким для сервера зі змінним веб-трафіком. Він також споживає занадто багато пам'яті.
У типі ondemand процеси PHP-FPM породжуються лише на вимогу, на основі трафіку. Цей тип допомагає керувати різним трафіком на серверах з обмеженою пам’яттю. Але накладні витрати збільшуються, коли є так багато коливань трафіку.
Менеджер процесів PHP-FPM визначається після оцінки доступної пам’яті сервера, стрибків трафіку, сторінок веб-сайтів, використання ЦП тощо.
Налаштуйте параметри PHP-FPM
PHP-FPM має багато конфігураційних параметрів, які визначають спосіб його роботи. Ці параметри повинні бути визначені на основі доступних ресурсів сервера, таких як оперативна пам’ять і ЦП.
Наприклад, загальна кількість процесів, які виконуються на сервері, буде приблизно = (Загальна кількість ОЗУ/Пам’ять на процес). На сервері з кількома службами всі вони враховуються для процесу налаштування.
Файл конфігурації PHP-FPM буде доступний у /etc/php-fpm.conf або в іншому місці на основі шляху до служби. Вміст файлу буде виглядати так:
listen.allowed_clients = 127.0.0.1
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 2
pm.max_spare_servers = 5
pm.max_requests = 150
Деякі з основних параметрів, які ми налаштовуємо на продуктивність:
Поширеною помилкою власників серверів є встановлення дуже високих значень для цих параметрів, щоб отримати максимальну продуктивність. Але якщо ресурсів недостатньо, такі високі значення можуть призвести до збою сервера.
Значення параметра «pm.max_children» спочатку визначається на основі ресурсів сервера, трафіку веб-сайту та вмісту сайтів. Інші параметри потім виводяться при подальшому тестуванні.
Увімкнути журнал повільних запитів
У випадках, коли з параметрами все в порядку, але існує підозра, що певна програма або сайт викликає високе навантаження, ми вмикаємо параметр повільного журналу в PHP-FPM.
request_slowlog_timeout = 6s
slowlog = /var/log/php-fpm/slowlog-site.log
Файл журналу, згаданий для параметра «slowlog» у файлі конфігурації PHP-FPM, записує запити, виконання яких займає більше 6 секунд.
Аналіз цих запитів дозволяє нам відстежувати та виправляти ресурсомісткі запити та програми на сервері.
Керування кількома пулами
PHP-FPM має можливість налаштувати кілька пулів ресурсів для окремих програм. Це допомагає утримувати ресурси для кожної програми та для додаткової безпеки.
Налаштувавши параметри на основі пулу, ми обмежуємо використання всіх ресурсів сервера єдиним пулом. Невикористані пули видаляються для подальшого керування.
Налаштування PHP-FPM для найкращої продуктивності — це не просто виправлення шаблону. Конфігурація та параметри служби будуть відрізнятися залежно від потреб сервера та ресурсів.
Під час пікового руху продуктивність буде відрізнятися від звичайних годин. Отже, після виконання налаштувань ми проводимо стрес-тести, щоб побачити, як працює сервіс під час високого навантаження.
Виходячи з продуктивності сервера під час стрес-тесту, ми проводимо подальше тонке налаштування сервісу. Ми також відстежуємо навантаження на сервер протягом певного періоду часу, щоб переконатися, що зміни дійсно допомогли.
У цьому сценарії ми змогли значно зменшити навантаження на сервер, виконавши налаштування PHP-FPM.
Але сама настройка PHP-FPM може не допомогти в певних сценаріях, де винуватцями також є такі служби, як MySQL або веб-сервер. У цих випадках ми виконуємо додаткові завдання, такі як: