summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Perry <mikeperry-git@torproject.org>2022-11-03 19:48:16 +0000
committerDavid Goulet <dgoulet@torproject.org>2022-11-07 09:55:06 -0500
commit83fdaff7c0920c8943b483e4146d2762b8e6ca94 (patch)
treecd17b679458fd41b6d625cdcc363ca7373848a7e
parentf270d20cb0a29ffb3e33434f353cbf315a4d1a52 (diff)
downloadtor-83fdaff7c0920c8943b483e4146d2762b8e6ca94.tar.gz
tor-83fdaff7c0920c8943b483e4146d2762b8e6ca94.zip
metrics: Add running average of CC cwnd in slow start when closing circuit
Count slow start separately. Part of #40708 Signed-off-by: David Goulet <dgoulet@torproject.org>
-rw-r--r--src/core/or/circuitlist.c24
-rw-r--r--src/core/or/circuitlist.h1
-rw-r--r--src/feature/relay/relay_metrics.c11
3 files changed, 30 insertions, 6 deletions
diff --git a/src/core/or/circuitlist.c b/src/core/or/circuitlist.c
index b21d95ade7..ddcb9bebe4 100644
--- a/src/core/or/circuitlist.c
+++ b/src/core/or/circuitlist.c
@@ -151,8 +151,12 @@ static int any_opened_circs_cached_val = 0;
/** Moving average of the cc->cwnd from each closed circuit. */
double cc_stats_circ_close_cwnd_ma = 0;
-/* Running count of this moving average. Needed so we can update it. */
+/** Moving average of the cc->cwnd from each closed slow-start circuit. */
+double cc_stats_circ_close_ss_cwnd_ma = 0;
+
+/* Running count of the above moving averages. Needed so we can update it. */
static double stats_circ_close_cwnd_ma_count = 0;
+static double stats_circ_close_ss_cwnd_ma_count = 0;
/********* END VARIABLES ************/
@@ -2234,9 +2238,21 @@ circuit_mark_for_close_, (circuit_t *circ, int reason, int line,
/* Update stats. */
if (circ->ccontrol) {
- stats_circ_close_cwnd_ma_count++;
- STATS_UPDATE_AVG(cc_stats_circ_close_cwnd_ma,
- circ->ccontrol->cwnd, stats_circ_close_cwnd_ma_count);
+ if (circ->ccontrol->in_slow_start) {
+ /* If we are in slow start, only count the ss cwnd if we've sent
+ * enough data to get RTT measurements such that we have a min
+ * and a max RTT, and they are not the same. This prevents us from
+ * averaging and reporting unused and low-use circuits here */
+ if (circ->ccontrol->max_rtt_usec != circ->ccontrol->min_rtt_usec) {
+ stats_circ_close_ss_cwnd_ma_count++;
+ STATS_UPDATE_AVG(cc_stats_circ_close_ss_cwnd_ma,
+ circ->ccontrol->cwnd, stats_circ_close_ss_cwnd_ma_count);
+ }
+ } else {
+ stats_circ_close_cwnd_ma_count++;
+ STATS_UPDATE_AVG(cc_stats_circ_close_cwnd_ma,
+ circ->ccontrol->cwnd, stats_circ_close_cwnd_ma_count);
+ }
}
if (circuits_pending_close == NULL)
diff --git a/src/core/or/circuitlist.h b/src/core/or/circuitlist.h
index 1a99083bc6..281ea1f76f 100644
--- a/src/core/or/circuitlist.h
+++ b/src/core/or/circuitlist.h
@@ -163,6 +163,7 @@
/** Stats. */
extern double cc_stats_circ_close_cwnd_ma;
+extern double cc_stats_circ_close_ss_cwnd_ma;
/** Convert a circuit_t* to a pointer to the enclosing or_circuit_t. Assert
* if the cast is impossible. */
diff --git a/src/feature/relay/relay_metrics.c b/src/feature/relay/relay_metrics.c
index b95ca4ba06..9ceb61836e 100644
--- a/src/feature/relay/relay_metrics.c
+++ b/src/feature/relay/relay_metrics.c
@@ -375,7 +375,6 @@ 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,
@@ -385,7 +384,6 @@ 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", "on_circ_close"));
metrics_store_entry_add_label(sentry,
@@ -396,6 +394,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", "on_circ_close"));
+ metrics_store_entry_add_label(sentry,
+ metrics_format_label("action", "ss_cwnd"));
+ metrics_store_entry_update(sentry,
+ tor_llround(cc_stats_circ_close_ss_cwnd_ma));
+
+ 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", "above_delta"));