summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Perry <mikeperry-git@torproject.org>2022-11-08 17:39:34 +0000
committerDavid Goulet <dgoulet@torproject.org>2022-11-08 12:47:14 -0500
commit00633bc619046e09536d742e5f862d75c35e476f (patch)
treeb91888bcffe616ed4bd1d947a9fee2f7d55ff08b
parentfde87096c35259f9cda42fc5cc812b0bb122a82e (diff)
downloadtor-00633bc619046e09536d742e5f862d75c35e476f.tar.gz
tor-00633bc619046e09536d742e5f862d75c35e476f.zip
metrics: Report amount of cwnd drop from delta and gamma
Part of #40708.
-rw-r--r--src/core/or/congestion_control_vegas.c28
-rw-r--r--src/core/or/congestion_control_vegas.h2
-rw-r--r--src/feature/relay/relay_metrics.c18
3 files changed, 48 insertions, 0 deletions
diff --git a/src/core/or/congestion_control_vegas.c b/src/core/or/congestion_control_vegas.c
index 87f59d12fd..8351aa6e27 100644
--- a/src/core/or/congestion_control_vegas.c
+++ b/src/core/or/congestion_control_vegas.c
@@ -52,8 +52,12 @@
/** Moving average of the cc->cwnd from each circuit exiting slowstart. */
double cc_stats_vegas_exit_ss_cwnd_ma = 0;
+double cc_stats_vegas_gamma_drop_ma = 0;
+double cc_stats_vegas_delta_drop_ma = 0;
/* Running count of this moving average. Needed so we can update it. */
static double stats_cwnd_exit_ss_ma_count = 0;
+static double stats_cwnd_gamma_drop_ma_count = 0;
+static double stats_cwnd_delta_drop_ma_count = 0;
/** Stats on how many times we reached "delta" param. */
uint64_t cc_stats_vegas_above_delta = 0;
@@ -331,8 +335,19 @@ congestion_control_vegas_process_sendme(congestion_control_t *cc,
cc->next_cc_event = 1; // Technically irellevant, but for consistency
}
} else {
+ uint64_t old_cwnd = cc->cwnd;
+ uint64_t cwnd_diff;
+
/* Congestion signal: Set cwnd to gamma threshhold */
cc->cwnd = vegas_bdp(cc) + cc->vegas_params.gamma;
+
+ /* Account the amount we reduced the cwnd by for the gamma cutoff */
+ cwnd_diff = (old_cwnd > cc->cwnd ? old_cwnd - cc->cwnd : 0);
+ stats_cwnd_gamma_drop_ma_count++;
+ cc_stats_vegas_gamma_drop_ma =
+ stats_update_running_avg(cc_stats_vegas_gamma_drop_ma,
+ cwnd_diff, stats_cwnd_gamma_drop_ma_count);
+
congestion_control_vegas_exit_slow_start(circ, cc);
}
@@ -344,7 +359,20 @@ congestion_control_vegas_process_sendme(congestion_control_t *cc,
/* After slow start, We only update once per window */
} else if (cc->next_cc_event == 0) {
if (queue_use > cc->vegas_params.delta) {
+ uint64_t old_cwnd = cc->cwnd;
+ uint64_t cwnd_diff;
+
+ /* If we are above the delta threshhold, drop cwnd down to the
+ * delta threshhold. */
cc->cwnd = vegas_bdp(cc) + cc->vegas_params.delta - CWND_INC(cc);
+
+ /* Account the amount we reduced the cwnd by for the gamma cutoff */
+ cwnd_diff = (old_cwnd > cc->cwnd ? old_cwnd - cc->cwnd : 0);
+ stats_cwnd_delta_drop_ma_count++;
+ cc_stats_vegas_delta_drop_ma =
+ stats_update_running_avg(cc_stats_vegas_delta_drop_ma,
+ cwnd_diff, stats_cwnd_delta_drop_ma_count);
+
cc_stats_vegas_above_delta++;
} else if (queue_use > cc->vegas_params.beta || cc->blocked_chan) {
cc->cwnd -= CWND_INC(cc);
diff --git a/src/core/or/congestion_control_vegas.h b/src/core/or/congestion_control_vegas.h
index 5aced07a8f..6048b1e26d 100644
--- a/src/core/or/congestion_control_vegas.h
+++ b/src/core/or/congestion_control_vegas.h
@@ -13,6 +13,8 @@
#include "core/or/circuit_st.h"
extern double cc_stats_vegas_exit_ss_cwnd_ma;
+extern double cc_stats_vegas_gamma_drop_ma;
+extern double cc_stats_vegas_delta_drop_ma;
extern uint64_t cc_stats_vegas_above_delta;
extern uint64_t cc_stats_vegas_above_ss_cwnd_max;
diff --git a/src/feature/relay/relay_metrics.c b/src/feature/relay/relay_metrics.c
index 076ac68618..cd80c5e95e 100644
--- a/src/feature/relay/relay_metrics.c
+++ b/src/feature/relay/relay_metrics.c
@@ -395,6 +395,15 @@ fill_cc_values(void)
sentry = metrics_store_add(the_store, rentry->type, rentry->name,
rentry->help);
metrics_store_entry_add_label(sentry,
+ metrics_format_label("state", "slow_start_exit"));
+ metrics_store_entry_add_label(sentry,
+ metrics_format_label("action", "gamma_drop"));
+ metrics_store_entry_update(sentry,
+ tor_llround(cc_stats_vegas_gamma_drop_ma));
+
+ sentry = metrics_store_add(the_store, rentry->type, rentry->name,
+ rentry->help);
+ metrics_store_entry_add_label(sentry,
metrics_format_label("state", "on_circ_close"));
metrics_store_entry_add_label(sentry,
metrics_format_label("action", "cwnd"));
@@ -461,6 +470,15 @@ fill_cc_values(void)
metrics_store_entry_add_label(sentry,
metrics_format_label("action", "above_ss_cwnd_max"));
metrics_store_entry_update(sentry, cc_stats_vegas_above_ss_cwnd_max);
+
+ sentry = metrics_store_add(the_store, rentry->type, rentry->name,
+ rentry->help);
+ metrics_store_entry_add_label(sentry,
+ metrics_format_label("state", "process_sendme"));
+ metrics_store_entry_add_label(sentry,
+ metrics_format_label("action", "delta_drop"));
+ metrics_store_entry_update(sentry,
+ tor_llround(cc_stats_vegas_delta_drop_ma));
}
/** Helper: Fill in single stream metrics output. */