Tune PHP-FPM Performance on AlmaLinux 9
Process Manager modes
| Mode | Description | Best for |
|---|---|---|
static |
Fixed number of workers | Predictable, dedicated servers |
dynamic |
Workers scale between min/max | General purpose |
ondemand |
Workers spawned on request | Low-traffic sites |
Estimating pm.max_children
# Average PHP-FPM process memory (MB)
ps -ylC php-fpm --no-headers | awk '{sum+=$8} END {print sum/NR/1024 " MB avg"}'
Divide available RAM (minus OS + DB) by average process size:
pm.max_children = available_ram_mb / avg_process_mb
Example: 2048 MB RAM, 40 MB avg → max_children = 51
Recommended dynamic settings
pm = dynamic
pm.max_children = 50
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 20
pm.max_requests = 500
pm.process_idle_timeout = 10s
Slow log
request_slowlog_timeout = 5s
slowlog = /var/log/php-fpm/www-slow.log
Monitor with:
tail -f /var/log/php-fpm/www-slow.log
Status page
pm.status_path = /fpm-status
Restrict access in Nginx:
location /fpm-status {
allow 127.0.0.1;
deny all;
fastcgi_pass unix:/run/php-fpm/www.sock;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}