Mailing List Archive

svn commit: r1893471 - in /httpd/httpd/trunk/server/mpm: event/event.c netware/mpm_netware.c prefork/prefork.c worker/worker.c
Author: ylavic
Date: Mon Sep 20 14:27:42 2021
New Revision: 1893471

URL: http://svn.apache.org/viewvc?rev=1893471&view=rev
Log:
MPMs: cap idle_spawn_rate to MAX_SPAWN_RATE.

idle_spawn_rate *= 2 can go above MAX_SPAWN_RATE at some point, and it's not
enough for MAX_SPAWN_RATE to be a power of two for MPMs event and worker since
idle_spawn_rate is per bucket (num_buckets is not necessarily a power of two).

Let's cap on the other MPMs too should MAX_SPAWN_RATE change in the future.


Modified:
httpd/httpd/trunk/server/mpm/event/event.c
httpd/httpd/trunk/server/mpm/netware/mpm_netware.c
httpd/httpd/trunk/server/mpm/prefork/prefork.c
httpd/httpd/trunk/server/mpm/worker/worker.c

Modified: httpd/httpd/trunk/server/mpm/event/event.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/server/mpm/event/event.c?rev=1893471&r1=1893470&r2=1893471&view=diff
==============================================================================
--- httpd/httpd/trunk/server/mpm/event/event.c (original)
+++ httpd/httpd/trunk/server/mpm/event/event.c Mon Sep 20 14:27:42 2021
@@ -435,13 +435,15 @@ typedef struct event_retained_data {
* reset only when a cycle goes by without the need to spawn.
*/
int *idle_spawn_rate;
-#ifndef MAX_SPAWN_RATE
-#define MAX_SPAWN_RATE (32)
-#endif
int hold_off_on_exponential_spawning;
} event_retained_data;
static event_retained_data *retained;

+#ifndef MAX_SPAWN_RATE
+#define MAX_SPAWN_RATE 32
+#endif
+static int max_spawn_rate_per_bucket = MAX_SPAWN_RATE / 1;
+
struct event_srv_cfg_s {
struct timeout_queue *wc_q,
*ka_q;
@@ -3277,8 +3279,12 @@ static void perform_idle_server_maintena
--retained->hold_off_on_exponential_spawning;
}
else if (retained->idle_spawn_rate[child_bucket]
- < MAX_SPAWN_RATE / num_buckets) {
- retained->idle_spawn_rate[child_bucket] *= 2;
+ < max_spawn_rate_per_bucket) {
+ int new_rate = retained->idle_spawn_rate[child_bucket] * 2;
+ if (new_rate > max_spawn_rate_per_bucket) {
+ new_rate = max_spawn_rate_per_bucket;
+ }
+ retained->idle_spawn_rate[child_bucket] = new_rate;
}
}
}
@@ -3538,6 +3544,11 @@ static int event_run(apr_pool_t * _pconf
if (max_spare_threads < min_spare_threads + (threads_per_child + 1) * num_buckets)
max_spare_threads = min_spare_threads + (threads_per_child + 1) * num_buckets;

+ max_spawn_rate_per_bucket = (MAX_SPAWN_RATE + num_buckets - 1) / num_buckets;
+ if (max_spawn_rate_per_bucket < 1) {
+ max_spawn_rate_per_bucket = 1;
+ }
+
/* If we're doing a graceful_restart then we're going to see a lot
* of children exiting immediately when we get into the main loop
* below (because we just sent them AP_SIG_GRACEFUL). This happens pretty

Modified: httpd/httpd/trunk/server/mpm/netware/mpm_netware.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/server/mpm/netware/mpm_netware.c?rev=1893471&r1=1893470&r2=1893471&view=diff
==============================================================================
--- httpd/httpd/trunk/server/mpm/netware/mpm_netware.c (original)
+++ httpd/httpd/trunk/server/mpm/netware/mpm_netware.c Mon Sep 20 14:27:42 2021
@@ -709,6 +709,9 @@ static void perform_idle_server_maintena
}
else if (idle_spawn_rate < MAX_SPAWN_RATE) {
idle_spawn_rate *= 2;
+ if (idle_spawn_rate > MAX_SPAWN_RATE) {
+ idle_spawn_rate = MAX_SPAWN_RATE;
+ }
}
}
}

Modified: httpd/httpd/trunk/server/mpm/prefork/prefork.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/server/mpm/prefork/prefork.c?rev=1893471&r1=1893470&r2=1893471&view=diff
==============================================================================
--- httpd/httpd/trunk/server/mpm/prefork/prefork.c (original)
+++ httpd/httpd/trunk/server/mpm/prefork/prefork.c Mon Sep 20 14:27:42 2021
@@ -879,6 +879,9 @@ static void perform_idle_server_maintena
}
else if (retained->idle_spawn_rate < MAX_SPAWN_RATE) {
retained->idle_spawn_rate *= 2;
+ if (retained->idle_spawn_rate > MAX_SPAWN_RATE) {
+ retained->idle_spawn_rate = MAX_SPAWN_RATE;
+ }
}
}
}

Modified: httpd/httpd/trunk/server/mpm/worker/worker.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/server/mpm/worker/worker.c?rev=1893471&r1=1893470&r2=1893471&view=diff
==============================================================================
--- httpd/httpd/trunk/server/mpm/worker/worker.c (original)
+++ httpd/httpd/trunk/server/mpm/worker/worker.c Mon Sep 20 14:27:42 2021
@@ -173,13 +173,15 @@ typedef struct worker_retained_data {
* reset only when a cycle goes by without the need to spawn.
*/
int *idle_spawn_rate;
-#ifndef MAX_SPAWN_RATE
-#define MAX_SPAWN_RATE (32)
-#endif
int hold_off_on_exponential_spawning;
} worker_retained_data;
static worker_retained_data *retained;

