[dpdk-dev] app/testpmd: print statistics periodically

Message ID 1496007534-182470-1-git-send-email-pablo.de.lara.guarch@intel.com (mailing list archive)
State Superseded, archived
Headers

Checks

Context Check Description
ci/checkpatch success coding style OK
ci/Intel-compilation success Compilation OK

Commit Message

De Lara Guarch, Pablo May 28, 2017, 9:38 p.m. UTC
  Add parameter to print port statistics periodically
(disabled by default), if interactive mode is not enabled.

This is useful to allow the user to see port statistics
without having to get into the internal command line.

Signed-off-by: Pablo de Lara <pablo.de.lara.guarch@intel.com>
---
 app/test-pmd/parameters.c             | 15 ++++++++++++-
 app/test-pmd/testpmd.c                | 40 ++++++++++++++++++++++++++++++++++-
 app/test-pmd/testpmd.h                |  1 +
 doc/guides/testpmd_app_ug/run_app.rst |  5 +++++
 4 files changed, 59 insertions(+), 2 deletions(-)
  

Comments

Jingjing Wu June 7, 2017, 9:11 a.m. UTC | #1
> -----Original Message-----
> From: De Lara Guarch, Pablo
> Sent: Monday, May 29, 2017 5:39 AM
> To: Wu, Jingjing <jingjing.wu@intel.com>
> Cc: dev@dpdk.org; De Lara Guarch, Pablo <pablo.de.lara.guarch@intel.com>
> Subject: [PATCH] app/testpmd: print statistics periodically
> 
> Add parameter to print port statistics periodically
> (disabled by default), if interactive mode is not enabled.
> 
> This is useful to allow the user to see port statistics
> without having to get into the internal command line.
> 
> Signed-off-by: Pablo de Lara <pablo.de.lara.guarch@intel.com>
> ---
>  app/test-pmd/parameters.c             | 15 ++++++++++++-
>  app/test-pmd/testpmd.c                | 40
> ++++++++++++++++++++++++++++++++++-
>  app/test-pmd/testpmd.h                |  1 +
>  doc/guides/testpmd_app_ug/run_app.rst |  5 +++++
>  4 files changed, 59 insertions(+), 2 deletions(-)
> 
> diff --git a/app/test-pmd/parameters.c b/app/test-pmd/parameters.c
> index fbe6284..a758b25 100644
> --- a/app/test-pmd/parameters.c
> +++ b/app/test-pmd/parameters.c
> @@ -89,6 +89,7 @@ usage(char* progname)
>  	       "[--cmdline-file=FILENAME] "
>  #endif
>  	       "[--help|-h] | [--auto-start|-a] | ["
> +	       "-T PERIOD: statistics will be shown every PERIOD seconds (only if interactive is
How about change it following format?

"[--help|-h] | [--auto-start|-a] | [ -T PERIOD] | ["
"-T PERIOD: statistics will be shown every PERIOD seconds (only if interactive is
"--coremask=COREMASK --portmask=PORTMASK --numa "


