Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/93911/?format=api
http://patches.dpdk.org/api/patches/93911/?format=api", "web_url": "http://patches.dpdk.org/project/dpdk/patch/20210604144225.287678-12-andrew.rybchenko@oktetlabs.ru/", "project": { "id": 1, "url": "http://patches.dpdk.org/api/projects/1/?format=api", "name": "DPDK", "link_name": "dpdk", "list_id": "dev.dpdk.org", "list_email": "dev@dpdk.org", "web_url": "http://core.dpdk.org", "scm_url": "git://dpdk.org/dpdk", "webscm_url": "http://git.dpdk.org/dpdk", "list_archive_url": "https://inbox.dpdk.org/dev", "list_archive_url_format": "https://inbox.dpdk.org/dev/{}", "commit_url_format": "" }, "msgid": "<20210604144225.287678-12-andrew.rybchenko@oktetlabs.ru>", "list_archive_url": "https://inbox.dpdk.org/dev/20210604144225.287678-12-andrew.rybchenko@oktetlabs.ru", "date": "2021-06-04T14:42:25", "name": "[11/11] app/testpmd: add option to display extended statistics", "commit_ref": null, "pull_url": null, "state": "superseded", "archived": true, "hash": "8d9cd3ca60ce7a07b3c29b324974b3815b6dd52d", "submitter": { "id": 2013, "url": "http://patches.dpdk.org/api/people/2013/?format=api", "name": "Andrew Rybchenko", "email": "Andrew.Rybchenko@oktetlabs.ru" }, "delegate": { "id": 24651, "url": "http://patches.dpdk.org/api/users/24651/?format=api", "username": "dmarchand", "first_name": "David", "last_name": "Marchand", "email": "david.marchand@redhat.com" }, "mbox": "http://patches.dpdk.org/project/dpdk/patch/20210604144225.287678-12-andrew.rybchenko@oktetlabs.ru/mbox/", "series": [ { "id": 17239, "url": "http://patches.dpdk.org/api/series/17239/?format=api", "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=17239", "date": "2021-06-04T14:42:14", "name": "net/sfc: provide Rx/Tx doorbells stats", "version": 1, "mbox": "http://patches.dpdk.org/series/17239/mbox/" } ], "comments": "http://patches.dpdk.org/api/patches/93911/comments/", "check": "warning", "checks": "http://patches.dpdk.org/api/patches/93911/checks/", "tags": {}, "related": [], "headers": { "Return-Path": "<dev-bounces@dpdk.org>", "X-Original-To": "patchwork@inbox.dpdk.org", "Delivered-To": "patchwork@inbox.dpdk.org", "Received": [ "from mails.dpdk.org (mails.dpdk.org [217.70.189.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id 52A30A0A0F;\n\tFri, 4 Jun 2021 16:43:57 +0200 (CEST)", "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id E5D6B410E8;\n\tFri, 4 Jun 2021 16:43:27 +0200 (CEST)", "from shelob.oktetlabs.ru (shelob.oktetlabs.ru [91.220.146.113])\n by mails.dpdk.org (Postfix) with ESMTP id DCC4B410DB\n for <dev@dpdk.org>; Fri, 4 Jun 2021 16:43:26 +0200 (CEST)", "by shelob.oktetlabs.ru (Postfix, from userid 122)\n id B17E17F684; Fri, 4 Jun 2021 17:43:26 +0300 (MSK)", "from aros.oktetlabs.ru (aros.oktetlabs.ru [192.168.38.17])\n by shelob.oktetlabs.ru (Postfix) with ESMTP id 0A3D87F68B;\n Fri, 4 Jun 2021 17:42:37 +0300 (MSK)" ], "X-Spam-Checker-Version": "SpamAssassin 3.4.2 (2018-09-13) on shelob.oktetlabs.ru", "X-Spam-Level": "", "X-Spam-Status": "No, score=0.8 required=5.0 tests=ALL_TRUSTED,\n DKIM_ADSP_DISCARD,\n URIBL_BLOCKED autolearn=no autolearn_force=no version=3.4.2", "DKIM-Filter": "OpenDKIM Filter v2.11.0 shelob.oktetlabs.ru 0A3D87F68B", "Authentication-Results": "shelob.oktetlabs.ru/0A3D87F68B; dkim=none;\n dkim-atps=neutral", "From": "Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>", "To": "dev@dpdk.org", "Cc": "Ivan Ilchenko <ivan.ilchenko@oktetlabs.ru>,\n Xiaoyun Li <xiaoyun.li@intel.com>", "Date": "Fri, 4 Jun 2021 17:42:25 +0300", "Message-Id": "<20210604144225.287678-12-andrew.rybchenko@oktetlabs.ru>", "X-Mailer": "git-send-email 2.30.2", "In-Reply-To": "<20210604144225.287678-1-andrew.rybchenko@oktetlabs.ru>", "References": "<20210604144225.287678-1-andrew.rybchenko@oktetlabs.ru>", "MIME-Version": "1.0", "Content-Transfer-Encoding": "8bit", "Subject": "[dpdk-dev] [PATCH 11/11] app/testpmd: add option to display\n extended statistics", "X-BeenThere": "dev@dpdk.org", "X-Mailman-Version": "2.1.29", "Precedence": "list", "List-Id": "DPDK patches and discussions <dev.dpdk.org>", "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n <mailto:dev-request@dpdk.org?subject=unsubscribe>", "List-Archive": "<http://mails.dpdk.org/archives/dev/>", "List-Post": "<mailto:dev@dpdk.org>", "List-Help": "<mailto:dev-request@dpdk.org?subject=help>", "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n <mailto:dev-request@dpdk.org?subject=subscribe>", "Errors-To": "dev-bounces@dpdk.org", "Sender": "\"dev\" <dev-bounces@dpdk.org>" }, "content": "From: Ivan Ilchenko <ivan.ilchenko@oktetlabs.ru>\n\nAdd 'display-xstats' option for using in accompanying with Rx/Tx statistics\n(i.e. 'stats-period' option or 'show port stats' interactive command) to\ndisplay specified list of extended statistics.\n\nSigned-off-by: Ivan Ilchenko <ivan.ilchenko@oktetlabs.ru>\nSigned-off-by: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>\n---\n app/test-pmd/cmdline.c | 56 ++++++++++++\n app/test-pmd/config.c | 66 ++++++++++++++\n app/test-pmd/parameters.c | 18 ++++\n app/test-pmd/testpmd.c | 122 ++++++++++++++++++++++++++\n app/test-pmd/testpmd.h | 21 +++++\n doc/guides/testpmd_app_ug/run_app.rst | 5 ++\n 6 files changed, 288 insertions(+)", "diff": "diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c\nindex 0268b18f95..b1fd136982 100644\n--- a/app/test-pmd/cmdline.c\n+++ b/app/test-pmd/cmdline.c\n@@ -3613,6 +3613,62 @@ cmdline_parse_inst_t cmd_stop = {\n \n /* *** SET CORELIST and PORTLIST CONFIGURATION *** */\n \n+int\n+parse_xstats_list(char *in_str, struct rte_eth_xstat_name **xstats,\n+\t\t unsigned int *xstats_num)\n+{\n+\tint max_names_nb, names_nb;\n+\tint stringlen;\n+\tchar **names;\n+\tchar *str;\n+\tint ret;\n+\tint i;\n+\n+\tnames = NULL;\n+\tstr = strdup(in_str);\n+\tif (str == NULL) {\n+\t\tret = ENOMEM;\n+\t\tgoto out;\n+\t}\n+\tstringlen = strlen(str);\n+\n+\tfor (i = 0, max_names_nb = 1; str[i] != '\\0'; i++) {\n+\t\tif (str[i] == ',')\n+\t\t\tmax_names_nb++;\n+\t}\n+\n+\tnames = calloc(max_names_nb, sizeof(*names));\n+\tif (names == NULL) {\n+\t\tret = ENOMEM;\n+\t\tgoto out;\n+\t}\n+\n+\tnames_nb = rte_strsplit(str, stringlen, names, max_names_nb, ',');\n+\tprintf(\"max names is %d\\n\", max_names_nb);\n+\tif (names_nb < 0) {\n+\t\tret = EINVAL;\n+\t\tgoto out;\n+\t}\n+\n+\t*xstats = calloc(names_nb, sizeof(**xstats));\n+\tif (*xstats == NULL) {\n+\t\tret = ENOMEM;\n+\t\tgoto out;\n+\t}\n+\n+\tfor (i = 0; i < names_nb; i++)\n+\t\trte_strscpy((*xstats)[i].name, names[i],\n+\t\t\t sizeof((*xstats)[i].name));\n+\n+\t*xstats_num = names_nb;\n+\tret = 0;\n+\n+out:\n+\tfree(names);\n+\tfree(str);\n+\treturn ret;\n+}\n+\n unsigned int\n parse_item_list(char* str, const char* item_name, unsigned int max_items,\n \t\tunsigned int *parsed_items, int check_unique_values)\ndiff --git a/app/test-pmd/config.c b/app/test-pmd/config.c\nindex 43c79b5021..8e71b664cd 100644\n--- a/app/test-pmd/config.c\n+++ b/app/test-pmd/config.c\n@@ -173,6 +173,70 @@ print_ethaddr(const char *name, struct rte_ether_addr *eth_addr)\n \tprintf(\"%s%s\", name, buf);\n }\n \n+static void\n+nic_xstats_display_periodic(portid_t port_id)\n+{\n+\tstruct xstat_display_info *xstats_info;\n+\tuint64_t *prev_values, *curr_values;\n+\tuint64_t diff_value, value_rate;\n+\tuint64_t *ids, *ids_supp;\n+\tstruct timespec cur_time;\n+\tunsigned int i, i_supp;\n+\tsize_t ids_supp_sz;\n+\tuint64_t diff_ns;\n+\tint rc;\n+\n+\txstats_info = &xstats_per_port[port_id];\n+\n+\tids_supp_sz = xstats_info->ids_supp_sz;\n+\tif (xstats_display_num == 0 || ids_supp_sz == 0)\n+\t\treturn;\n+\n+\tprintf(\"\\n\");\n+\n+\tids = xstats_info->ids;\n+\tids_supp = xstats_info->ids_supp;\n+\tprev_values = xstats_info->prev_values;\n+\tcurr_values = xstats_info->curr_values;\n+\n+\trc = rte_eth_xstats_get_by_id(port_id, ids_supp, curr_values,\n+\t\t\t\t ids_supp_sz);\n+\tif (rc != (int)ids_supp_sz) {\n+\t\tfprintf(stderr, \"%s: Failed to get values of %zu supported xstats for port %u - return code %d\\n\",\n+\t\t\t__func__, ids_supp_sz, port_id, rc);\n+\t\treturn;\n+\t}\n+\n+\tdiff_ns = 0;\n+\tif (clock_gettime(CLOCK_TYPE_ID, &cur_time) == 0) {\n+\t\tuint64_t ns;\n+\n+\t\tns = cur_time.tv_sec * NS_PER_SEC;\n+\t\tns += cur_time.tv_nsec;\n+\n+\t\tif (xstats_info->prev_ns != 0)\n+\t\t\tdiff_ns = ns - xstats_info->prev_ns;\n+\t\txstats_info->prev_ns = ns;\n+\t}\n+\n+\tprintf(\"%-31s%-17s%s\\n\", \" \", \"Value\", \"Rate (since last show)\");\n+\tfor (i = i_supp = 0; i < xstats_display_num; i++) {\n+\t\tif (ids[i] == XSTAT_ID_INVALID)\n+\t\t\tcontinue;\n+\n+\t\tdiff_value = (curr_values[i_supp] > prev_values[i]) ?\n+\t\t\t (curr_values[i_supp] - prev_values[i]) : 0;\n+\t\tprev_values[i] = curr_values[i_supp];\n+\t\tvalue_rate = diff_ns > 0 ?\n+\t\t\t\t(double)diff_value / diff_ns * NS_PER_SEC : 0;\n+\n+\t\tprintf(\" %-25s%12\"PRIu64\" %15\"PRIu64\"\\n\",\n+\t\t xstats_display[i].name, curr_values[i_supp], value_rate);\n+\n+\t\ti_supp++;\n+\t}\n+}\n+\n void\n nic_stats_display(portid_t port_id)\n {\n@@ -243,6 +307,8 @@ nic_stats_display(portid_t port_id)\n \t PRIu64\" Tx-bps: %12\"PRIu64\"\\n\", mpps_rx, mbps_rx * 8,\n \t mpps_tx, mbps_tx * 8);\n \n+\tnic_xstats_display_periodic(port_id);\n+\n \tprintf(\" %s############################%s\\n\",\n \t nic_stats_border, nic_stats_border);\n }\ndiff --git a/app/test-pmd/parameters.c b/app/test-pmd/parameters.c\nindex f3954c1c63..0fecc5e8f8 100644\n--- a/app/test-pmd/parameters.c\n+++ b/app/test-pmd/parameters.c\n@@ -62,6 +62,9 @@ usage(char* progname)\n \t \"(only if interactive is disabled).\\n\");\n \tprintf(\" --stats-period=PERIOD: statistics will be shown \"\n \t \"every PERIOD seconds (only if interactive is disabled).\\n\");\n+\tprintf(\" --display-xstats xstat1[,...]: extended statistics to show. \"\n+\t \"Used with --stats-period specified or interactive commands \"\n+\t \"that show Rx/Tx statistics (i.e. 'show port stats').\\n\");\n \tprintf(\" --nb-cores=N: set the number of forwarding cores \"\n \t \"(1 <= N <= %d).\\n\", nb_lcores);\n \tprintf(\" --nb-ports=N: set the number of forwarding ports \"\n@@ -531,6 +534,7 @@ launch_args_parse(int argc, char** argv)\n #endif\n \t\t{ \"tx-first\",\t\t\t0, 0, 0 },\n \t\t{ \"stats-period\",\t\t1, 0, 0 },\n+\t\t{ \"display-xstats\",\t\t1, 0, 0 },\n \t\t{ \"nb-cores\",\t\t\t1, 0, 0 },\n \t\t{ \"nb-ports\",\t\t\t1, 0, 0 },\n \t\t{ \"coremask\",\t\t\t1, 0, 0 },\n@@ -686,6 +690,20 @@ launch_args_parse(int argc, char** argv)\n \t\t\t\tstats_period = n;\n \t\t\t\tbreak;\n \t\t\t}\n+\t\t\tif (!strcmp(lgopts[opt_idx].name, \"display-xstats\")) {\n+\t\t\t\tchar rc;\n+\n+\t\t\t\trc = parse_xstats_list(optarg, &xstats_display,\n+\t\t\t\t\t\t &xstats_display_num);\n+\t\t\t\tif (rc != 0)\n+\t\t\t\t\trte_exit(EXIT_FAILURE,\n+\t\t\t\t\t\t \"Failed to fill xstats to display: %d\\n\",\n+\t\t\t\t\t\t rc);\n+\n+\t\t\t\tif (alloc_display_xstats_info() != 0)\n+\t\t\t\t\trte_exit(EXIT_FAILURE,\n+\t\t\t\t\t\t \"Failed to alloc xstats display memory\\n\");\n+\t\t\t}\n \t\t\tif (!strcmp(lgopts[opt_idx].name,\n \t\t\t\t \"eth-peers-configfile\")) {\n \t\t\t\tif (init_peer_eth_addrs(optarg) != 0)\ndiff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c\nindex 8ed1b97dec..8ce61cb0ff 100644\n--- a/app/test-pmd/testpmd.c\n+++ b/app/test-pmd/testpmd.c\n@@ -203,6 +203,14 @@ uint32_t param_total_num_mbufs = 0; /**< number of mbufs in all pools - if\n * specified on command-line. */\n uint16_t stats_period; /**< Period to show statistics (disabled by default) */\n \n+/** Extended statistics to show. */\n+struct rte_eth_xstat_name *xstats_display;\n+\n+unsigned int xstats_display_num; /**< Size of extended statistics to show */\n+\n+/** Helper structures for each port to show extended statistics. */\n+struct xstat_display_info xstats_per_port[RTE_MAX_ETHPORTS];\n+\n /*\n * In container, it cannot terminate the process which running with 'stats-period'\n * option. Set flag to exit stats period loop after received SIGINT/SIGTERM.\n@@ -537,6 +545,12 @@ uint16_t gso_max_segment_size = RTE_ETHER_MAX_LEN - RTE_ETHER_CRC_LEN;\n /* Holds the registered mbuf dynamic flags names. */\n char dynf_names[64][RTE_MBUF_DYN_NAMESIZE];\n \n+/** Fill helper structures for specified port to show extended statistics. */\n+static void fill_display_xstats_info_for_port(portid_t pi);\n+\n+/** Fill helper structures for all ports to show extended statistics. */\n+static void fill_display_xstats_info(void);\n+\n /*\n * Helper function to check if socket is already discovered.\n * If yes, return positive value. If not, return zero.\n@@ -2675,6 +2689,8 @@ start_port(portid_t pid)\n \t\t}\n \t}\n \n+\tfill_display_xstats_info_for_port(pid);\n+\n \tprintf(\"Done\\n\");\n \treturn 0;\n }\n@@ -3693,6 +3709,110 @@ force_quit(void)\n \tprompt_exit();\n }\n \n+int\n+alloc_display_xstats_info(void)\n+{\n+\tportid_t port;\n+\tuint64_t *mem;\n+\tsize_t mem_size;\n+\n+\tif (xstats_display_num == 0)\n+\t\treturn 0;\n+\n+\tmemset(xstats_per_port, 0, sizeof(xstats_per_port));\n+\n+\tfor (port = 0; port < RTE_MAX_ETHPORTS; port++) {\n+\t\tuint64_t **ids = &xstats_per_port[port].ids;\n+\t\tuint64_t **ids_supp = &xstats_per_port[port].ids_supp;\n+\t\tuint64_t **prev_values = &xstats_per_port[port].prev_values;\n+\t\tuint64_t **curr_values = &xstats_per_port[port].curr_values;\n+\n+\t\tif (port == 0) {\n+\t\t\tmem_size = RTE_MAX_ETHPORTS * xstats_display_num *\n+\t\t\t\t (sizeof(**ids) + sizeof(**ids_supp) +\n+\t\t\t\t sizeof(**prev_values) +\n+\t\t\t\t sizeof(**curr_values));\n+\n+\t\t\tmem = malloc(mem_size);\n+\t\t\tif (mem == NULL)\n+\t\t\t\treturn -ENOMEM;\n+\n+\t\t\tmemset(mem, 0, mem_size);\n+\t\t}\n+\n+\t\t*ids = mem;\n+\t\tmem += xstats_display_num * sizeof(**ids);\n+\n+\t\t*ids_supp = mem;\n+\t\tmem += xstats_display_num * sizeof(**ids_supp);\n+\n+\t\t*prev_values = mem;\n+\t\tmem += xstats_display_num * sizeof(**prev_values);\n+\n+\t\t*curr_values = mem;\n+\t\tmem += xstats_display_num * sizeof(**curr_values);\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static void\n+fill_display_xstats_info_for_port(portid_t pi)\n+{\n+\tunsigned int stat, stat_supp;\n+\tuint64_t *ids, *ids_supp;\n+\tconst char *xstat_name;\n+\tstruct rte_port *port;\n+\tint rc;\n+\n+\tif (xstats_display_num == 0)\n+\t\treturn;\n+\n+\tif (pi == (portid_t)RTE_PORT_ALL) {\n+\t\tfill_display_xstats_info();\n+\t\treturn;\n+\t}\n+\n+\tport = &ports[pi];\n+\tif (port->port_status != RTE_PORT_STARTED)\n+\t\treturn;\n+\n+\tids = xstats_per_port[pi].ids;\n+\tids_supp = xstats_per_port[pi].ids_supp;\n+\n+\tfor (stat = stat_supp = 0; stat < xstats_display_num; stat++) {\n+\t\txstat_name = xstats_display[stat].name;\n+\n+\t\trc = rte_eth_xstats_get_id_by_name(pi, xstat_name,\n+\t\t\t\t\t\t ids + stat);\n+\t\tif (rc != 0) {\n+\t\t\tids[stat] = XSTAT_ID_INVALID;\n+\t\t\tprintf(\"No xstat '%s' on port %u - skip it\\n\",\n+\t\t\t xstat_name, pi);\n+\t\t\tcontinue;\n+\t\t}\n+\t\tids_supp[stat_supp++] = ids[stat];\n+\t}\n+\n+\txstats_per_port[pi].ids_supp_sz = stat_supp;\n+}\n+\n+static void\n+fill_display_xstats_info(void)\n+{\n+\tportid_t pi;\n+\n+\tif (xstats_display_num == 0)\n+\t\treturn;\n+\n+\tRTE_ETH_FOREACH_DEV(pi) {\n+\t\tif (pi == (portid_t)RTE_PORT_ALL)\n+\t\t\tcontinue;\n+\n+\t\tfill_display_xstats_info_for_port(pi);\n+\t}\n+}\n+\n static void\n print_stats(void)\n {\n@@ -3889,6 +4009,8 @@ main(int argc, char** argv)\n \t}\n #endif\n \n+\tfill_display_xstats_info();\n+\n #ifdef RTE_LIB_CMDLINE\n \tif (strlen(cmdline_filename) != 0)\n \t\tcmdline_read_from_file(cmdline_filename);\ndiff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h\nindex 283b5e3680..d5a42a9e9c 100644\n--- a/app/test-pmd/testpmd.h\n+++ b/app/test-pmd/testpmd.h\n@@ -433,6 +433,24 @@ extern uint32_t param_total_num_mbufs;\n \n extern uint16_t stats_period;\n \n+extern struct rte_eth_xstat_name *xstats_display;\n+extern unsigned int xstats_display_num;\n+\n+#define XSTAT_ID_INVALID UINT64_MAX\n+\n+/** Information for an extended statistics to show. */\n+struct xstat_display_info {\n+\t/** IDs of xstats in the order of xstats_display */\n+\tuint64_t *ids;\n+\t/** Supported xstats IDs in the order of xstats_display */\n+\tuint64_t *ids_supp;\n+\tsize_t ids_supp_sz;\n+\tuint64_t *prev_values;\n+\tuint64_t *curr_values;\n+\tuint64_t prev_ns;\n+};\n+extern struct xstat_display_info xstats_per_port[];\n+\n extern uint16_t hairpin_mode;\n \n #ifdef RTE_LIB_LATENCYSTATS\n@@ -765,6 +783,8 @@ inc_tx_burst_stats(struct fwd_stream *fs, uint16_t nb_tx)\n unsigned int parse_item_list(char* str, const char* item_name,\n \t\t\tunsigned int max_items,\n \t\t\tunsigned int *parsed_items, int check_unique_values);\n+int parse_xstats_list(char *in_str, struct rte_eth_xstat_name **xstats,\n+\t\t unsigned int *xstats_num);\n void launch_args_parse(int argc, char** argv);\n void cmdline_read_from_file(const char *filename);\n void prompt(void);\n@@ -977,6 +997,7 @@ enum print_warning {\n int port_id_is_invalid(portid_t port_id, enum print_warning warning);\n void print_valid_ports(void);\n int new_socket_id(unsigned int socket_id);\n+int alloc_display_xstats_info(void);\n \n queueid_t get_allowed_max_nb_rxq(portid_t *pid);\n int check_nb_rxq(queueid_t rxq);\ndiff --git a/doc/guides/testpmd_app_ug/run_app.rst b/doc/guides/testpmd_app_ug/run_app.rst\nindex eb48318353..3e5ba81f18 100644\n--- a/doc/guides/testpmd_app_ug/run_app.rst\n+++ b/doc/guides/testpmd_app_ug/run_app.rst\n@@ -56,6 +56,11 @@ The command line options are:\n Display statistics every PERIOD seconds, if interactive mode is disabled.\n The default value is 0, which means that the statistics will not be displayed.\n \n+* ``--display-xstats xstat1[,...]``\n+\n+ Display extended statistics every PERIOD seconds as specified in ``--stats-period``\n+ or when used with interactive commands that show Rx/Tx statistics (i.e. 'show port stats').\n+\n * ``--nb-cores=N``\n \n Set the number of forwarding cores,\n", "prefixes": [ "11/11" ] }{ "id": 93911, "url": "