+#ifndef MAX_SPAWN_RATE
+#define MAX_SPAWN_RATE 32
+#endif
+static int max_spawn_rate_per_bucket = MAX_SPAWN_RATE / 1;
+
#define MPM_CHILD_PID(i) (ap_scoreboard_image->parent[i].pid)

/* The structure used to pass unique initialization info to each thread */
@@ -1444,7 +1446,7 @@ static void perform_idle_server_maintena
if (any_dead_threads
&& bucket == child_bucket
&& totally_free_length < retained->idle_spawn_rate[child_bucket]
- && free_length < MAX_SPAWN_RATE / num_buckets
+ && free_length < max_spawn_rate_per_bucket
&& (!ps->pid /* no process in the slot */
|| ps->quiescing)) { /* or at least one is going away */
if (all_dead_threads) {
@@ -1563,8 +1565,12 @@ static void perform_idle_server_maintena
--retained->hold_off_on_exponential_spawning;
}
else if (retained->idle_spawn_rate[child_bucket]
- < MAX_SPAWN_RATE / num_buckets) {
- retained->idle_spawn_rate[child_bucket] *= 2;
+ < max_spawn_rate_per_bucket) {
+ int new_rate = retained->idle_spawn_rate[child_bucket] * 2;
+ if (new_rate > max_spawn_rate_per_bucket) {
+ new_rate = max_spawn_rate_per_bucket;
+ }
+ retained->idle_spawn_rate[child_bucket] = new_rate;
}
}
}
@@ -1840,6 +1846,11 @@ static int worker_run(apr_pool_t *_pconf
if (max_spare_threads < min_spare_threads + (threads_per_child + 1) * num_buckets)
max_spare_threads = min_spare_threads + (threads_per_child + 1) * num_buckets;

+ max_spawn_rate_per_bucket = (MAX_SPAWN_RATE + num_buckets - 1) / num_buckets;
+ if (max_spawn_rate_per_bucket < 1) {
+ max_spawn_rate_per_bucket = 1;
+ }
+
/* If we're doing a graceful_restart then we're going to see a lot
* of children exiting immediately when we get into the main loop
* below (because we just sent them AP_SIG_GRACEFUL). This happens pretty