summaryrefslogtreecommitdiff
path: root/shaping/src/shaper.cpp
diff options
context:
space:
mode:
author刘畅 <[email protected]>2024-05-22 10:03:59 +0000
committer刘畅 <[email protected]>2024-05-22 10:03:59 +0000
commitdbb0f42537aee97e8f393f9f8a84856fb8aec5af (patch)
tree39a18f2be166409df8e813c0e7e248b26b56d0af /shaping/src/shaper.cpp
parentf28ff34822b16563fb181c89f337e19a37a72514 (diff)
parent12480d8e9913cee188e5d1a4544428a1dc525c38 (diff)
Merge branch 'performance_optimize' into 'rel'v3.1.36
TSG-21276:异步转发增加限制不让本地token负值太高 See merge request tango/shaping-engine!96
Diffstat (limited to 'shaping/src/shaper.cpp')
-rw-r--r--shaping/src/shaper.cpp112
1 files changed, 63 insertions, 49 deletions
diff --git a/shaping/src/shaper.cpp b/shaping/src/shaper.cpp
index 16c9475..4accf9c 100644
--- a/shaping/src/shaper.cpp
+++ b/shaping/src/shaper.cpp
@@ -379,7 +379,6 @@ int shaper_flow_in_order_get(struct shaper *sp, struct shaper_flow_instance sf_i
avl_node = avl_tree_next_in_order_node_get(avl_node);
}
-
return count;
}
@@ -412,7 +411,43 @@ static int shaper_profile_async_pass_get(struct shaping_profile_info *profile, u
}
}
-static void shaper_deposit_token_add(struct shaping_profile_info *profile, int req_token_bits, unsigned char direction, int priority)
+static void shaper_token_multiple_update(struct shaping_thread_ctx *ctx, struct shaping_profile_info *profile)
+{
+ if (profile->type != PROFILE_TYPE_GENERIC) {
+ return;
+ }
+
+ struct shaper_token_multiple *token_multiple = &profile->hash_node->token_multiple;
+ int curr_multiple = token_multiple->token_get_multiple;
+ time_t curr_time_s = time(NULL);
+ int token_multiple_min = ctx->conf.token_multiple_min;
+ int token_multiple_max = ctx->conf.token_multiple_max;
+
+ if (curr_time_s - token_multiple->token_multiple_update_time_s < TOKEN_MULTIPLE_UPDATE_INTERVAL_S) {
+ return;
+ }
+
+ token_multiple->token_multiple_update_time_s = curr_time_s;
+
+ if (token_multiple->has_failed_get_token) {
+ token_multiple->token_get_multiple = (curr_multiple - 1) < token_multiple_min ? token_multiple_min : (curr_multiple - 1);
+ goto END;
+ }
+
+ if (token_multiple->token_not_enough) {
+ token_multiple->token_get_multiple = (curr_multiple + 1) > token_multiple_max ? token_multiple_max : (curr_multiple + 1);
+ goto END;
+ }
+
+END:
+ LOG_INFO("%s: profile id %d, token_get_multiple %d, has_failed_get_token %d, token_not_enough %d", LOG_TAG_SHAPING, profile->id, token_multiple->token_get_multiple, token_multiple->has_failed_get_token, token_multiple->token_not_enough);
+ token_multiple->has_failed_get_token = 0;
+ token_multiple->token_not_enough = 0;
+
+ return;
+}
+
+static void shaper_deposit_token_add(struct shaping_thread_ctx *ctx, struct shaping_profile_info *profile, int req_token_bits, unsigned char direction, int priority)
{
long long *deposit_token;
struct shaping_profile_hash_node *pf_hash_node = profile->hash_node;
@@ -446,45 +481,12 @@ static void shaper_deposit_token_add(struct shaping_profile_info *profile, int r
*deposit_token += req_token_bits;
if (*deposit_token > 0) {
shaper_profile_async_pass_set(profile, direction, priority, 1);
+ } else {
+ pf_hash_node->token_multiple.token_not_enough = 1;
+ shaper_token_multiple_update(ctx, profile);
}
}
-static void shaper_token_multiple_update(struct shaping_thread_ctx *ctx, struct shaping_profile_info *profile)
-{
- if (profile->type != PROFILE_TYPE_GENERIC) {
- return;
- }
-
- struct shaper_token_multiple *token_multiple = &profile->hash_node->token_multiple;
- int curr_multiple = token_multiple->token_get_multiple;
- time_t curr_time_s = time(NULL);
- int token_multiple_min = ctx->conf.token_multiple_min;
- int token_multiple_max = ctx->conf.token_multiple_max;
-
- if (curr_time_s - token_multiple->token_multiple_update_time_s < TOKEN_MULTIPLE_UPDATE_INTERVAL_S) {
- return;
- }
-
- token_multiple->token_multiple_update_time_s = curr_time_s;
-
- if (token_multiple->has_failed_get_token) {
- token_multiple->token_get_multiple = (curr_multiple - 1) < token_multiple_min ? token_multiple_min : (curr_multiple - 1);
- goto END;
- }
-
- if (token_multiple->has_drop_by_queue_full) {
- token_multiple->token_get_multiple = (curr_multiple + 1) > token_multiple_max ? token_multiple_max : (curr_multiple + 1);
- goto END;
- }
-
-END:
- LOG_INFO("%s: profile id %d, token_get_multiple %d, has_failed_get_token %d, has_drop_by_queue_full %d", LOG_TAG_SHAPING, profile->id, token_multiple->token_get_multiple, token_multiple->has_failed_get_token, token_multiple->has_drop_by_queue_full);
- token_multiple->has_failed_get_token = 0;
- token_multiple->has_drop_by_queue_full = 0;
-
- return;
-}
-
static void shaper_token_get_cb(const struct swarmkv_reply *reply, void * cb_arg)
{
struct shaping_tconsume_cb_arg *arg = (struct shaping_tconsume_cb_arg*)cb_arg;
@@ -519,7 +521,7 @@ static void shaper_token_get_cb(const struct swarmkv_reply *reply, void * cb_arg
}
if (reply->integer > 0) {
- shaper_deposit_token_add(profile, reply->integer, arg->direction, profile->priority);//deposit tokens to profile
+ shaper_deposit_token_add(ctx, profile, reply->integer, arg->direction, profile->priority);//deposit tokens to profile
}
if (reply->integer == 0) {
@@ -537,12 +539,12 @@ END:
if (reply->type != SWARMKV_REPLY_INTEGER || reply->integer == 0) {
switch (profile->type) {
case PROFILE_TYPE_GENERIC:
- pf_hash_node->last_failed_get_token_ms = curr_time.tv_sec * MILLI_SECONDS_PER_SEC + curr_time.tv_nsec / NANO_SECONDS_PER_MILLI_SEC;
+ pf_hash_node->last_failed_get_token_ms[arg->direction] = curr_time.tv_sec * MILLI_SECONDS_PER_SEC + curr_time.tv_nsec / NANO_SECONDS_PER_MILLI_SEC;
break;
case PROFILE_TYPE_HOST_FARINESS:
case PROFILE_TYPE_MAX_MIN_HOST_FAIRNESS:
case PROFILE_TYPE_SPLIT_BY_LOCAL_HOST:
- profile->last_failed_get_token_ms = curr_time.tv_sec * MILLI_SECONDS_PER_SEC + curr_time.tv_nsec / NANO_SECONDS_PER_MILLI_SEC;
+ profile->last_failed_get_token_ms[arg->direction] = curr_time.tv_sec * MILLI_SECONDS_PER_SEC + curr_time.tv_nsec / NANO_SECONDS_PER_MILLI_SEC;
break;
}
}
@@ -560,6 +562,7 @@ static int shaper_deposit_token_get(struct shaping_profile_info *profile, int re
long long *deposit_token;
struct shaping_profile_hash_node *pf_hash_node = profile->hash_node;
int ret = -1;
+ int token_multiple;
switch (profile->type) {
case PROFILE_TYPE_GENERIC:
@@ -570,9 +573,19 @@ static int shaper_deposit_token_get(struct shaping_profile_info *profile, int re
} else {
deposit_token = &pf_hash_node->out_deposit_token_bits[priority];
}
+ token_multiple = pf_hash_node->token_multiple.token_get_multiple;
break;
case PROFILE_TYPE_HOST_FARINESS:
case PROFILE_TYPE_MAX_MIN_HOST_FAIRNESS:
+ if (pf_hash_node->limit_direction == PROFILE_LIMIT_DIRECTION_BIDIRECTION) {
+ deposit_token = &profile->bidirection_deposit_token_bits;
+ } else if (direction == SHAPING_DIR_IN) {
+ deposit_token = &profile->in_deposit_token_bits;
+ } else {
+ deposit_token = &profile->out_deposit_token_bits;
+ }
+ token_multiple = 1;
+ break;
case PROFILE_TYPE_SPLIT_BY_LOCAL_HOST:
if (pf_hash_node->limit_direction == PROFILE_LIMIT_DIRECTION_BIDIRECTION) {
deposit_token = &profile->bidirection_deposit_token_bits;
@@ -581,6 +594,7 @@ static int shaper_deposit_token_get(struct shaping_profile_info *profile, int re
} else {
deposit_token = &profile->out_deposit_token_bits;
}
+ token_multiple = TOKEN_MULTIPLE_DEFAULT;
break;
default:
LOG_ERROR("%s: invalid profile type %d, profile id %d", LOG_TAG_SHAPING, profile->type, profile->id);
@@ -596,6 +610,10 @@ static int shaper_deposit_token_get(struct shaping_profile_info *profile, int re
ret = 0;
}
+ if (*deposit_token + (req_token_bits * token_multiple * 2) < 0) {
+ shaper_profile_async_pass_set(profile, direction, priority, 0);
+ }
+
return ret;
}
@@ -786,18 +804,18 @@ void shaper_profile_hash_node_set(struct shaping_thread_ctx *ctx, struct shaping
return;
}
-static int shaping_swarmkv_is_too_short_interval(long long curr_time_ms, struct shaping_profile_info *profile)
+static int shaping_swarmkv_is_too_short_interval(long long curr_time_ms, struct shaping_profile_info *profile, unsigned char direction)
{
long long last_failed_ms = 0;
switch (profile->type) {
case PROFILE_TYPE_GENERIC:
- last_failed_ms = profile->hash_node->last_failed_get_token_ms;
+ last_failed_ms = profile->hash_node->last_failed_get_token_ms[direction];
break;
case PROFILE_TYPE_HOST_FARINESS:
case PROFILE_TYPE_MAX_MIN_HOST_FAIRNESS:
case PROFILE_TYPE_SPLIT_BY_LOCAL_HOST:
- last_failed_ms = profile->last_failed_get_token_ms;
+ last_failed_ms = profile->last_failed_get_token_ms[direction];
break;
}
@@ -842,7 +860,7 @@ static int shaper_token_consume(struct shaping_thread_ctx *ctx, struct shaping_f
long long curr_time_ms = curr_timespec->tv_sec * MILLI_SECONDS_PER_SEC + curr_timespec->tv_nsec / NANO_SECONDS_PER_MILLI_SEC;
- if (shaping_swarmkv_is_too_short_interval(curr_time_ms, profile)) {
+ if (shaping_swarmkv_is_too_short_interval(curr_time_ms, profile, direction)) {
return ret;
}
@@ -1036,8 +1054,6 @@ DROP:
shaper_stat_drop_inc(&pf_info->stat, meta->dir, ctx->thread_index);
sf->anchor = 0;
- pf_info->hash_node->token_multiple.has_drop_by_queue_full = 1;
- shaper_token_multiple_update(ctx, pf_info);
return SHAPING_DROP;
}
@@ -1156,8 +1172,6 @@ void shaping_packet_process(struct shaping_thread_ctx *ctx, marsio_buff_t *rx_bu
shaper_global_stat_queueing_inc(&ctx->thread_global_stat, meta->raw_len);
} else {
struct shaping_profile_info *pf_info = &s_rule->primary;
- pf_info->hash_node->token_multiple.has_drop_by_queue_full = 1;
- shaper_token_multiple_update(ctx, pf_info);
shaper_stat_drop_inc(&pf_info->stat, meta->dir, ctx->thread_index);
shaper_global_stat_drop_inc(&ctx->thread_global_stat, meta->raw_len);