]> granicus.if.org Git - php/commitdiff
backport r313323 and r313326 from PHP_5_4
authorJérôme Loyet <fat@php.net>
Sun, 17 Jul 2011 14:31:32 +0000 (14:31 +0000)
committerJérôme Loyet <fat@php.net>
Sun, 17 Jul 2011 14:31:32 +0000 (14:31 +0000)
sapi/fpm/fpm/fpm_children.c
sapi/fpm/fpm/fpm_conf.c
sapi/fpm/fpm/fpm_conf.h
sapi/fpm/php-fpm.conf.in

index 65f56e7269b156a5b8bd6b60b5783e08363c73e7..769c519a85600a9989b40b96342cfd58df32565c 100644 (file)
@@ -363,6 +363,7 @@ int fpm_children_make(struct fpm_worker_pool_s *wp, int in_event_loop, int nb_to
        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 */
@@ -374,7 +375,16 @@ int fpm_children_make(struct fpm_worker_pool_s *wp, int in_event_loop, int nb_to
                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) {
@@ -407,6 +417,11 @@ int fpm_children_make(struct fpm_worker_pool_s *wp, int in_event_loop, int nb_to
 
        }
 
+       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 */
 }
 /* }}} */
index a7ad4d255116906ac7030ce27dd67e49e3fc892c..b1958af30bb45f1d99d558032f965a69ef5084c8 100644 (file)
@@ -66,8 +66,9 @@ static char *fpm_conf_set_syslog_facility(zval *value, void **config, intptr_t o
 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 @@ static struct ini_value_parser_s ini_fpm_global_options[] = {
        { "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) },
@@ -962,6 +964,11 @@ static int fpm_conf_post_process(TSRMLS_D) /* {{{ */
 
        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");
        }
@@ -1342,6 +1349,7 @@ static void fpm_conf_dump() /* {{{ */
        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);
index 87a5cd332b6f3b0de24f1f8b26cbf2efcbbf31a8..bbfcbb8a775e3d4c52ace234900edc5b4ad30c1f 100644 (file)
@@ -32,6 +32,7 @@ struct fpm_global_config_s {
 #endif
        int rlimit_files;
        int rlimit_core;
+       int process_max;
 };
 
 extern struct fpm_global_config_s fpm_global_config;
index b3151c0a9995063f7b1f133ff7282d3b1cc38735..ecc71313323a5e123defcc94fdc601accd61afad 100644 (file)
 ; 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