diff options
author | Dave Barach <dbarach@cisco.com> | 2019-05-10 08:38:25 -0400 |
---|---|---|
committer | Dave Barach <openvpp@barachs.net> | 2019-06-06 18:13:32 +0000 |
commit | 6c36ca545bbd6f65937a4ec0de55614cf7223690 (patch) | |
tree | 876c35fd05a0e4ec6617b604f04c3674f87fae6a /src/vpp/stats/stat_segment.c | |
parent | e4a0f9fdc0fcf76d34c8c0d53a2de5b1111c15a9 (diff) |
Fix stat seg average vector rate computation
Add the number of worker threads and per worker thread vector rates to
the stats segment.
Change-Id: I3040108ec9fcdf5fdb6b9a950060dea9b3c88fd1
Signed-off-by: Dave Barach <dbarach@cisco.com>
Signed-off-by: Dave Barach <dave@barachs.net>
(cherry picked from commit f89a6de8f032536080c4a11b267bf921093d3740)
Diffstat (limited to 'src/vpp/stats/stat_segment.c')
-rw-r--r-- | src/vpp/stats/stat_segment.c | 42 |
1 files changed, 38 insertions, 4 deletions
diff --git a/src/vpp/stats/stat_segment.c b/src/vpp/stats/stat_segment.c index 05b8cdcb34d..b9d5b23e33e 100644 --- a/src/vpp/stats/stat_segment.c +++ b/src/vpp/stats/stat_segment.c @@ -505,29 +505,63 @@ 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, last_input_packets; f64 dt, now; vlib_main_t *this_vlib_main; int i, start; + counter_t **counters; + static int num_worker_threads_set; + + /* + * Set once at the beginning of time. + * Can't do this from the init routine, which happens before + * start_workers sets up vlib_mains... + */ + if (PREDICT_FALSE (num_worker_threads_set == 0)) + { + sm->directory_vector[STAT_COUNTER_NUM_WORKER_THREADS].value = + vec_len (vlib_mains) > 1 ? vec_len (vlib_mains) - 1 : 1; + + stat_validate_counter_vector (&sm->directory_vector + [STAT_COUNTER_VECTOR_RATE_PER_WORKER], + vec_len (vlib_mains)); + num_worker_threads_set = 1; + } /* - * Compute the average vector rate across all workers + * Compute per-worker vector rates, and the average vector rate + * across all workers */ 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++) { + + f64 this_vector_rate; + this_vlib_main = vlib_mains[i]; - vector_rate += vlib_last_vector_length_per_node (this_vlib_main); + + this_vector_rate = vlib_last_vector_length_per_node (this_vlib_main); + vector_rate += this_vector_rate; + + /* Set the per-worker rate */ + counters[i - start][0] = this_vector_rate; } + + /* And set the system average rate */ vector_rate /= (f64) (i - start); - sm->directory_vector[STAT_COUNTER_VECTOR_RATE].value = - vector_rate / ((f64) (vec_len (vlib_mains) - start)); + sm->directory_vector[STAT_COUNTER_VECTOR_RATE].value = vector_rate; /* * Compute the aggregate input rate |