examples/distributor: allow for extra stats
authorDavid Hunt <david.hunt@intel.com>
Mon, 20 Mar 2017 10:08:35 +0000 (10:08 +0000)
committerThomas Monjalon <thomas.monjalon@6wind.com>
Wed, 29 Mar 2017 14:46:57 +0000 (16:46 +0200)
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@intel.com>
Acked-by: Bruce Richardson <bruce.richardson@intel.com>
examples/distributor/main.c

index a748985..a8a5e80 100644 (file)
 
 #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,16 @@ 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;
+               }
+               usleep(1000);
+       }
+
        RTE_LCORE_FOREACH_SLAVE(lcore_id) {
                if (rte_eal_wait_lcore(lcore_id) < 0)
                        return -1;