diff options
| author | luwenpeng <[email protected]> | 2020-07-28 17:41:54 +0800 |
|---|---|---|
| committer | luwenpeng <[email protected]> | 2020-08-21 09:45:30 +0800 |
| commit | f1b2d638166efa3a6a61ef00e5280970d6476bdb (patch) | |
| tree | 3289526f2f700687013605ed9166693162e12ee2 /platform/src/proxy.cpp | |
| parent | c82429c9d99a8437d1ce1185268481abd9688a75 (diff) | |
增加 load_balance 配置项:TFE 支持 round_robin/least_conn 负载均衡算法
Diffstat (limited to 'platform/src/proxy.cpp')
| -rw-r--r-- | platform/src/proxy.cpp | 33 |
1 files changed, 25 insertions, 8 deletions
diff --git a/platform/src/proxy.cpp b/platform/src/proxy.cpp index 2887928..9d814a4 100644 --- a/platform/src/proxy.cpp +++ b/platform/src/proxy.cpp @@ -93,19 +93,34 @@ static __attribute__((__used__)) const char * tfe_version = "Unknown"; struct tfe_thread_ctx * tfe_proxy_thread_ctx_acquire(struct tfe_proxy * ctx) { unsigned int min_thread_id = 0; + unsigned int min_load; static unsigned int counter=0; counter++; - /* - for (unsigned int tid = 0; tid < ctx->nr_work_threads; tid++) + + // least_conn + if (ctx->load_balance == LEAST_CONN) { - struct tfe_thread_ctx * thread_ctx = ctx->work_threads[tid]; - unsigned int thread_load = ATOMIC_READ(&thread_ctx->load); + for (unsigned int tid = 0; tid < ctx->nr_work_threads; tid++) + { + struct tfe_thread_ctx * thread_ctx = ctx->work_threads[tid]; + unsigned int thread_load = ATOMIC_READ(&thread_ctx->load); + if (tid == 0) + { + min_thread_id = tid; + min_load = thread_load; + continue; + } - min_thread_id = min_load > thread_load ? tid : min_thread_id; - min_load = min_load > thread_load ? thread_load : min_load; + min_thread_id = min_load > thread_load ? tid : min_thread_id; + min_load = min_load > thread_load ? thread_load : min_load; + } + } + // round_robin + else + { + min_thread_id = counter % ctx->nr_work_threads; } -*/ - min_thread_id=counter%ctx->nr_work_threads; + ATOMIC_INC(&ctx->work_threads[min_thread_id]->load); return ctx->work_threads[min_thread_id]; } @@ -308,6 +323,8 @@ int tfe_proxy_config(struct tfe_proxy * proxy, const char * profile) MESA_load_profile_uint_def(profile, "system", "buffer_output_limit", &proxy->buffer_output_limit, 0); MESA_load_profile_uint_def(profile, "system", "enable_cpu_affinity", &proxy->enable_cpu_affinity, 0); MESA_load_profile_uint_range(profile, "system", "cpu_affinity_mask", TFE_THREAD_MAX, proxy->cpu_affinity_mask); + // LEAST_CONN = 0; ROUND_ROBIN = 1, + MESA_load_profile_uint_def(profile, "system", "load_balance", (unsigned int *)&proxy->load_balance, ROUND_ROBIN); if (proxy->nr_work_threads < 1 || proxy->nr_work_threads > TFE_THREAD_MAX) { |
