PHP-FPM (FastCGI Process Manager) is a key component for running PHP applications efficiently under high traffic. Proper tuning prevents slow responses, 502/504 errors, and server crashes on busy websites.
PHP-FPM manages pools of PHP processes to handle web requests efficiently. Each pool configuration defines:
pm type: dynamic, ondemand, static
pm.max_children: maximum number of PHP processes
pm.start_servers, pm.min_spare_servers, pm.max_spare_servers (for dynamic)
pm.process_idle_timeout (for ondemand)
Proper tuning ensures PHP-FPM matches server capacity and website load.
Monitor the server during high load:
top
htop
df -h
free -m
Focus on:
CPU utilization
Memory usage
Disk I/O
PHP-FPM active processes
Dynamic: Adjusts process count dynamically; good for moderate traffic.
Ondemand: Processes start only when needed; saves memory.
Static: Fixed number of processes; best for predictable high traffic.
pm.max_children = 50
Too low → Requests queue, slow response
Too high → Exhaust memory, server crashes
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 20
start_servers: Number of PHP processes on startup
min/max_spare_servers: Adjust for burst traffic
pm.process_idle_timeout = 10s
Idle processes terminate to save memory
request_terminate_timeout = 300s
pm.max_requests = 500
Prevents memory leaks by recycling processes
Avoids hung processes under long-running scripts
systemctl status php-fpm
ps aux | grep php-fpm
Use top or htop to watch CPU and memory
Track slow requests in PHP-FPM logs:
tail -f /var/log/php-fpm/www-error.log
Use a separate PHP-FPM pool per site for shared servers.
Enable OPcache to reduce script compilation overhead.
Monitor memory usage to prevent OOM errors.
Adjust pm.max_children according to server RAM:
Formula: Total RAM for PHP / Average PHP process memory
Enable slow log to identify bottlenecks:
slowlog = /var/log/php-fpm/www-slow.log
request_slowlog_timeout = 5s
Avoid too many dynamic processes on low-memory servers.
Test under load using tools like ApacheBench, Siege, or Locust.
[www]
user = www-data
group = www-data
listen = /run/php/php8.1-fpm.sock
listen.owner = www-data
listen.group = www-data
pm = dynamic
pm.max_children = 100
pm.start_servers = 20
pm.min_spare_servers = 10
pm.max_spare_servers = 30
pm.max_requests = 500
request_terminate_timeout = 300s
slowlog = /var/log/php-fpm/www-slow.log
request_slowlog_timeout = 5s
Tuning PHP-FPM for high traffic websites involves balancing memory, CPU, and process management. By selecting the right PM type, setting max_children properly, enabling OPcache, and monitoring logs, administrators can significantly improve website performance and stability.