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