73

I have Nginx + php5-fpm. Several times per hour my website stucks and in logfile I see the following:

WARNING: [pool www] server reached pm.max_children setting (5), consider raising it.

/etc/php5/fpm/pool.d/www.conf file contains the following configuration:

pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3

Server: AMD Opteron™ 3280, Octo-Core, 8x 2.4 GHz, 16 GB DIMM (DDR3).

I have no idea what numbers should I put in www.conf file for this server. Can me help somebody? Thanks

Eje
  • 131
  • 3
user1821484
  • 1,119
  • 2
  • 13
  • 18

2 Answers2

65

There are many possible reasons why your PHP-FPM would reach the max_children. Most common ones are:

  • A lot of parallel requests from your clients
  • Slow execution of the PHP scripts
  • Very low setting of the max_children

Looking at the specs of your machine, assuming there is nothing else than PHP+Nginx running, I think you could set it much higher than 5. You say you have 8 Cores, usually Nginx needs much less CPU than PHP, so with 5 children you will probably never be able to use all of them. I'm usually setting it to something like the number of cores x 2 or number of cores x 4, depending on the memory consumption of your PHP scripts.

Eje
  • 131
  • 3
replay
  • 3,180
  • 13
  • 16
  • It's a dating website with php chat and users send millions of instant messages. Last night when I had ~300 users online, the command netstat -an |grep 80 |wc - result was almost 400. – user1821484 Feb 16 '13 at 15:50
  • 1
    I actually have a similar dating website. I think you definitely need more PHP children. My configuration is as following: 20k concurrent online users, 12 PHP machines with 8 Cores each, 32 workers on each of the PHP machines. That works pretty well. You should also look at how much free memory you have, I suspect you have some, unless your PHP is huge. If you have free memory, why not use it for some more workers? – replay Feb 16 '13 at 15:51
  • @user1821484 This is correct; `pm.max_children` is _much too low_. A value of 10 is reasonable for a small VPS server with 1GB of RAM; you have a much larger server. Raise this value until you stop receiving the errors, then raise it again in case you get a traffic spike. – Michael Hampton Feb 16 '13 at 19:36
  • 1
    Thanks for answers. I increased pm.max_children setting to 10 and now I started to get this error: WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 16 children, there are 0 idle, and 8 total children. Can somebody suggest me what I need to increase? Thanks. – user1821484 Feb 17 '13 at 17:12
  • cores x 2 or cores x 4 sounds really low to me. I have a machine with 8 cores and 8GB RAM with **pm.max_children=48** and we still get the *server reached pm.max_children* warnings. This machine is nowhere near its CPU or memory limits. A better approach I think would be to optimize this setting in conjunction with corresponding nginx (or apache) settings and choose a value after determining how much memory each PHP process consumes. – S. Imp Jan 24 '19 at 02:29
36

I found that by setting the pm.max_requests value (which is commented out by default) helped in fixing these errors. This setting forces child requests to respawn after executing a certain number of requests and can be helpful if there are memory leaks somewhere in your code or 3rd party libs.

In /etc/php-fpm.d/www.conf:

pm.max_requests = 500
Tom Jowitt
  • 463
  • 5
  • 7