fat Sat, 08 Oct 2011 13:47:52 +0000 Revision: http://svn.php.net/viewvc?view=revision&revision=317896
Log: - Backported FR #55166 from 5.4 branch (Added process.max to control the number of process FPM can fork) Bug: https://bugs.php.net/55166 (Analyzed) Implement a global limit to the overall number of php processes Changed paths: U php/php-src/branches/PHP_5_3/NEWS U php/php-src/branches/PHP_5_3/sapi/fpm/fpm/fpm_children.c U php/php-src/branches/PHP_5_3/sapi/fpm/fpm/fpm_conf.c U php/php-src/branches/PHP_5_3/sapi/fpm/fpm/fpm_conf.h U php/php-src/branches/PHP_5_3/sapi/fpm/php-fpm.conf.in Modified: php/php-src/branches/PHP_5_3/NEWS =================================================================== --- php/php-src/branches/PHP_5_3/NEWS 2011-10-08 13:43:33 UTC (rev 317895) +++ php/php-src/branches/PHP_5_3/NEWS 2011-10-08 13:47:52 UTC (rev 317896) @@ -75,6 +75,8 @@ . Fixed bug #53872 (internal corruption of phar). (Hannes) - PHP-FPM SAPI: + . Backported FR #55166 from 5.4 branch (Added process.max to control + the number of process FPM can fork). (fat) . Backported FR #55181 from 5.4 branch (Enhance security by limiting access to user defined extensions). (fat) . Backported FR #54098 from 5.4 branch (Lowered process manager Modified: php/php-src/branches/PHP_5_3/sapi/fpm/fpm/fpm_children.c =================================================================== --- php/php-src/branches/PHP_5_3/sapi/fpm/fpm/fpm_children.c 2011-10-08 13:43:33 UTC (rev 317895) +++ php/php-src/branches/PHP_5_3/sapi/fpm/fpm/fpm_children.c 2011-10-08 13:47:52 UTC (rev 317896) @@ -362,6 +362,7 @@ pid_t pid; struct fpm_child_s *child; int max; + static int warned = 0; if (wp->config->pm == PM_STYLE_DYNAMIC) { if (!in_event_loop) { /* starting */ @@ -373,7 +374,16 @@ max = wp->config->pm_max_children; } - while (fpm_pctl_can_spawn_children() && wp->running_children < max) { + /* + * fork children while: + * - fpm_pctl_can_spawn_children : FPM is running in a NORMAL state (aka not restart, stop or reload) + * - wp->running_children < max : there is less than the max process for the current pool + * - (fpm_global_config.process_max < 1 || fpm_globals.running_children < fpm_global_config.process_max): + * if fpm_global_config.process_max is set, FPM has not fork this number of processes (globaly) + */ + while (fpm_pctl_can_spawn_children() && wp->running_children < max && (fpm_global_config.process_max < 1 || fpm_globals.running_children < fpm_global_config.process_max)) { + + warned = 0; child = fpm_resources_prepare(wp); if (!child) { @@ -406,6 +416,11 @@ } + if (!warned && fpm_global_config.process_max > 0 && fpm_globals.running_children >= fpm_global_config.process_max) { + warned = 1; + zlog(ZLOG_WARNING, "The maximum number of processes has been reached. Please review your configuration and consider raising 'process.max'"); + } + return 1; /* we are done */ } /* }}} */ Modified: php/php-src/branches/PHP_5_3/sapi/fpm/fpm/fpm_conf.c =================================================================== --- php/php-src/branches/PHP_5_3/sapi/fpm/fpm/fpm_conf.c 2011-10-08 13:43:33 UTC (rev 317895) +++ php/php-src/branches/PHP_5_3/sapi/fpm/fpm/fpm_conf.c 2011-10-08 13:47:52 UTC (rev 317896) @@ -66,8 +66,9 @@ struct fpm_global_config_s fpm_global_config = { .daemonize = 1, #ifdef HAVE_SYSLOG_H - .syslog_facility = -1 + .syslog_facility = -1, #endif + .process_max = 0, }; static struct fpm_worker_pool_s *current_wp = NULL; static int ini_recursion = 0; @@ -79,6 +80,7 @@ { "emergency_restart_threshold", &fpm_conf_set_integer, GO(emergency_restart_threshold) }, { "emergency_restart_interval", &fpm_conf_set_time, GO(emergency_restart_interval) }, { "process_control_timeout", &fpm_conf_set_time, GO(process_control_timeout) }, + { "process.max", &fpm_conf_set_integer, GO(process_max) }, { "daemonize", &fpm_conf_set_boolean, GO(daemonize) }, { "pid", &fpm_conf_set_string, GO(pid_file) }, { "error_log", &fpm_conf_set_string, GO(error_log) }, @@ -1014,6 +1016,11 @@ fpm_globals.log_level = fpm_global_config.log_level; + if (fpm_global_config.process_max < 0) { + zlog(ZLOG_ERROR, "process_max can't be negative"); + return -1; + } + if (!fpm_global_config.error_log) { fpm_global_config.error_log = strdup("log/php-fpm.log"); } @@ -1394,6 +1401,7 @@ zlog(ZLOG_NOTICE, "\tsyslog.facility = %d", fpm_global_config.syslog_facility); /* FIXME: convert to string */ #endif zlog(ZLOG_NOTICE, "\tprocess_control_timeout = %ds", fpm_global_config.process_control_timeout); + zlog(ZLOG_NOTICE, "\tprocess.max = %d", fpm_global_config.process_max); zlog(ZLOG_NOTICE, "\temergency_restart_interval = %ds", fpm_global_config.emergency_restart_interval); zlog(ZLOG_NOTICE, "\temergency_restart_threshold = %d", fpm_global_config.emergency_restart_threshold); zlog(ZLOG_NOTICE, "\trlimit_files = %d", fpm_global_config.rlimit_files); Modified: php/php-src/branches/PHP_5_3/sapi/fpm/fpm/fpm_conf.h =================================================================== --- php/php-src/branches/PHP_5_3/sapi/fpm/fpm/fpm_conf.h 2011-10-08 13:43:33 UTC (rev 317895) +++ php/php-src/branches/PHP_5_3/sapi/fpm/fpm/fpm_conf.h 2011-10-08 13:47:52 UTC (rev 317896) @@ -32,6 +32,7 @@ #endif int rlimit_files; int rlimit_core; + int process_max; }; extern struct fpm_global_config_s fpm_global_config; Modified: php/php-src/branches/PHP_5_3/sapi/fpm/php-fpm.conf.in =================================================================== --- php/php-src/branches/PHP_5_3/sapi/fpm/php-fpm.conf.in 2011-10-08 13:43:33 UTC (rev 317895) +++ php/php-src/branches/PHP_5_3/sapi/fpm/php-fpm.conf.in 2011-10-08 13:47:52 UTC (rev 317896) @@ -69,6 +69,13 @@ ; Default Value: 0 ;process_control_timeout = 0 +; The maximum number of processes FPM will fork. This has been design to control +; the global number of processes when using dynamic PM within a lot of pools. +; Use it with caution. +; Note: A value of 0 indicates no limit +; Default Value: 0 +; process.max = 128 + ; Send FPM to background. Set to 'no' to keep FPM in foreground for debugging. ; Default Value: yes ;daemonize = yes
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php