manoj 99/05/23 23:53:37
Modified: pthreads/src/include httpd.h pthreads/src/main http_config.c http_core.c http_main.c Log: Change the algorithm for spare server maintanence to base its decisions on the number of idle threads, rather than the number of mostly idle processes. Revision Changes Path 1.15 +0 -8 apache-apr/pthreads/src/include/httpd.h Index: httpd.h =================================================================== RCS file: /home/cvs/apache-apr/pthreads/src/include/httpd.h,v retrieving revision 1.14 retrieving revision 1.15 diff -u -u -r1.14 -r1.15 --- httpd.h 1999/04/14 21:03:19 1.14 +++ httpd.h 1999/05/24 06:53:32 1.15 @@ -370,14 +370,6 @@ #define DEFAULT_THREADS_PER_CHILD 50 #endif -#ifndef DEFAULT_IDLE_THRESHOLD -#define DEFAULT_IDLE_THRESHOLD (int)(DEFAULT_THREADS_PER_CHILD * 0.05) -#endif - -#ifndef DEFAULT_BUSY_THRESHOLD -#define DEFAULT_BUSY_THRESHOLD (DEFAULT_THREADS_PER_CHILD - (int)(DEFAULT_THREADS_PER_CHILD * 0.05)) -#endif - #ifndef DEFAULT_EXCESS_REQUESTS_PER_CHILD #define DEFAULT_EXCESS_REQUESTS_PER_CHILD 0 #endif 1.12 +0 -2 apache-apr/pthreads/src/main/http_config.c Index: http_config.c =================================================================== RCS file: /home/cvs/apache-apr/pthreads/src/main/http_config.c,v retrieving revision 1.11 retrieving revision 1.12 diff -u -u -r1.11 -r1.12 --- http_config.c 1999/03/17 17:01:18 1.11 +++ http_config.c 1999/05/24 06:53:33 1.12 @@ -1394,8 +1394,6 @@ ap_lock_fname = DEFAULT_LOCKFILE; ap_max_requests_per_child = DEFAULT_MAX_REQUESTS_PER_CHILD; ap_threads_per_child = DEFAULT_THREADS_PER_CHILD; - ap_idle_thread_threshold = DEFAULT_IDLE_THRESHOLD; - ap_busy_thread_threshold = DEFAULT_BUSY_THRESHOLD; /* ZZZ Initialize the Network Address here. */ ap_bind_address.s_addr = htonl(INADDR_ANY); ap_listeners = NULL; 1.13 +0 -35 apache-apr/pthreads/src/main/http_core.c Index: http_core.c =================================================================== RCS file: /home/cvs/apache-apr/pthreads/src/main/http_core.c,v retrieving revision 1.12 retrieving revision 1.13 diff -u -u -r1.12 -r1.13 --- http_core.c 1999/04/14 21:03:28 1.12 +++ http_core.c 1999/05/24 06:53:33 1.13 @@ -2155,28 +2155,7 @@ return NULL; } -static const char *set_idle_threshold(cmd_parms *cmd, void *dummy, char *arg) -{ - const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY); - if (err != NULL) { - return err; - } - ap_idle_thread_threshold = atoi(arg); - return NULL; -} - -static const char *set_busy_threshold(cmd_parms *cmd, void *dummy, char *arg) -{ - const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY); - if (err != NULL) { - return err; - } - - ap_busy_thread_threshold = atoi(arg); - return NULL; -} - static const char *set_max_free_servers(cmd_parms *cmd, void *dummy, char *arg) { const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY); @@ -2224,8 +2203,6 @@ } static const char *set_threads(cmd_parms *cmd, void *dummy, char *arg) { - int user_def_idle = ap_idle_thread_threshold; - int user_def_busy = ap_busy_thread_threshold; const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY); if (err != NULL) { return err; @@ -2233,14 +2210,6 @@ ap_threads_per_child = atoi(arg); - ap_idle_thread_threshold = (int)(ap_threads_per_child * 0.05); - ap_busy_thread_threshold = ap_threads_per_child - (int)(ap_threads_per_child * 0.05); - - if (user_def_idle != DEFAULT_IDLE_THRESHOLD) - ap_idle_thread_threshold = user_def_idle; - if (user_def_busy != DEFAULT_BUSY_THRESHOLD) - ap_busy_thread_threshold = user_def_busy; - if (ap_threads_per_child < 1) { fprintf(stderr, "WARNING: Require ThreadsPerChild > 0, setting to 1\n"); ap_threads_per_child = 1; @@ -2838,10 +2807,6 @@ "Maximum number of idle children" }, { "MaxServers", set_max_free_servers, NULL, RSRC_CONF, TAKE1, "Deprecated equivalent to MaxSpareServers" }, -{ "IdleThreadThreshold", set_idle_threshold, NULL, RSRC_CONF, TAKE1, - "Minimum number of idle threads, below which process is considered ready for reaping." }, -{ "BusyThreadThreshold", set_busy_threshold, NULL, RSRC_CONF, TAKE1, - "Maximum number of idle threads, above which process is considered busy." }, { "ServersSafetyLimit", set_server_limit, NULL, RSRC_CONF, TAKE1, "Deprecated equivalent to MaxClients" }, { "MaxClients", set_server_limit, NULL, RSRC_CONF, TAKE1, 1.84 +16 -20 apache-apr/pthreads/src/main/http_main.c Index: http_main.c =================================================================== RCS file: /home/cvs/apache-apr/pthreads/src/main/http_main.c,v retrieving revision 1.83 retrieving revision 1.84 diff -u -u -r1.83 -r1.84 --- http_main.c 1999/05/24 06:29:43 1.83 +++ http_main.c 1999/05/24 06:53:34 1.84 @@ -2079,8 +2079,7 @@ static void perform_idle_server_maintenance(void) { int i, j; - int to_kill; - int idle_count, idle_thread_count; + int idle_count_ceil, idle_count_floor, idle_thread_count; thread_score *ss; time_t now = 0; int free_length; @@ -2091,8 +2090,9 @@ /* initialize the free_list */ free_length = 0; - to_kill = -1; - idle_count = 0; + idle_count_ceil = 0; + idle_count_floor = 0; + idle_thread_count = 0; last_non_dead = -1; total_non_dead = 0; @@ -2103,8 +2103,8 @@ int status = SERVER_DEAD; int any_dying_threads = 0; int all_dead_threads = 1; + int idle_thread_addition = 0; - idle_thread_count = 0; if (i >= max_daemons_limit && free_length == idle_spawn_rate) break; for (j = 0; j < ap_threads_per_child; j++) { @@ -2122,13 +2122,7 @@ * This depends on the ordering of SERVER_READY and SERVER_STARTING. */ if (status <= SERVER_READY) { - ++ idle_thread_count; - /* always kill the highest numbered child if we have to... - * no really well thought out reason ... other than observing - * the server behaviour under linux where lower numbered - * children tend to service more hits (and hence are more - * likely to have their data in cpu caches). - */ + ++idle_thread_addition; } } if (all_dead_threads && free_length < idle_spawn_rate) { @@ -2140,15 +2134,17 @@ } if (!any_dying_threads) { ++total_non_dead; - - if (idle_thread_count > ap_idle_thread_threshold) { - idle_count++; - to_kill = i; - } + idle_thread_count += idle_thread_addition; } } max_daemons_limit = last_non_dead + 1; - if (idle_count > ap_daemons_max_free) { + idle_count_floor = idle_thread_count / ap_threads_per_child; + idle_count_ceil = idle_count_floor; + if (idle_thread_count % ap_threads_per_child) { + idle_count_ceil++; + } + + if (idle_count_ceil > ap_daemons_max_free) { /* Kill off one child */ char char_of_death = '!'; if (write(ap_pipe_of_death[1], &char_of_death, 1) == -1) { @@ -2156,7 +2152,7 @@ } idle_spawn_rate = 1; } - else if (idle_count < ap_daemons_min_free) { + else if (idle_count_floor < ap_daemons_min_free) { /* terminate the free list */ if (free_length == 0) { /* only report this condition once */ @@ -2179,7 +2175,7 @@ "to increase StartServers, or Min/MaxSpareServers), " "spawning %d children, there are %d idle, and " "%d total children", idle_spawn_rate, - idle_count, total_non_dead); + idle_count_floor, total_non_dead); } for (i = 0; i < free_length; ++i) { make_child(server_conf, free_slots[i], now);