mirror of
https://github.com/php/php-src.git
synced 2024-09-21 18:07:23 +00:00
Max spawn child processes rate an once
* Add functionality to expect log config options
This commit is contained in:
parent
830d385351
commit
eac1609a84
@ -132,6 +132,7 @@ static struct ini_value_parser_s ini_fpm_pool_options[] = {
|
|||||||
{ "pm.start_servers", &fpm_conf_set_integer, WPO(pm_start_servers) },
|
{ "pm.start_servers", &fpm_conf_set_integer, WPO(pm_start_servers) },
|
||||||
{ "pm.min_spare_servers", &fpm_conf_set_integer, WPO(pm_min_spare_servers) },
|
{ "pm.min_spare_servers", &fpm_conf_set_integer, WPO(pm_min_spare_servers) },
|
||||||
{ "pm.max_spare_servers", &fpm_conf_set_integer, WPO(pm_max_spare_servers) },
|
{ "pm.max_spare_servers", &fpm_conf_set_integer, WPO(pm_max_spare_servers) },
|
||||||
|
{ "pm.max_spawn_rate", &fpm_conf_set_integer, WPO(pm_max_spawn_rate) },
|
||||||
{ "pm.process_idle_timeout", &fpm_conf_set_time, WPO(pm_process_idle_timeout) },
|
{ "pm.process_idle_timeout", &fpm_conf_set_time, WPO(pm_process_idle_timeout) },
|
||||||
{ "pm.max_requests", &fpm_conf_set_integer, WPO(pm_max_requests) },
|
{ "pm.max_requests", &fpm_conf_set_integer, WPO(pm_max_requests) },
|
||||||
{ "pm.status_path", &fpm_conf_set_string, WPO(pm_status_path) },
|
{ "pm.status_path", &fpm_conf_set_string, WPO(pm_status_path) },
|
||||||
@ -610,6 +611,7 @@ static void *fpm_worker_pool_config_alloc() /* {{{ */
|
|||||||
|
|
||||||
memset(wp->config, 0, sizeof(struct fpm_worker_pool_config_s));
|
memset(wp->config, 0, sizeof(struct fpm_worker_pool_config_s));
|
||||||
wp->config->listen_backlog = FPM_BACKLOG_DEFAULT;
|
wp->config->listen_backlog = FPM_BACKLOG_DEFAULT;
|
||||||
|
wp->config->pm_max_spawn_rate = 32; /* 32 by default */
|
||||||
wp->config->pm_process_idle_timeout = 10; /* 10s by default */
|
wp->config->pm_process_idle_timeout = 10; /* 10s by default */
|
||||||
wp->config->process_priority = 64; /* 64 means unset */
|
wp->config->process_priority = 64; /* 64 means unset */
|
||||||
wp->config->process_dumpable = 0;
|
wp->config->process_dumpable = 0;
|
||||||
@ -848,7 +850,7 @@ static int fpm_conf_process_all_pools() /* {{{ */
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* pm.start_servers, pm.min_spare_servers, pm.max_spare_servers */
|
/* pm.start_servers, pm.min_spare_servers, pm.max_spare_servers, pm.max_spawn_rate */
|
||||||
if (wp->config->pm == PM_STYLE_DYNAMIC) {
|
if (wp->config->pm == PM_STYLE_DYNAMIC) {
|
||||||
struct fpm_worker_pool_config_s *config = wp->config;
|
struct fpm_worker_pool_config_s *config = wp->config;
|
||||||
|
|
||||||
@ -881,6 +883,11 @@ static int fpm_conf_process_all_pools() /* {{{ */
|
|||||||
zlog(ZLOG_ALERT, "[pool %s] pm.start_servers(%d) must not be less than pm.min_spare_servers(%d) and not greater than pm.max_spare_servers(%d)", wp->config->name, config->pm_start_servers, config->pm_min_spare_servers, config->pm_max_spare_servers);
|
zlog(ZLOG_ALERT, "[pool %s] pm.start_servers(%d) must not be less than pm.min_spare_servers(%d) and not greater than pm.max_spare_servers(%d)", wp->config->name, config->pm_start_servers, config->pm_min_spare_servers, config->pm_max_spare_servers);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (config->pm_max_spawn_rate < 1) {
|
||||||
|
zlog(ZLOG_ALERT, "[pool %s] pm.max_spawn_rate must be a positive value", wp->config->name);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
} else if (wp->config->pm == PM_STYLE_ONDEMAND) {
|
} else if (wp->config->pm == PM_STYLE_ONDEMAND) {
|
||||||
struct fpm_worker_pool_config_s *config = wp->config;
|
struct fpm_worker_pool_config_s *config = wp->config;
|
||||||
|
|
||||||
@ -1718,6 +1725,7 @@ static void fpm_conf_dump() /* {{{ */
|
|||||||
zlog(ZLOG_NOTICE, "\tpm.start_servers = %d", wp->config->pm_start_servers);
|
zlog(ZLOG_NOTICE, "\tpm.start_servers = %d", wp->config->pm_start_servers);
|
||||||
zlog(ZLOG_NOTICE, "\tpm.min_spare_servers = %d", wp->config->pm_min_spare_servers);
|
zlog(ZLOG_NOTICE, "\tpm.min_spare_servers = %d", wp->config->pm_min_spare_servers);
|
||||||
zlog(ZLOG_NOTICE, "\tpm.max_spare_servers = %d", wp->config->pm_max_spare_servers);
|
zlog(ZLOG_NOTICE, "\tpm.max_spare_servers = %d", wp->config->pm_max_spare_servers);
|
||||||
|
zlog(ZLOG_NOTICE, "\tpm.max_spawn_rate = %d", wp->config->pm_max_spawn_rate);
|
||||||
zlog(ZLOG_NOTICE, "\tpm.process_idle_timeout = %d", wp->config->pm_process_idle_timeout);
|
zlog(ZLOG_NOTICE, "\tpm.process_idle_timeout = %d", wp->config->pm_process_idle_timeout);
|
||||||
zlog(ZLOG_NOTICE, "\tpm.max_requests = %d", wp->config->pm_max_requests);
|
zlog(ZLOG_NOTICE, "\tpm.max_requests = %d", wp->config->pm_max_requests);
|
||||||
zlog(ZLOG_NOTICE, "\tpm.status_path = %s", STR2STR(wp->config->pm_status_path));
|
zlog(ZLOG_NOTICE, "\tpm.status_path = %s", STR2STR(wp->config->pm_status_path));
|
||||||
|
@ -70,6 +70,7 @@ struct fpm_worker_pool_config_s {
|
|||||||
int pm_start_servers;
|
int pm_start_servers;
|
||||||
int pm_min_spare_servers;
|
int pm_min_spare_servers;
|
||||||
int pm_max_spare_servers;
|
int pm_max_spare_servers;
|
||||||
|
int pm_max_spawn_rate;
|
||||||
int pm_process_idle_timeout;
|
int pm_process_idle_timeout;
|
||||||
int pm_max_requests;
|
int pm_max_requests;
|
||||||
char *pm_status_path;
|
char *pm_status_path;
|
||||||
|
@ -431,7 +431,7 @@ static void fpm_pctl_perform_idle_server_maintenance(struct timeval *now) /* {{{
|
|||||||
zlog(ZLOG_DEBUG, "[pool %s] %d child(ren) have been created dynamically", wp->config->name, children_to_fork);
|
zlog(ZLOG_DEBUG, "[pool %s] %d child(ren) have been created dynamically", wp->config->name, children_to_fork);
|
||||||
|
|
||||||
/* Double the spawn rate for the next iteration */
|
/* Double the spawn rate for the next iteration */
|
||||||
if (wp->idle_spawn_rate < FPM_MAX_SPAWN_RATE) {
|
if (wp->idle_spawn_rate < wp->config->pm_max_spawn_rate) {
|
||||||
wp->idle_spawn_rate *= 2;
|
wp->idle_spawn_rate *= 2;
|
||||||
}
|
}
|
||||||
continue;
|
continue;
|
||||||
|
@ -5,8 +5,6 @@
|
|||||||
|
|
||||||
#include "fpm_events.h"
|
#include "fpm_events.h"
|
||||||
|
|
||||||
/* spawn max 32 children at once */
|
|
||||||
#define FPM_MAX_SPAWN_RATE (32)
|
|
||||||
/* 1s (in ms) heartbeat for idle server maintenance */
|
/* 1s (in ms) heartbeat for idle server maintenance */
|
||||||
#define FPM_IDLE_SERVER_MAINTENANCE_HEARTBEAT (1000)
|
#define FPM_IDLE_SERVER_MAINTENANCE_HEARTBEAT (1000)
|
||||||
/* a minimum of 130ms heartbeat for pctl */
|
/* a minimum of 130ms heartbeat for pctl */
|
||||||
|
39
sapi/fpm/tests/set-pm-max-spawn-rate.phpt
Normal file
39
sapi/fpm/tests/set-pm-max-spawn-rate.phpt
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
--TEST--
|
||||||
|
FPM: set pm.max_spawn_rate
|
||||||
|
--SKIPIF--
|
||||||
|
<?php
|
||||||
|
include "skipif.inc";
|
||||||
|
?>
|
||||||
|
--FILE--
|
||||||
|
<?php
|
||||||
|
|
||||||
|
require_once "tester.inc";
|
||||||
|
|
||||||
|
$cfg = <<<EOT
|
||||||
|
[global]
|
||||||
|
error_log = {{FILE:LOG}}
|
||||||
|
log_level = notice
|
||||||
|
[unconfined]
|
||||||
|
listen = {{ADDR}}
|
||||||
|
pm = dynamic
|
||||||
|
pm.max_children = 5
|
||||||
|
pm.start_servers = 2
|
||||||
|
pm.min_spare_servers = 1
|
||||||
|
pm.max_spare_servers = 3
|
||||||
|
pm.max_spawn_rate = 64
|
||||||
|
EOT;
|
||||||
|
|
||||||
|
$tester = new FPM\Tester($cfg);
|
||||||
|
$tester->start(['-t', '-t']);
|
||||||
|
$tester->expectLogConfigOptions(['pm.max_spawn_rate' => 64]);
|
||||||
|
$tester->close();
|
||||||
|
|
||||||
|
?>
|
||||||
|
Done
|
||||||
|
--EXPECT--
|
||||||
|
Done
|
||||||
|
--CLEAN--
|
||||||
|
<?php
|
||||||
|
require_once "tester.inc";
|
||||||
|
FPM\Tester::clean();
|
||||||
|
?>
|
@ -1347,6 +1347,48 @@ class Tester
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Expect log config options
|
||||||
|
*
|
||||||
|
* @param array $options
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function expectLogConfigOptions(array $options)
|
||||||
|
{
|
||||||
|
$configOptions = $this->getConfigOptions();
|
||||||
|
foreach ($options as $name => $value) {
|
||||||
|
if (!isset($configOptions[$name])) {
|
||||||
|
return $this->error("Expected config option: {$name} = {$value} but {$name} is not set");
|
||||||
|
}
|
||||||
|
if ($configOptions[$name] != $value) {
|
||||||
|
return $this->error(
|
||||||
|
"Expected config option: {$name} = {$value} but got: {$name} = {$configOptions[$name]}"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get set config options
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
private function getConfigOptions()
|
||||||
|
{
|
||||||
|
$options = [];
|
||||||
|
|
||||||
|
foreach ($this->getLogLines(-1) as $line) {
|
||||||
|
preg_match('/.+NOTICE:\s+(.+)\s=\s(.+)/', $line, $matches);
|
||||||
|
if ($matches) {
|
||||||
|
$options[$matches[1]] = $matches[2];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $options;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Print content of access log.
|
* Print content of access log.
|
||||||
*/
|
*/
|
||||||
|
@ -93,6 +93,8 @@ listen = 127.0.0.1:9000
|
|||||||
; state (waiting to process). If the number
|
; state (waiting to process). If the number
|
||||||
; of 'idle' processes is greater than this
|
; of 'idle' processes is greater than this
|
||||||
; number then some children will be killed.
|
; number then some children will be killed.
|
||||||
|
; pm.max_spawn_rate - the maximum number of rate to spawn child
|
||||||
|
; processes at once.
|
||||||
; ondemand - no children are created at startup. Children will be forked when
|
; ondemand - no children are created at startup. Children will be forked when
|
||||||
; new requests will connect. The following parameter are used:
|
; new requests will connect. The following parameter are used:
|
||||||
; pm.max_children - the maximum number of children that
|
; pm.max_children - the maximum number of children that
|
||||||
@ -128,6 +130,12 @@ pm.min_spare_servers = 1
|
|||||||
; Note: Mandatory when pm is set to 'dynamic'
|
; Note: Mandatory when pm is set to 'dynamic'
|
||||||
pm.max_spare_servers = 3
|
pm.max_spare_servers = 3
|
||||||
|
|
||||||
|
; The number of rate to spawn child processes at once.
|
||||||
|
; Note: Used only when pm is set to 'dynamic'
|
||||||
|
; Note: Mandatory when pm is set to 'dynamic'
|
||||||
|
; Default Value: 32
|
||||||
|
;pm.max_spawn_rate = 32
|
||||||
|
|
||||||
; The number of seconds after which an idle process will be killed.
|
; The number of seconds after which an idle process will be killed.
|
||||||
; Note: Used only when pm is set to 'ondemand'
|
; Note: Used only when pm is set to 'ondemand'
|
||||||
; Default Value: 10s
|
; Default Value: 10s
|
||||||
|
Loading…
Reference in New Issue
Block a user