######################################### Changes * Free-up slots when a WORKER or PROCESSOR unexpectedly dies * Fixed bug when MinSpareProcessors is set to 0 (now all workers processes are killed when idle_timeout is reached) * Performance tuning (determine_child_fate() and child_main()). My htttpd.conf: IdleTimeout 600 ExpireTimeout 1800 MinSpareProcessors 0 MaxSpareProcessors 10 MinProcessors 0 MaxProcessors 50 ServerLimit 2000 MaxClients 1000 MaxRequestsPerChild 1000 MinMultiplexers 50 MaxMultiplexers 200 MultiplexerIdleTimeout 600 ProcessorWaitTimeout 2 5 -- Marcelo Coelho marcelo@mco2.com.br ######################################### --- peruser-original.c 2010-12-24 16:50:13.000000000 -0200 +++ peruser.c 2010-12-24 16:49:21.000000000 -0200 @@ -1869,6 +1869,7 @@ int fd; apr_socket_t *sock = NULL; apr_socket_t *pod_sock = NULL; + int i_total_processors; /* for benefit of any hooks that run as this * child initializes @@ -2091,12 +2092,11 @@ idle_processors(my_child_num), CHILD_INFO_TABLE[my_child_num].senv->min_free_processors); - if (total_processors(my_child_num) - < CHILD_INFO_TABLE[my_child_num].senv->max_processors - && (idle_processors(my_child_num) - <= CHILD_INFO_TABLE[my_child_num].senv->min_free_processors - || total_processors(my_child_num) - < CHILD_INFO_TABLE[my_child_num].senv->min_processors)) { + i_total_processors = total_processors(my_child_num); + + if (i_total_processors < CHILD_INFO_TABLE[my_child_num].senv->max_processors && + (idle_processors(my_child_num) <= CHILD_INFO_TABLE[my_child_num].senv->min_free_processors + || i_total_processors < CHILD_INFO_TABLE[my_child_num].senv->min_processors)) { _DBG("CLONING CHILD"); child_clone(); @@ -2449,7 +2449,8 @@ { time_t idle_time = apr_time_sec(now - child_sb->last_used); - if (total_processes(childnum) <= child->senv->min_processors) { + if (child->senv->min_processors > 0 && + total_processes(childnum) <= child->senv->min_processors) { /* We will not kill a child, if the senv needs live workers */ return 0; } @@ -2457,8 +2458,8 @@ if (child->type == CHILD_TYPE_PROCESSOR || child->type == CHILD_TYPE_WORKER) { - if (idle_processors(childnum) <= child->senv->min_free_processors || - child->senv->min_free_processors == 0) { + if (child->senv->min_free_processors > 0 && + idle_processors(childnum) <= child->senv->min_free_processors) { /* We will not kill a child, if the senv needs idle workers */ return 0; } @@ -2514,6 +2515,15 @@ } if (child->pid == 0) { + if (child->type != CHILD_TYPE_PROCESSOR && + (child->status == CHILD_STATUS_ACTIVE || child->status == CHILD_STATUS_READY) && + child_sb->status == SERVER_DEAD) { + child->status = CHILD_STATUS_STANDBY; + /* completely free up this slot */ + child->senv = (server_env_t*) NULL; + child->type = CHILD_TYPE_UNKNOWN; + child->sock_fd = -3; /* -1 and -2 are taken */ + } if (child->status == CHILD_STATUS_STARTING) { make_child(ap_server_conf, i); }