summaryrefslogtreecommitdiff
path: root/platform/src/proxy.cpp
diff options
context:
space:
mode:
authorluwenpeng <[email protected]>2020-07-28 17:41:54 +0800
committerluwenpeng <[email protected]>2020-08-21 09:45:30 +0800
commitf1b2d638166efa3a6a61ef00e5280970d6476bdb (patch)
tree3289526f2f700687013605ed9166693162e12ee2 /platform/src/proxy.cpp
parentc82429c9d99a8437d1ce1185268481abd9688a75 (diff)
增加 load_balance 配置项:TFE 支持 round_robin/least_conn 负载均衡算法
Diffstat (limited to 'platform/src/proxy.cpp')
-rw-r--r--platform/src/proxy.cpp33
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)
{