From 6761a3aa8ac66aa6cefdcca3bd730c7f5f490c97 Mon Sep 17 00:00:00 2001 From: Sebastien GODARD Date: Sat, 26 Mar 2022 15:43:57 +0100 Subject: [PATCH] sadf: A_NET_SOFT: Add new metric softnet network backlog (#315) New metric added in kernel 5.10 https://github.com/torvalds/linux/commit/7d58e6555870d01d85b181ba2a16b217a1ea8bdd Signed-off-by: Sebastien GODARD --- json_stats.c | 6 ++++-- pcp_def_metrics.c | 8 ++++++++ pcp_stats.c | 3 +++ raw_stats.c | 3 ++- rndr_stats.c | 18 ++++++++++++++++-- svg_stats.c | 25 +++++++++++++++++++------ xml_stats.c | 6 ++++-- 7 files changed, 56 insertions(+), 13 deletions(-) diff --git a/json_stats.c b/json_stats.c index e1f21a1..5c32db8 100644 --- a/json_stats.c +++ b/json_stats.c @@ -2450,13 +2450,15 @@ __print_funct_t json_print_softnet_stats(struct activity *a, int curr, int tab, "\"dropd\": %.2f, " "\"squeezd\": %.2f, " "\"rx_rps\": %.2f, " - "\"flw_lim\": %.2f}", + "\"flw_lim\": %.2f, ", + "\"blg_len\": %u}", cpuno, S_VALUE(ssnp->processed, ssnc->processed, itv), S_VALUE(ssnp->dropped, ssnc->dropped, itv), S_VALUE(ssnp->time_squeeze, ssnc->time_squeeze, itv), S_VALUE(ssnp->received_rps, ssnc->received_rps, itv), - S_VALUE(ssnp->flow_limit, ssnc->flow_limit, itv)); + S_VALUE(ssnp->flow_limit, ssnc->flow_limit, itv), + ssnc->backlog_len); } printf("\n"); diff --git a/pcp_def_metrics.c b/pcp_def_metrics.c index 0ebbb47..bea3765 100644 --- a/pcp_def_metrics.c +++ b/pcp_def_metrics.c @@ -164,6 +164,10 @@ void pcp_def_cpu_metrics(struct activity *a) pmiAddMetric("network.softnet.flow_limit", pmiID(60, 57, 5), PM_TYPE_U64, PM_INDOM_NULL, PM_SEM_COUNTER, pmiUnits(0, 0, 1, 0, 0, PM_COUNT_ONE)); + + pmiAddMetric("network.softnet.backlog_length", + pmiID(60, 57, 12), PM_TYPE_U64, PM_INDOM_NULL, PM_SEM_COUNTER, + pmiUnits(0, 0, 1, 0, 0, PM_COUNT_ONE)); } } else { @@ -256,6 +260,10 @@ void pcp_def_cpu_metrics(struct activity *a) pmiAddMetric("network.softnet.percpu.flow_limit", pmiID(60, 57, 11), PM_TYPE_U64, indom, PM_SEM_COUNTER, pmiUnits(0, 0, 1, 0, 0, PM_COUNT_ONE)); + + pmiAddMetric("network.softnet.percpu.backlog_length", + pmiID(60, 57, 13), PM_TYPE_U64, indom, PM_SEM_COUNTER, + pmiUnits(0, 0, 1, 0, 0, PM_COUNT_ONE)); } first = FALSE; diff --git a/pcp_stats.c b/pcp_stats.c index 29ce4c6..49010c0 100644 --- a/pcp_stats.c +++ b/pcp_stats.c @@ -1788,6 +1788,9 @@ __print_funct_t pcp_print_softnet_stats(struct activity *a, int curr) snprintf(buf, sizeof(buf), "%llu", (unsigned long long) ssnc->flow_limit); pmiPutValue("network.softnet.percpu.flow_limit", cpuno, buf); + + snprintf(buf, sizeof(buf), "%llu", (unsigned long long) ssnc->backlog_len); + pmiPutValue("network.softnet.percpu.backlog_length", cpuno, buf); } #endif /* HAVE_PCP */ } diff --git a/raw_stats.c b/raw_stats.c index a9dfb99..45abda1 100644 --- a/raw_stats.c +++ b/raw_stats.c @@ -1688,7 +1688,7 @@ __print_funct_t raw_print_softnet_stats(struct activity *a, char *timestr, int c printf("%s; %s", timestr, pfield(a->hdr_line, FIRST)); if (DISPLAY_DEBUG_MODE(flags) && i) { if (ssnc->processed + ssnc->dropped + ssnc->time_squeeze + - ssnc->received_rps + ssnc->flow_limit == 0) { + ssnc->received_rps + ssnc->flow_limit + ssnc->backlog_len == 0) { /* CPU is considered offline */ cprintf_s(IS_DEBUG, "%s", " [OFF]"); } @@ -1705,6 +1705,7 @@ __print_funct_t raw_print_softnet_stats(struct activity *a, char *timestr, int c pval((unsigned long long) ssnp->received_rps, (unsigned long long) ssnc->received_rps); printf(" %s", pfield(NULL, 0)); pval((unsigned long long) ssnp->flow_limit, (unsigned long long) ssnc->flow_limit); + printf(" %s; %u;", pfield(NULL, 0), ssnc->backlog_len); printf("\n"); } } diff --git a/rndr_stats.c b/rndr_stats.c index 3a22db5..7897375 100644 --- a/rndr_stats.c +++ b/rndr_stats.c @@ -3204,12 +3204,19 @@ __print_funct_t render_softnet_stats(struct activity *a, int isdb, char *pre, S_VALUE(ssnp->received_rps, ssnc->received_rps, itv), NULL); - render(isdb, pre, pt_newlin, + render(isdb, pre, PT_NOFLAG, "all\tflw_lim/s", NULL, NULL, NOVAL, S_VALUE(ssnp->flow_limit, ssnc->flow_limit, itv), NULL); + + render(isdb, pre, PT_USEINT | pt_newlin, + "all\tblg_len", + NULL, NULL, + ssnc->backlog_len, + DNOVAL, + NULL); } else { render(isdb, pre, PT_NOFLAG, @@ -3240,12 +3247,19 @@ __print_funct_t render_softnet_stats(struct activity *a, int isdb, char *pre, S_VALUE(ssnp->received_rps, ssnc->received_rps, itv), NULL); - render(isdb, pre, pt_newlin, + render(isdb, pre, PT_NOFLAG, "cpu%d\tflw_lim/s", NULL, cons(iv, i - 1, NOVAL), NOVAL, S_VALUE(ssnp->flow_limit, ssnc->flow_limit, itv), NULL); + + render(isdb, pre, PT_USEINT | pt_newlin, + "cpu%d\tblg_len", + NULL, cons(iv, i - 1, NOVAL), + ssnc->backlog_len, + DNOVAL, + NULL); } } } diff --git a/svg_stats.c b/svg_stats.c index c532d00..0740b1f 100644 --- a/svg_stats.c +++ b/svg_stats.c @@ -5155,18 +5155,21 @@ __print_funct_t svg_print_fchost_stats(struct activity *a, int curr, int action, * @record_hdr Pointer on record header of current stats sample. *************************************************************************** */ -#define SOFT_ARRAY_SZ 5 +#define SOFT_ARRAY_SZ 6 __print_funct_t svg_print_softnet_stats(struct activity *a, int curr, int action, struct svg_parm *svg_p, unsigned long long itv, struct record_header *record_hdr) { struct stats_softnet *ssnc, *ssnp, ssnczero; - int group[] = {2, 3}; - int g_type[] = {SVG_LINE_GRAPH, SVG_LINE_GRAPH}; + int group[] = {2, 3, 1}; + int g_type[] = {SVG_LINE_GRAPH, SVG_LINE_GRAPH, SVG_LINE_GRAPH}; char *title[] = {"Software-based network processing statistics (1)", - "Software-based network processing statistics (2)"}; + "Software-based network processing statistics (2)", + "Software-based network processing statistics (3)"}; char *g_title[] = {"total/s", "dropd/s", - "squeezd/s", "rx_rps/s", "flw_lim/s"}; + "squeezd/s", "rx_rps/s", "flw_lim/s", + "~blg_len"}; int g_fields[] = {0, 1, 2, 3, 4}; + unsigned int local_types_nr[] = {0, 0, 5}; static double *spmin, *spmax; static char **out; static int *outsize; @@ -5225,8 +5228,14 @@ __print_funct_t svg_print_softnet_stats(struct activity *a, int curr, int action pos = i * SOFT_ARRAY_SZ; /* Check for min/max values */ - save_extrema(a->gtypes_nr, (void *) ssnc, (void *) ssnp, + save_extrema(local_types_nr, (void *) ssnc, (void *) ssnp, itv, spmin + pos, spmax + pos, g_fields); + if (ssnc->backlog_len < *(spmin + pos + 5)) { + *(spmin + pos + 5) = ssnc->backlog_len; + } + if (ssnc->backlog_len > *(spmax + pos + 5)) { + *(spmax + pos + 5) = ssnc->backlog_len; + } /* total/s */ lnappend(record_hdr->ust_time - svg_p->ust_time_ref, @@ -5248,6 +5257,10 @@ __print_funct_t svg_print_softnet_stats(struct activity *a, int curr, int action lnappend(record_hdr->ust_time - svg_p->ust_time_ref, S_VALUE(ssnp->flow_limit, ssnc->flow_limit, itv), out + pos + 4, outsize + pos + 4, restart); + /* blg_len */ + lniappend(record_hdr->ust_time - svg_p->ust_time_ref, + (unsigned long long) ssnc->backlog_len, + out + pos + 5, outsize + pos + 5, restart); } } diff --git a/xml_stats.c b/xml_stats.c index 2b6f627..654086b 100644 --- a/xml_stats.c +++ b/xml_stats.c @@ -2316,13 +2316,15 @@ __print_funct_t xml_print_softnet_stats(struct activity *a, int curr, int tab, "dropd=\"%.2f\" " "squeezd=\"%.2f\" " "rx_rps=\"%.2f\" " - "flw_lim=\"%.2f\"/>", + "flw_lim=\"%.2f\" ", + "blg_len=\"%u\"/>", cpuno, S_VALUE(ssnp->processed, ssnc->processed, itv), S_VALUE(ssnp->dropped, ssnc->dropped, itv), S_VALUE(ssnp->time_squeeze, ssnc->time_squeeze, itv), S_VALUE(ssnp->received_rps, ssnc->received_rps, itv), - S_VALUE(ssnp->flow_limit, ssnc->flow_limit, itv)); + S_VALUE(ssnp->flow_limit, ssnc->flow_limit, itv), + ssnc->backlog_len); } tab--; -- 2.40.0