php-fpm – расчет значений

If you need to calculate and change these values based on the amount of memory on the system the following command will help us to determine the memory used by each (PHP-FPM) child process:

ps -ylC php-fpm --sort:rss

pm.max_children can be calculated as:

pm.max_children = Total RAM dedicated to the web server / Max child process size

The server has 8GB of RAM, so:

pm.max_children = 6144MB / 85MB = 72

You need to take into account any other services running on the machine while calculating memory usage.

Then change the settings as follow:

pm.max_children = 70  
pm.start_servers = 20  
pm.min_spare_servers = 20  
pm.max_spare_servers = 35  
pm.max_requests = 500

Можно проверить среднее использование памяти процессами PHP-FPM этой коммандой:

ps --no-headers -o "rss,cmd" -C php-fpm | awk '{ sum+=$1 } END { printf ("%d%s\n", sum/NR/1024,"M") }'

Пример.

Объем общей / доступной / используемой памяти можно посмотреть с помощью free:

# free -m
              total        used        free      shared  buff/cache   available
Mem:           1803        1588          73           3         141          52
Swap:          2047         955        1092

Далее, возьмем за основу формулу для расчета pm.max_children (источник), и проведем расчет на примере:

Total Max Processes = (Total Ram - (Used Ram + Buffer)) / (Memory per php process)

Всего ОЗУ: 4Гб
Используется ОЗУ: 1000Мб
Буфер безопасности: 400Мб
Память на один дочерний php-fpm процесс (в среднем): 30Мб

Максимально возможное кол-во процессов = (4096 - (1000 + 400)) / 30 = 89
Четное количество: 89 округлили в меньшую сторону до 80

Значение остальных директив можно установить исходя из ожидаемой нагрузки на приложение а также учесть чем еще занимается сервер кроме работы php-fpm (скажем СУБД также требует ресурсов). В случае наличия множества задач на сервере – стоит снизить к-во как начальных / максимальных процессов.

К примеру учтем что на сервере находиться 2 пула www1 и www2 (к примеру 2 веб-ресурса), тогда конфигурация каждого из них может выглядеть как:

pm.max_children = 40    ; 80 / 2
pm.start_servers = 15
pm.min_spare_servers = 15
pm.max_spare_servers = 25

https://community.webcore.cloud/tutorials/how_to_solve_php_fpm_server_reached_max_children/
http://logvik.com/оптимизация-для-серверов-приложений-на-основе-nginxphp-fpm/php-fpm
https://hcbogdan.com/php/2016/09/16/php-fpm-dynamic/
http://adminunix.ru/nastrojka-php-fpm-nginx-na-vps/

 

image_pdfimage_print

Leave a Reply

Your email address will not be published. Required fields are marked *