[dpdk-dev] [PATCH v9 12/18] examples/distributor: allow for extra stats

Bruce Richardson bruce.richardson at intel.com
Fri Mar 10 17:46:41 CET 2017


On Mon, Mar 06, 2017 at 09:10:27AM +0000, David Hunt wrote:
> This will allow us to see what's going on at various stages
> throughout the sample app, with per-second visibility
> 
> Signed-off-by: David Hunt <david.hunt at intel.com>
> ---
>  examples/distributor/main.c | 139 +++++++++++++++++++++++++++++++++++++++-----
>  1 file changed, 123 insertions(+), 16 deletions(-)
> 
> diff --git a/examples/distributor/main.c b/examples/distributor/main.c
> index cc3bdb0..3657e5d 100644
> --- a/examples/distributor/main.c
> +++ b/examples/distributor/main.c
> @@ -54,24 +54,53 @@
>  
>  #define RTE_LOGTYPE_DISTRAPP RTE_LOGTYPE_USER1
>  
> +#define ANSI_COLOR_RED     "\x1b[31m"
> +#define ANSI_COLOR_RESET   "\x1b[0m"
> +
>  /* mask of enabled ports */
>  static uint32_t enabled_port_mask;
>  volatile uint8_t quit_signal;
>  volatile uint8_t quit_signal_rx;
> +volatile uint8_t quit_signal_dist;
>  
>  static volatile struct app_stats {
>  	struct {
>  		uint64_t rx_pkts;
>  		uint64_t returned_pkts;
>  		uint64_t enqueued_pkts;
> +		uint64_t enqdrop_pkts;
>  	} rx __rte_cache_aligned;
> +	int pad1 __rte_cache_aligned;
> +
> +	struct {
> +		uint64_t in_pkts;
> +		uint64_t ret_pkts;
> +		uint64_t sent_pkts;
> +		uint64_t enqdrop_pkts;
> +	} dist __rte_cache_aligned;
> +	int pad2 __rte_cache_aligned;
>  
>  	struct {
>  		uint64_t dequeue_pkts;
>  		uint64_t tx_pkts;
> +		uint64_t enqdrop_pkts;
>  	} tx __rte_cache_aligned;
> +	int pad3 __rte_cache_aligned;
> +
> +	uint64_t worker_pkts[64] __rte_cache_aligned;
> +
> +	int pad4 __rte_cache_aligned;
> +
> +	uint64_t worker_bursts[64][8] __rte_cache_aligned;
> +
> +	int pad5 __rte_cache_aligned;
> +
> +	uint64_t port_rx_pkts[64] __rte_cache_aligned;
> +	uint64_t port_tx_pkts[64] __rte_cache_aligned;
>  } app_stats;
>  
> +struct app_stats prev_app_stats;
> +
>  static const struct rte_eth_conf port_conf_default = {
>  	.rxmode = {
>  		.mq_mode = ETH_MQ_RX_RSS,
> @@ -93,6 +122,8 @@ struct output_buffer {
>  	struct rte_mbuf *mbufs[BURST_SIZE];
>  };
>  
> +static void print_stats(void);
> +
>  /*
>   * Initialises a given port using global settings and with the rx buffers
>   * coming from the mbuf_pool passed as parameter
> @@ -378,25 +409,91 @@ static void
>  print_stats(void)
>  {
>  	struct rte_eth_stats eth_stats;
> -	unsigned i;
> -
> -	printf("\nRX thread stats:\n");
> -	printf(" - Received:    %"PRIu64"\n", app_stats.rx.rx_pkts);
> -	printf(" - Processed:   %"PRIu64"\n", app_stats.rx.returned_pkts);
> -	printf(" - Enqueued:    %"PRIu64"\n", app_stats.rx.enqueued_pkts);
> -
> -	printf("\nTX thread stats:\n");
> -	printf(" - Dequeued:    %"PRIu64"\n", app_stats.tx.dequeue_pkts);
> -	printf(" - Transmitted: %"PRIu64"\n", app_stats.tx.tx_pkts);
> +	unsigned int i, j;
> +	const unsigned int num_workers = rte_lcore_count() - 4;
>  
>  	for (i = 0; i < rte_eth_dev_count(); i++) {
>  		rte_eth_stats_get(i, &eth_stats);
> -		printf("\nPort %u stats:\n", i);
> -		printf(" - Pkts in:   %"PRIu64"\n", eth_stats.ipackets);
> -		printf(" - Pkts out:  %"PRIu64"\n", eth_stats.opackets);
> -		printf(" - In Errs:   %"PRIu64"\n", eth_stats.ierrors);
> -		printf(" - Out Errs:  %"PRIu64"\n", eth_stats.oerrors);
> -		printf(" - Mbuf Errs: %"PRIu64"\n", eth_stats.rx_nombuf);
> +		app_stats.port_rx_pkts[i] = eth_stats.ipackets;
> +		app_stats.port_tx_pkts[i] = eth_stats.opackets;
> +	}
> +
> +	printf("\n\nRX Thread:\n");
> +	for (i = 0; i < rte_eth_dev_count(); i++) {
> +		printf("Port %u Pktsin : %5.2f\n", i,
> +				(app_stats.port_rx_pkts[i] -
> +				prev_app_stats.port_rx_pkts[i])/1000000.0);
> +		prev_app_stats.port_rx_pkts[i] = app_stats.port_rx_pkts[i];
> +	}
> +	printf(" - Received:    %5.2f\n",
> +			(app_stats.rx.rx_pkts -
> +			prev_app_stats.rx.rx_pkts)/1000000.0);
> +	printf(" - Returned:    %5.2f\n",
> +			(app_stats.rx.returned_pkts -
> +			prev_app_stats.rx.returned_pkts)/1000000.0);
> +	printf(" - Enqueued:    %5.2f\n",
> +			(app_stats.rx.enqueued_pkts -
> +			prev_app_stats.rx.enqueued_pkts)/1000000.0);
> +	printf(" - Dropped:     %s%5.2f%s\n", ANSI_COLOR_RED,
> +			(app_stats.rx.enqdrop_pkts -
> +			prev_app_stats.rx.enqdrop_pkts)/1000000.0,
> +			ANSI_COLOR_RESET);
> +
> +	printf("Distributor thread:\n");
> +	printf(" - In:          %5.2f\n",
> +			(app_stats.dist.in_pkts -
> +			prev_app_stats.dist.in_pkts)/1000000.0);
> +	printf(" - Returned:    %5.2f\n",
> +			(app_stats.dist.ret_pkts -
> +			prev_app_stats.dist.ret_pkts)/1000000.0);
> +	printf(" - Sent:        %5.2f\n",
> +			(app_stats.dist.sent_pkts -
> +			prev_app_stats.dist.sent_pkts)/1000000.0);
> +	printf(" - Dropped      %s%5.2f%s\n", ANSI_COLOR_RED,
> +			(app_stats.dist.enqdrop_pkts -
> +			prev_app_stats.dist.enqdrop_pkts)/1000000.0,
> +			ANSI_COLOR_RESET);
> +
> +	printf("TX thread:\n");
> +	printf(" - Dequeued:    %5.2f\n",
> +			(app_stats.tx.dequeue_pkts -
> +			prev_app_stats.tx.dequeue_pkts)/1000000.0);
> +	for (i = 0; i < rte_eth_dev_count(); i++) {
> +		printf("Port %u Pktsout: %5.2f\n",
> +				i, (app_stats.port_tx_pkts[i] -
> +				prev_app_stats.port_tx_pkts[i])/1000000.0);
> +		prev_app_stats.port_tx_pkts[i] = app_stats.port_tx_pkts[i];
> +	}
> +	printf(" - Transmitted: %5.2f\n",
> +			(app_stats.tx.tx_pkts -
> +			prev_app_stats.tx.tx_pkts)/1000000.0);
> +	printf(" - Dropped:     %s%5.2f%s\n", ANSI_COLOR_RED,
> +			(app_stats.tx.enqdrop_pkts -
> +			prev_app_stats.tx.enqdrop_pkts)/1000000.0,
> +			ANSI_COLOR_RESET);
> +
> +	prev_app_stats.rx.rx_pkts = app_stats.rx.rx_pkts;
> +	prev_app_stats.rx.returned_pkts = app_stats.rx.returned_pkts;
> +	prev_app_stats.rx.enqueued_pkts = app_stats.rx.enqueued_pkts;
> +	prev_app_stats.rx.enqdrop_pkts = app_stats.rx.enqdrop_pkts;
> +	prev_app_stats.dist.in_pkts = app_stats.dist.in_pkts;
> +	prev_app_stats.dist.ret_pkts = app_stats.dist.ret_pkts;
> +	prev_app_stats.dist.sent_pkts = app_stats.dist.sent_pkts;
> +	prev_app_stats.dist.enqdrop_pkts = app_stats.dist.enqdrop_pkts;
> +	prev_app_stats.tx.dequeue_pkts = app_stats.tx.dequeue_pkts;
> +	prev_app_stats.tx.tx_pkts = app_stats.tx.tx_pkts;
> +	prev_app_stats.tx.enqdrop_pkts = app_stats.tx.enqdrop_pkts;
> +
> +	for (i = 0; i < num_workers; i++) {
> +		printf("Worker %02u Pkts: %5.2f. Bursts(1-8): ", i,
> +				(app_stats.worker_pkts[i] -
> +				prev_app_stats.worker_pkts[i])/1000000.0);
> +		for (j = 0; j < 8; j++) {
> +			printf("%"PRIu64" ", app_stats.worker_bursts[i][j]);
> +			app_stats.worker_bursts[i][j] = 0;
> +		}
> +		printf("\n");
> +		prev_app_stats.worker_pkts[i] = app_stats.worker_pkts[i];
>  	}
>  }
>  
> @@ -515,6 +612,7 @@ main(int argc, char *argv[])
>  	unsigned nb_ports;
>  	uint8_t portid;
>  	uint8_t nb_ports_available;
> +	uint64_t t, freq;
>  
>  	/* catch ctrl-c so we can print on exit */
>  	signal(SIGINT, int_handler);
> @@ -610,6 +708,15 @@ main(int argc, char *argv[])
>  	if (lcore_rx(&p) != 0)
>  		return -1;
>  
> +	freq = rte_get_timer_hz();
> +	t = rte_rdtsc() + freq;
> +	while (!quit_signal_dist) {
> +		if (t < rte_rdtsc()) {
> +			print_stats();
> +			t = rte_rdtsc() + freq;
> +		}
> +	}
> +

You can probably put in a usleep or nanosleep inot the while loop above.
No need to burn an entire core by polling the tsc.

/Bruce

> 2.7.4
> 


More information about the dev mailing list