]> granicus.if.org Git - sysstat/commitdiff
sadf: A_NET_SOFT: Add new metric softnet network backlog (#315)
authorSebastien GODARD <sysstat@users.noreply.github.com>
Sat, 26 Mar 2022 14:43:57 +0000 (15:43 +0100)
committerSebastien GODARD <sysstat@users.noreply.github.com>
Sat, 26 Mar 2022 14:43:57 +0000 (15:43 +0100)
New metric added in kernel 5.10
https://github.com/torvalds/linux/commit/7d58e6555870d01d85b181ba2a16b217a1ea8bdd

Signed-off-by: Sebastien GODARD <sysstat@users.noreply.github.com>
json_stats.c
pcp_def_metrics.c
pcp_stats.c
raw_stats.c
rndr_stats.c
svg_stats.c
xml_stats.c

index e1f21a14b1ce50e204313b536a9b3d8f46422be4..5c32db8465a403b3858074e9809d71958fec4441 100644 (file)
@@ -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");
index 0ebbb4783998b9c4bd3337cbf7cd629704bb9da6..bea37659323e615e2b1e6def33a262605d215af4 100644 (file)
@@ -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;
index 29ce4c67fd5ffcbe0a93098aad3920c9e941d296..49010c0fea45e9ba70017c2e690810cd7305b440 100644 (file)
@@ -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 */
 }
index a9dfb99717d197a6d621eb8e0a4f39111d378dbf..45abda17e8da9ea9cd66dc222085fbf4f2a8b8c3 100644 (file)
@@ -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");
        }
 }
index 3a22db564cd27949029a0c215c9a00f66ef2884a..7897375320530458fee3bbdfbb76dd9137d6f9c9 100644 (file)
@@ -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);
                }
        }
 }
index c532d00858d9fe2efab3732b23ec2516e7c65ed1..0740b1fa13e41c78d56e28734fc96ab03d10704a 100644 (file)
@@ -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);
                }
        }
 
index 2b6f627b50e7e7d71adffae3de8e9716a01b6daf..654086ba79f3fa2a012bc546433be5dffb2de74f 100644 (file)
@@ -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--;