Max spawn child processes rate an once

* Add functionality to expect log config options
This commit is contained in:
Paulius Sapragonas 2021-03-05 20:15:30 +02:00 committed by Jakub Zelenka
parent 830d385351
commit eac1609a84
7 changed files with 100 additions and 4 deletions

View File

@ -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.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_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.max_requests", &fpm_conf_set_integer, WPO(pm_max_requests) },
{ "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));
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->process_priority = 64; /* 64 means unset */
wp->config->process_dumpable = 0;
@ -848,7 +850,7 @@ static int fpm_conf_process_all_pools() /* {{{ */
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) {
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);
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) {
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.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_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.max_requests = %d", wp->config->pm_max_requests);
zlog(ZLOG_NOTICE, "\tpm.status_path = %s", STR2STR(wp->config->pm_status_path));

View File

@ -70,6 +70,7 @@ struct fpm_worker_pool_config_s {
int pm_start_servers;
int pm_min_spare_servers;
int pm_max_spare_servers;
int pm_max_spawn_rate;
int pm_process_idle_timeout;
int pm_max_requests;
char *pm_status_path;

View File

@ -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);
/* 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;
}
continue;

View File

@ -5,8 +5,6 @@
#include "fpm_events.h"
/* spawn max 32 children at once */
#define FPM_MAX_SPAWN_RATE (32)
/* 1s (in ms) heartbeat for idle server maintenance */
#define FPM_IDLE_SERVER_MAINTENANCE_HEARTBEAT (1000)
/* a minimum of 130ms heartbeat for pctl */

View 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();
?>

View File

@ -1347,6 +1347,48 @@ class Tester
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.
*/

View File

@ -93,6 +93,8 @@ listen = 127.0.0.1:9000
; state (waiting to process). If the number
; of 'idle' processes is greater than this
; 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
; new requests will connect. The following parameter are used:
; 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'
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.
; Note: Used only when pm is set to 'ondemand'
; Default Value: 10s