diff --git a/conf/tfe/tfe.conf b/conf/tfe/tfe.conf index 76b4973..fa5d0bd 100644 --- a/conf/tfe/tfe.conf +++ b/conf/tfe/tfe.conf @@ -8,6 +8,8 @@ enable_cpu_affinity=0 # the first mask for acceptor thread # the others mask for worker thread cpu_affinity_mask=1-9,10-12 +# LEAST_CONN = 0; ROUND_ROBIN = 1, default 1 +load_balance=1 [kni] ip=192.168.100.1 diff --git a/platform/include/internal/proxy.h b/platform/include/internal/proxy.h index 40223e8..92a64d6 100644 --- a/platform/include/internal/proxy.h +++ b/platform/include/internal/proxy.h @@ -80,6 +80,12 @@ struct tfe_proxy_accept_para unsigned int keyring_id; }; +enum tfe_load_balance_algo +{ + LEAST_CONN = 0, + ROUND_ROBIN = 1, +}; + struct tfe_proxy { char name[TFE_SYMBOL_MAX]; @@ -128,6 +134,9 @@ struct tfe_proxy /* cpu affinity */ unsigned int enable_cpu_affinity; unsigned int cpu_affinity_mask[TFE_THREAD_MAX]; + + /* load balancing */ + enum tfe_load_balance_algo load_balance; }; extern struct tfe_proxy * g_default_proxy; 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++) - { - struct tfe_thread_ctx * thread_ctx = ctx->work_threads[tid]; - unsigned int thread_load = ATOMIC_READ(&thread_ctx->load); - min_thread_id = min_load > thread_load ? tid : min_thread_id; - min_load = min_load > thread_load ? thread_load : min_load; + // least_conn + if (ctx->load_balance == LEAST_CONN) + { + 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=counter%ctx->nr_work_threads; + // round_robin + else + { + 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) {