stats: move vector_rate counters into provider

Type: improvement
Signed-off-by: Ole Troan <ot@cisco.com>
Change-Id: Iae1fb59a6dc9679c0fa0b87fa5232d551a7995a5
This commit is contained in:
Ole Troan
2021-05-06 11:02:37 +02:00
committed by Damjan Marion
parent 8f12698f83
commit 3b51f28a6f
3 changed files with 96 additions and 66 deletions

View File

@ -359,16 +359,6 @@ stat_validate_counter_vector (stat_segment_directory_entry_t *ep, u32 max)
stat_validate_counter_vector2 (ep, tm->n_vlib_mains, max);
}
always_inline void
stat_set_simple_counter (stat_segment_directory_entry_t * ep,
u32 thread_index, u32 index, u64 value)
{
ASSERT (ep->data);
counter_t **counters = ep->data;
counter_t *cb = counters[thread_index];
cb[index] = value;
}
void
vlib_stats_pop_heap2 (u64 * error_vector, u32 thread_index, void *oldheap,
int lock)
@ -751,11 +741,8 @@ update_node_counters (stat_segment_main_t * sm)
static void
do_stat_segment_updates (vlib_main_t *vm, stat_segment_main_t *sm)
{
f64 vector_rate;
u64 input_packets;
f64 dt, now;
vlib_main_t *this_vlib_main;
int i;
static int num_worker_threads_set;
/*
@ -765,45 +752,14 @@ do_stat_segment_updates (vlib_main_t *vm, stat_segment_main_t *sm)
*/
if (PREDICT_FALSE (num_worker_threads_set == 0))
{
void *oldheap = clib_mem_set_heap (sm->heap);
vlib_stat_segment_lock ();
stat_validate_counter_vector (&sm->directory_vector
[STAT_COUNTER_VECTOR_RATE_PER_WORKER], 0);
vlib_thread_main_t *tm = vlib_get_thread_main ();
ASSERT (tm->n_vlib_mains > 0);
stat_provider_register_vector_rate (tm->n_vlib_mains - 1);
sm->directory_vector[STAT_COUNTER_NUM_WORKER_THREADS].value =
tm->n_vlib_mains - 1;
num_worker_threads_set = 1;
vlib_stat_segment_unlock ();
clib_mem_set_heap (oldheap);
}
/*
* Compute per-worker vector rates, and the average vector rate
* across all workers
*/
vector_rate = 0.0;
for (i = 0; i < vlib_get_n_threads (); i++)
{
f64 this_vector_rate;
this_vlib_main = vlib_get_main_by_index (i);
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 */
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 > 1 ? i - 1 : 1);
sm->directory_vector[STAT_COUNTER_VECTOR_RATE].value = vector_rate;
/*
* Compute the aggregate input rate
*/

View File

@ -22,20 +22,18 @@
typedef enum
{
STAT_COUNTER_VECTOR_RATE = 0,
STAT_COUNTER_NUM_WORKER_THREADS,
STAT_COUNTER_VECTOR_RATE_PER_WORKER,
STAT_COUNTER_INPUT_RATE,
STAT_COUNTER_LAST_UPDATE,
STAT_COUNTER_LAST_STATS_CLEAR,
STAT_COUNTER_HEARTBEAT,
STAT_COUNTER_NODE_CLOCKS,
STAT_COUNTER_NODE_VECTORS,
STAT_COUNTER_NODE_CALLS,
STAT_COUNTER_NODE_SUSPENDS,
STAT_COUNTER_INTERFACE_NAMES,
STAT_COUNTER_NODE_NAMES,
STAT_COUNTERS
STAT_COUNTER_NUM_WORKER_THREADS = 0,
STAT_COUNTER_INPUT_RATE,
STAT_COUNTER_LAST_UPDATE,
STAT_COUNTER_LAST_STATS_CLEAR,
STAT_COUNTER_HEARTBEAT,
STAT_COUNTER_NODE_CLOCKS,
STAT_COUNTER_NODE_VECTORS,
STAT_COUNTER_NODE_CALLS,
STAT_COUNTER_NODE_SUSPENDS,
STAT_COUNTER_INTERFACE_NAMES,
STAT_COUNTER_NODE_NAMES,
STAT_COUNTERS
} stat_segment_counter_t;
/* clang-format off */
@ -46,9 +44,6 @@ typedef enum
_ (NODE_SUSPENDS, COUNTER_VECTOR_SIMPLE, suspends, /sys/node)
#define foreach_stat_segment_counter_name \
_ (VECTOR_RATE, SCALAR_INDEX, vector_rate, /sys) \
_ (VECTOR_RATE_PER_WORKER, COUNTER_VECTOR_SIMPLE, vector_rate_per_worker, \
/sys) \
_ (NUM_WORKER_THREADS, SCALAR_INDEX, num_worker_threads, /sys) \
_ (INPUT_RATE, SCALAR_INDEX, input_rate, /sys) \
_ (LAST_UPDATE, SCALAR_INDEX, last_update, /sys) \
@ -123,4 +118,6 @@ void vlib_stat_segment_unlock (void);
void vlib_stats_register_symlink (void *oldheap, u8 *name, u32 index1,
u32 index2, u8 lock);
void stat_provider_register_vector_rate (u32 num_workers);
#endif

View File

@ -119,3 +119,80 @@ vlib_stats_register_mem_heap (clib_mem_heap_t *heap)
stat_segment_poll_add (mem_vector_index, stat_provider_mem_usage_update_fn,
heap_index, 10);
}
static void
stat_provider_vector_rate_per_thread_update_fn (
stat_segment_directory_entry_t *e, u32 index)
{
vlib_main_t *this_vlib_main;
int i;
ASSERT (e->data);
counter_t **counters = e->data;
for (i = 0; i < vlib_get_n_threads (); i++)
{
f64 this_vector_rate;
this_vlib_main = vlib_get_main_by_index (i);
this_vector_rate = vlib_internal_node_vector_rate (this_vlib_main);
vlib_clear_internal_node_vector_rate (this_vlib_main);
/* Set the per-worker rate */
counter_t *cb = counters[i];
cb[0] = this_vector_rate;
}
}
static void
stat_provider_vector_rate_update_fn (stat_segment_directory_entry_t *e,
u32 index)
{
vlib_main_t *this_vlib_main;
int i;
f64 vector_rate = 0.0;
for (i = 0; i < vlib_get_n_threads (); i++)
{
f64 this_vector_rate;
this_vlib_main = vlib_get_main_by_index (i);
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;
}
/* And set the system average rate */
vector_rate /= (f64) (i > 1 ? i - 1 : 1);
e->value = vector_rate;
}
void
stat_provider_register_vector_rate (u32 num_workers)
{
int i;
u8 *s = format (0, "/sys/vector_rate");
i = stat_segment_new_entry (s, STAT_DIR_TYPE_SCALAR_INDEX);
if (i == ~0)
ASSERT (0);
vec_free (s);
stat_segment_poll_add (i, stat_provider_vector_rate_update_fn, ~0, 10);
s = format (0, "/sys/vector_rate_per_worker");
i = stat_segment_new_entry (s, STAT_DIR_TYPE_COUNTER_VECTOR_SIMPLE);
if (i == ~0)
ASSERT (0);
vec_free (s);
stat_segment_poll_add (i, stat_provider_vector_rate_per_thread_update_fn, ~0,
10);
stat_segment_main_t *sm = &stat_segment_main;
vlib_stat_segment_lock ();
stat_segment_directory_entry_t *ep = &sm->directory_vector[i];
ep->data = stat_validate_counter_vector3 (ep->data, num_workers, 0);
vlib_stat_segment_unlock ();
}