Add line after printf("  --help: ......
printf("-T PERIOD: statistics will be shown every PERIOD seconds (only if interactive is disabled)\n");
  
De Lara Guarch, Pablo June 7, 2017, 1:13 p.m. UTC | #2
Hi Jingjing,

> -----Original Message-----
> From: Wu, Jingjing
> Sent: Wednesday, June 07, 2017 10:12 AM
> To: De Lara Guarch, Pablo
> Cc: dev@dpdk.org
> Subject: RE: [PATCH] app/testpmd: print statistics periodically
> 
> 
> 
> > -----Original Message-----
> > From: De Lara Guarch, Pablo
> > Sent: Monday, May 29, 2017 5:39 AM
> > To: Wu, Jingjing <jingjing.wu@intel.com>
> > Cc: dev@dpdk.org; De Lara Guarch, Pablo
> <pablo.de.lara.guarch@intel.com>
> > Subject: [PATCH] app/testpmd: print statistics periodically
> >
> > Add parameter to print port statistics periodically
> > (disabled by default), if interactive mode is not enabled.
> >
> > This is useful to allow the user to see port statistics
> > without having to get into the internal command line.
> >
> > Signed-off-by: Pablo de Lara <pablo.de.lara.guarch@intel.com>
> > ---
> >  app/test-pmd/parameters.c             | 15 ++++++++++++-
> >  app/test-pmd/testpmd.c                | 40
> > ++++++++++++++++++++++++++++++++++-
> >  app/test-pmd/testpmd.h                |  1 +
> >  doc/guides/testpmd_app_ug/run_app.rst |  5 +++++
> >  4 files changed, 59 insertions(+), 2 deletions(-)
> >
> > diff --git a/app/test-pmd/parameters.c b/app/test-pmd/parameters.c
> > index fbe6284..a758b25 100644
> > --- a/app/test-pmd/parameters.c
> > +++ b/app/test-pmd/parameters.c
> > @@ -89,6 +89,7 @@ usage(char* progname)
> >  	       "[--cmdline-file=FILENAME] "
> >  #endif
> >  	       "[--help|-h] | [--auto-start|-a] | ["
> > +	       "-T PERIOD: statistics will be shown every PERIOD seconds (only
> if interactive is
> How about change it following format?
> 
> "[--help|-h] | [--auto-start|-a] | [ -T PERIOD] | ["
> "-T PERIOD: statistics will be shown every PERIOD seconds (only if
> interactive is
> "--coremask=COREMASK --portmask=PORTMASK --numa "
> 
> 
> Add line after printf("  --help: ......
> printf("-T PERIOD: statistics will be shown every PERIOD seconds (only if
> interactive is disabled)\n");
> 

Agreed. Will change this, thanks for the review.

Pablo
  

Patch

diff --git a/app/test-pmd/parameters.c b/app/test-pmd/parameters.c
index fbe6284..a758b25 100644
--- a/app/test-pmd/parameters.c
+++ b/app/test-pmd/parameters.c
@@ -89,6 +89,7 @@  usage(char* progname)
 	       "[--cmdline-file=FILENAME] "
 #endif
 	       "[--help|-h] | [--auto-start|-a] | ["
+	       "-T PERIOD: statistics will be shown every PERIOD seconds (only if interactive is disabled)"
 	       "--coremask=COREMASK --portmask=PORTMASK --numa "
 	       "--mbuf-size= | --total-num-mbufs= | "
 	       "--nb-cores= | --nb-ports= | "
@@ -639,7 +640,7 @@  launch_args_parse(int argc, char** argv)
 #else
 #define SHORTOPTS ""
 #endif
-	while ((opt = getopt_long(argc, argvopt, SHORTOPTS "ah",
+	while ((opt = getopt_long(argc, argvopt, SHORTOPTS "ahT:",
 				 lgopts, &opt_idx)) != EOF) {
 		switch (opt) {
 #ifdef RTE_LIBRTE_CMDLINE
@@ -653,6 +654,18 @@  launch_args_parse(int argc, char** argv)
 			auto_start = 1;
 			break;
 
+		case 'T':
+		{
+			char *end = NULL;
+			unsigned int n;
+
+			n = strtoul(optarg, &end, 10);
+			if ((optarg[0] == '\0') || (end == NULL) || (*end != '\0'))
+				break;
+
+			stats_period = n;
+			break;
+		}
 		case 0: /*long options */
 			if (!strcmp(lgopts[opt_idx].name, "help")) {
 				usage(argv[0]);
diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index d1041af..2ab783d 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -177,7 +177,7 @@  uint32_t burst_tx_retry_num = BURST_TX_RETRIES;
 uint16_t mbuf_data_size = DEFAULT_MBUF_DATA_SIZE; /**< Mbuf data space size. */
 uint32_t param_total_num_mbufs = 0;  /**< number of mbufs in all pools - if
                                       * specified on command-line. */
-
+uint16_t stats_period; /**< Period to show statistics (disabled by default) */
 /*
  * Configuration of packet segments used by the "txonly" processing engine.
  */
@@ -2229,6 +2229,21 @@  force_quit(void)
 }
 
 static void
+print_stats(void)
+{
+	uint8_t i;
+	const char clr[] = { 27, '[', '2', 'J', '\0' };
+	const char topLeft[] = { 27, '[', '1', ';', '1', 'H', '\0' };
+
+	/* Clear screen and move to top left */
+	printf("%s%s", clr, topLeft);
+
+	printf("\nPort statistics ====================================");
+	for (i = 0; i < cur_fwd_config.nb_fwd_ports; i++)
+		nic_stats_display(fwd_ports_ids[i]);
+}
+
+static void
 signal_handler(int signum)
 {
 	if (signum == SIGINT || signum == SIGTERM) {
@@ -2351,8 +2366,31 @@  main(int argc, char** argv)
 
 		printf("No commandline core given, start packet forwarding\n");
 		start_packet_forwarding(0);
+		if (stats_period != 0) {
+			uint64_t prev_tsc = 0, cur_tsc, timer_tsc = 0;
+			uint64_t timer_period;
+
+			/* Convert to number of cycles */
+			timer_period = stats_period * rte_get_timer_hz();
+
+			while (1) {
+				cur_tsc = rte_rdtsc();
+				timer_tsc += cur_tsc - prev_tsc;
+
+				if (timer_tsc >= timer_period) {
+					print_stats();
+					/* Reset the timer */
+					timer_tsc = 0;
+				}
+				/* Sleep to avoid unnecessary checks */
+				sleep(1);
+				prev_tsc = cur_tsc;
+			}
+		}
+
 		printf("Press enter to exit\n");
 		rc = read(0, &c, 1);
+
 		pmd_test_exit();
 		if (rc < 0)
 			return 1;
diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h
index e6c43ba..8de3379 100644
--- a/app/test-pmd/testpmd.h
+++ b/app/test-pmd/testpmd.h
@@ -378,6 +378,7 @@  extern enum dcb_queue_mapping_mode dcb_q_mapping;
 extern uint16_t mbuf_data_size; /**< Mbuf data space size. */
 extern uint32_t param_total_num_mbufs;
 
+extern uint16_t stats_period;
 
 #ifdef RTE_LIBRTE_LATENCY_STATS
 extern uint8_t latencystats_enabled;
diff --git a/doc/guides/testpmd_app_ug/run_app.rst b/doc/guides/testpmd_app_ug/run_app.rst
index 2a43214..bebe46a 100644
--- a/doc/guides/testpmd_app_ug/run_app.rst
+++ b/doc/guides/testpmd_app_ug/run_app.rst
@@ -188,6 +188,11 @@  The commandline options are:
 
     Start forwarding on initialization.
 
+*   ``-T PERIOD``
+
+    Display statistics every PERIOD seconds, if interactive mode is disabled.
+    The default value is 0, which means that the statistics will not be displayed.
+
 *   ``--nb-cores=N``
 
     Set the number of forwarding cores,