aboutsummaryrefslogtreecommitdiffstats
path: root/src/vpp/stats
diff options
context:
space:
mode:
authorDave Barach <dave@barachs.net>2019-10-01 13:34:23 -0400
committerFlorin Coras <florin.coras@gmail.com>2019-10-02 20:44:02 +0000
commita8df85ce1fe957efa8301bd5b5ac3c03737d31f1 (patch)
tree3f36a36f7b9cd52eb92ed62db7e15534dd3ed0df /src/vpp/stats
parenteacc8c5943e44d19b5a65a68db3ad5adf9e37495 (diff)
vlib: improve summary vector-rate statistics
Type: refactor Signed-off-by: Dave Barach <dave@barachs.net> Change-Id: I4b77879b0a84fdec3c1518a972cf003d5135222d Signed-off-by: Ole Troan <ot@cisco.com>
Diffstat (limited to 'src/vpp/stats')
-rw-r--r--src/vpp/stats/stat_segment.c62
-rw-r--r--src/vpp/stats/stat_segment.h3
2 files changed, 41 insertions, 24 deletions
diff --git a/src/vpp/stats/stat_segment.c b/src/vpp/stats/stat_segment.c
index b978d37a091..f4758a7cdb5 100644
--- a/src/vpp/stats/stat_segment.c
+++ b/src/vpp/stats/stat_segment.c
@@ -216,6 +216,21 @@ stat_validate_counter_vector (stat_segment_directory_entry_t * ep, u32 max)
ep->offset_vector = stat_segment_offset (shared_header, offset_vector);
}
+always_inline void
+stat_set_simple_counter (stat_segment_directory_entry_t * ep,
+ u32 thread_index, u32 index, u64 value)
+{
+ stat_segment_main_t *sm = &stat_segment_main;
+ stat_segment_shared_header_t *shared_header = sm->shared_header;
+
+ ASSERT (shared_header);
+ counter_t *offset_vector =
+ stat_segment_pointer (sm->shared_header, ep->offset_vector);
+ counter_t *cb =
+ stat_segment_pointer (sm->shared_header, offset_vector[thread_index]);
+ cb[index] = value;
+}
+
void
vlib_stats_pop_heap2 (u64 * error_vector, u32 thread_index, void *oldheap,
int lock)
@@ -540,14 +555,12 @@ update_node_counters (stat_segment_main_t * sm)
static void
do_stat_segment_updates (stat_segment_main_t * sm)
{
- stat_segment_shared_header_t *shared_header = sm->shared_header;
vlib_main_t *vm = vlib_mains[0];
f64 vector_rate;
u64 input_packets;
f64 dt, now;
vlib_main_t *this_vlib_main;
- int i, start;
- counter_t **counters;
+ int i;
static int num_worker_threads_set;
/*
@@ -558,14 +571,10 @@ do_stat_segment_updates (stat_segment_main_t * sm)
if (PREDICT_FALSE (num_worker_threads_set == 0))
{
void *oldheap = clib_mem_set_heap (sm->heap);
- int workers = clib_max (1, vec_len (vlib_mains) - 1);
vlib_stat_segment_lock ();
- sm->directory_vector[STAT_COUNTER_NUM_WORKER_THREADS].value = workers;
-
stat_validate_counter_vector (&sm->directory_vector
- [STAT_COUNTER_VECTOR_RATE_PER_WORKER],
- workers);
+ [STAT_COUNTER_VECTOR_RATE_PER_WORKER], 0);
num_worker_threads_set = 1;
vlib_stat_segment_unlock ();
clib_mem_set_heap (oldheap);
@@ -577,29 +586,26 @@ do_stat_segment_updates (stat_segment_main_t * sm)
*/
vector_rate = 0.0;
- counters =
- stat_segment_pointer (shared_header,
- sm->directory_vector
- [STAT_COUNTER_VECTOR_RATE_PER_WORKER].offset);
-
- start = vec_len (vlib_mains) > 1 ? 1 : 0;
-
- for (i = start; i < vec_len (vlib_mains); i++)
+ for (i = 0; i < vec_len (vlib_mains); i++)
{
f64 this_vector_rate;
this_vlib_main = vlib_mains[i];
- this_vector_rate = vlib_last_vector_length_per_node (this_vlib_main);
+ this_vector_rate = vlib_internal_node_vector_rate (this_vlib_main);
+ vlib_clear_internal_node_vector_rate (this_vlib_main);
+
vector_rate += this_vector_rate;
/* Set the per-worker rate */
- counters[0][i - start] = this_vector_rate;
+ stat_set_simple_counter (&sm->directory_vector
+ [STAT_COUNTER_VECTOR_RATE_PER_WORKER], i, 0,
+ this_vector_rate);
}
/* And set the system average rate */
- vector_rate /= (f64) (i - start);
+ vector_rate /= (f64) (i > 1 ? i - 1 : 1);
sm->directory_vector[STAT_COUNTER_VECTOR_RATE].value = vector_rate;
@@ -703,19 +709,23 @@ stats_segment_socket_exit (vlib_main_t * vm)
VLIB_MAIN_LOOP_EXIT_FUNCTION (stats_segment_socket_exit);
+/* Overrides weak reference in vlib:node_cli.c */
+f64
+vlib_get_stat_segment_update_rate (void)
+{
+ return stat_segment_main.update_interval;
+}
+
static uword
stat_segment_collector_process (vlib_main_t * vm, vlib_node_runtime_t * rt,
vlib_frame_t * f)
{
stat_segment_main_t *sm = &stat_segment_main;
- /* Wait for Godot... */
- f64 sleep_duration = 10;
-
while (1)
{
do_stat_segment_updates (sm);
- vlib_process_suspend (vm, sleep_duration);
+ vlib_process_suspend (vm, sm->update_interval);
}
return 0; /* or not */
}
@@ -853,6 +863,7 @@ static clib_error_t *
statseg_config (vlib_main_t * vm, unformat_input_t * input)
{
stat_segment_main_t *sm = &stat_segment_main;
+ sm->update_interval = 10.0;
while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
{
@@ -868,6 +879,8 @@ statseg_config (vlib_main_t * vm, unformat_input_t * input)
sm->node_counters_enabled = 1;
else if (unformat (input, "per-node-counters off"))
sm->node_counters_enabled = 0;
+ else if (unformat (input, "update-interval %f", &sm->update_interval))
+ ;
else
return clib_error_return (0, "unknown input `%U'",
format_unformat_error, input);
@@ -883,6 +896,8 @@ statseg_config (vlib_main_t * vm, unformat_input_t * input)
return 0;
}
+VLIB_EARLY_CONFIG_FUNCTION (statseg_config, "statseg");
+
static clib_error_t *
statseg_sw_interface_add_del (vnet_main_t * vnm, u32 sw_if_index, u32 is_add)
{
@@ -951,7 +966,6 @@ statseg_sw_interface_add_del (vnet_main_t * vnm, u32 sw_if_index, u32 is_add)
return 0;
}
-VLIB_EARLY_CONFIG_FUNCTION (statseg_config, "statseg");
VNET_SW_INTERFACE_ADD_DEL_FUNCTION (statseg_sw_interface_add_del);
/* *INDENT-OFF* */
diff --git a/src/vpp/stats/stat_segment.h b/src/vpp/stats/stat_segment.h
index eae6902dc75..83d233479a8 100644
--- a/src/vpp/stats/stat_segment.h
+++ b/src/vpp/stats/stat_segment.h
@@ -90,6 +90,9 @@ typedef struct
u8 **interfaces;
u8 **nodes;
+ /* Update interval */
+ f64 update_interval;
+
clib_spinlock_t *stat_segment_lockp;
clib_socket_t *socket;
u8 *socket_name;