When your PHP-FPM log shows the message "WARNING: [pool www] server reached pm.max_children setting (5), consider raising it"
, it means your PHP processes are being overwhelmed by incoming requests. This typically happens when:
- Your server receives more concurrent requests than your current
pm.max_children
setting allows - PHP processes are taking too long to complete (possibly due to slow database queries or external API calls)
- Your server has available resources that aren't being utilized
For your AMD Opteron™ 3280 server with 16GB RAM, here's how to calculate appropriate values:
# Memory calculation formula:
# max_children = (Total RAM - Memory for other services) / Memory per PHP process
# Example calculation:
# Assuming 12GB available for PHP (leaving 4GB for OS, NGINX, etc.)
# With average PHP process using 50MB:
max_children = 12288MB / 50MB ≈ 245
However, for most applications, we recommend starting with these conservative settings:
pm = dynamic
pm.max_children = 40
pm.start_servers = 8
pm.min_spare_servers = 4
pm.max_spare_servers = 12
pm.process_idle_timeout = 10s
pm.max_requests = 500
After making changes, monitor your server with these commands:
# Check PHP-FPM status
sudo systemctl status php5-fpm
# Monitor memory usage
free -m
# Check active PHP processes
ps aux | grep php-fpm | wc -l
# Real-time monitoring
watch -n 1 "echo 'Total PHP processes: ' && ps aux | grep php-fpm | wc -l && echo 'Memory usage: ' && free -m"
For high-traffic sites, consider these additional optimizations:
# In php.ini
max_execution_time = 30
memory_limit = 128M
# In www.conf
request_terminate_timeout = 30s
request_slowlog_timeout = 10s
slowlog = /var/log/php-fpm/slow.log
Remember to restart PHP-FPM after changes:
sudo service php5-fpm restart
If you experience problems after increasing pm.max_children
:
- 502 Bad Gateway errors: Your NGINX timeout might be too short. Increase these values in NGINX config:
fastcgi_read_timeout 300;
fastcgi_send_timeout 300;
fastcgi_connect_timeout 300;
- High CPU usage: Consider implementing OPcache:
zend_extension=opcache.so
opcache.enable=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
When running PHP-FPM with NGINX, the process manager configuration directly impacts your server's ability to handle concurrent requests. The warning message indicates your current pm.max_children
setting of 5 is being exhausted during traffic spikes. With your 8-core Opteron processor and 16GB RAM, we can significantly optimize this.
To determine optimal values, we need to consider:
# Formula to calculate max_children:
max_children = (Total RAM - System Overhead) / Memory per PHP Process
# Example calculation for your server:
Total RAM = 16GB (16384MB)
System overhead = 4GB (4096MB)
Average PHP process = 80MB
Max children = (16384 - 4096) / 80 ≈ 154
For your hardware, I suggest these dynamic PM settings:
pm = dynamic
pm.max_children = 150
pm.start_servers = 20
pm.min_spare_servers = 10
pm.max_spare_servers = 30
After applying changes, monitor with:
# Check current PHP-FPM status
sudo systemctl status php5-fpm
# Monitor memory usage
watch -n 1 free -m
# View active processes
sudo ps aux | grep php-fpm | wc -l
Consider these additional tweaks:
# In php.ini:
opcache.enable=1
opcache.memory_consumption=128
opcache.max_accelerated_files=4000
# In www.conf:
pm.process_idle_timeout = 10s
request_terminate_timeout = 30s