[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, ð_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