Add spare2 cheaper algorithm for larger workload

This commit is contained in:
INADA Naoki
2015-06-16 15:38:12 +09:00
parent df22643654
commit f3bd8a9fab
4 changed files with 73 additions and 0 deletions
+1
View File
@@ -111,6 +111,7 @@ void uwsgi_init_default() {
uwsgi.listen_queue = 100;
uwsgi.cheaper_overload = 3;
uwsgi.cheaper_idle = 10;
uwsgi.log_master_bufsize = 8192;
+68
View File
@@ -333,6 +333,72 @@ healthy:
}
/*
-- Cheaper, spare2 algorithm, for large workload --
This algorithm is very similar to spare, but more suited for higher workload.
This algorithm increase workers *before* overloaded, and decrease workers slowly.
This algorithm uses these options: chaper, cheaper-initial, cheaper-step and cheaper-idle.
* When number of idle workers is smaller than cheaper count, increase
min(cheaper-step, cheaper - idle workers) workers.
* When number of idle workers is larger than cheaper count, increase idle_count.
* When idle_count >= cheaper-idle, decrease worker.
*/
int uwsgi_cheaper_algo_spare2(int can_spawn) {
static int idle_count = 0;
int i, idle_workers, busy_workers, cheaped_workers;
// count the number of idle and busy workers
idle_workers = busy_workers = 0;
for (i = 1; i <= uwsgi.numproc; i++) {
if (uwsgi.workers[i].cheaped == 0 && uwsgi.workers[i].pid > 0) {
if (uwsgi_worker_is_busy(i) == 1) {
busy_workers++;
} else {
idle_workers++;
}
}
}
cheaped_workers = uwsgi.numproc - (idle_workers + busy_workers);
#ifdef UWSGI_DEBUG
uwsgi_log("cheaper-spare2: idle=%d, busy=%d, cheaped=%d, idle_count=%d\n",
idle_workers, busy_workers, cheaped_workers, idle_count);
#endif
// should we increase workers?
if (idle_workers < uwsgi.cheaper_count) {
int spawn;
idle_count = 0;
if (!can_spawn)
return 0;
spawn = uwsgi.cheaper_count - idle_workers;
if (spawn > cheaped_workers)
spawn = cheaped_workers;
if (spawn > uwsgi.cheaper_step)
spawn = uwsgi.cheaper_step;
return spawn;
}
if (idle_workers == uwsgi.cheaper_count) {
idle_count = 0;
return 0;
}
// decrease workers
idle_count++;
if (idle_count < uwsgi.cheaper_idle)
return 0;
idle_count = 0;
return -1;
}
/*
@@ -1869,3 +1935,5 @@ void uwsgi_dump_worker(int wid, char *msg) {
}
uwsgi_log_verbose("%s !!! end of worker %d status !!!\n",msg, wid);
}
/* vim: set ts=8 sts=0 sw=0 noexpandtab : */
+2
View File
@@ -790,6 +790,7 @@ static struct uwsgi_option uwsgi_base_options[] = {
{"cheaper-algo", required_argument, 0, "choose to algorithm used for adaptive process spawning", uwsgi_opt_set_str, &uwsgi.requested_cheaper_algo, UWSGI_OPT_MASTER},
{"cheaper-step", required_argument, 0, "number of additional processes to spawn at each overload", uwsgi_opt_set_int, &uwsgi.cheaper_step, UWSGI_OPT_MASTER | UWSGI_OPT_CHEAPER},
{"cheaper-overload", required_argument, 0, "increase workers after specified overload", uwsgi_opt_set_64bit, &uwsgi.cheaper_overload, UWSGI_OPT_MASTER | UWSGI_OPT_CHEAPER},
{"cheaper-idle", required_argument, 0, "decrease workers after specified idle (algo: spare2) (default: 10)", uwsgi_opt_set_int, &uwsgi.cheaper_idle, UWSGI_OPT_MASTER | UWSGI_OPT_CHEAPER},
{"cheaper-algo-list", no_argument, 0, "list enabled cheapers algorithms", uwsgi_opt_true, &uwsgi.cheaper_algo_list, 0},
{"cheaper-algos-list", no_argument, 0, "list enabled cheapers algorithms", uwsgi_opt_true, &uwsgi.cheaper_algo_list, 0},
{"cheaper-list", no_argument, 0, "list enabled cheapers algorithms", uwsgi_opt_true, &uwsgi.cheaper_algo_list, 0},
@@ -2361,6 +2362,7 @@ configure:
// setup cheaper algos
uwsgi_register_cheaper_algo("spare", uwsgi_cheaper_algo_spare);
uwsgi_register_cheaper_algo("spare2", uwsgi_cheaper_algo_spare2);
uwsgi_register_cheaper_algo("backlog", uwsgi_cheaper_algo_backlog);
uwsgi_register_cheaper_algo("manual", uwsgi_cheaper_algo_manual);
+2
View File
@@ -2802,6 +2802,7 @@ struct uwsgi_server {
int die_on_no_workers;
int spooler_cheap;
int cheaper_idle;
};
struct uwsgi_rpc {
@@ -3953,6 +3954,7 @@ time_t uwsgi_now(void);
int uwsgi_calc_cheaper(void);
int uwsgi_cheaper_algo_spare(int);
int uwsgi_cheaper_algo_spare2(int);
int uwsgi_cheaper_algo_backlog(int);
int uwsgi_cheaper_algo_backlog2(int);
int uwsgi_cheaper_algo_manual(int);