DPDK patches and discussions
 help / color / mirror / Atom feed
From: Honnappa Nagarahalli <Honnappa.Nagarahalli@arm.com>
To: Jerin Jacob <jerinjacobk@gmail.com>
Cc: dpdk-dev <dev@dpdk.org>, Ali Alnubani <alialnu@mellanox.com>,
	"orgerlitz@mellanox.com" <orgerlitz@mellanox.com>,
	Wenzhuo Lu <wenzhuo.lu@intel.com>,
	Beilei Xing <beilei.xing@intel.com>,
	Bernard Iremonger <bernard.iremonger@intel.com>,
	"hemant.agrawal@nxp.com" <hemant.agrawal@nxp.com>,
	"jerinj@marvell.com" <jerinj@marvell.com>,
	Slava Ovsiienko <viacheslavo@mellanox.com>,
	"thomas@monjalon.net" <thomas@monjalon.net>,
	Ruifeng Wang <Ruifeng.Wang@arm.com>,
	Phil Yang <Phil.Yang@arm.com>, nd <nd@arm.com>,
	Zhihong Wang <zhihong.wang@intel.com>,
	dpdk stable <stable@dpdk.org>,
	Honnappa Nagarahalli <Honnappa.Nagarahalli@arm.com>,
	nd <nd@arm.com>
Subject: Re: [dpdk-dev] [PATCH 1/5] app/testpmd: clock gettime call in throughput calculation
Date: Thu, 18 Jun 2020 04:03:19 +0000	[thread overview]
Message-ID: <DB6PR0802MB2216C9AA0EFB9488DA4582AE989B0@DB6PR0802MB2216.eurprd08.prod.outlook.com> (raw)
In-Reply-To: <CALBAE1NMmLEfMyky2in3JDjGT9U1sh2UciBAAXRo9Ug8jUpnOw@mail.gmail.com>

Thanks Jerin for the feedback

> -----Original Message-----
> From: Jerin Jacob <jerinjacobk@gmail.com>
> Sent: Wednesday, June 17, 2020 10:16 AM
> To: Honnappa Nagarahalli <Honnappa.Nagarahalli@arm.com>
> Cc: dpdk-dev <dev@dpdk.org>; Ali Alnubani <alialnu@mellanox.com>;
> orgerlitz@mellanox.com; Wenzhuo Lu <wenzhuo.lu@intel.com>; Beilei Xing
> <beilei.xing@intel.com>; Bernard Iremonger <bernard.iremonger@intel.com>;
> hemant.agrawal@nxp.com; jerinj@marvell.com; Slava Ovsiienko
> <viacheslavo@mellanox.com>; thomas@monjalon.net; Ruifeng Wang
> <Ruifeng.Wang@arm.com>; Phil Yang <Phil.Yang@arm.com>; nd
> <nd@arm.com>; Zhihong Wang <zhihong.wang@intel.com>; dpdk stable
> <stable@dpdk.org>
> Subject: Re: [dpdk-dev] [PATCH 1/5] app/testpmd: clock gettime call in
> throughput calculation
> 
> On Wed, Jun 17, 2020 at 8:13 PM Honnappa Nagarahalli
> <honnappa.nagarahalli@arm.com> wrote:
> >
> > The throughput calculation requires a counter that measures passing of
> > time. The PMU cycle counter does not do that. This
> 
> 
> It is not clear from git commit on why PMU cycle counter does not do that?
> On dpdk bootup, we are figuring out the Hz value based on PMU counter
> cycles.
> What is the missing piece here?
As I understand Linux kernel saves the PMU state and restores it every time a thread is scheduled out and in. So, when the thread is scheduled out the PMU cycles are not counted towards that thread. The thread that prints the statistics issues good amount of system calls and I am guessing it is getting scheduled out. So, it is reporting very low cycle count.
 
> 
> IMO, PMU counter should have less latency and more granularity than
> clock_getime.
In general, agree. In this particular calculation the granularity has not mattered much (for ex: numbers are fine with 50Mhz generic counter and 2.5Ghz CPU). The latency also does not matter as it is getting amortized over a large number of packets. So, I do not see it affecting the reported PPS/BPS numbers.

> 
> > results in incorrect throughput numbers when
> RTE_ARM_EAL_RDTSC_USE_PMU
> > is enabled. Use clock_gettime system call to calculate the time passed
> > since last call.
> >
> > Bugzilla ID: 450
> > Fixes: 0e106980301d ("app/testpmd: show throughput in port stats")
> > Cc: zhihong.wang@intel.com
> > Cc: stable@dpdk.org
> >
> > Signed-off-by: Honnappa Nagarahalli <honnappa.nagarahalli@arm.com>
> > Reviewed-by: Phil Yang <phil.yang@arm.com>
> > Reviewed-by: Ruifeng Wang <ruifeng.wang@arm.com>
> > ---
> >  app/test-pmd/config.c | 44
> > +++++++++++++++++++++++++++++--------------
> >  1 file changed, 30 insertions(+), 14 deletions(-)
> >
> > diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c index
> > 016bcb09c..91fbf99f8 100644
> > --- a/app/test-pmd/config.c
> > +++ b/app/test-pmd/config.c
> > @@ -54,6 +54,14 @@
> >
> >  #define ETHDEV_FWVERS_LEN 32
> >
> > +#ifdef CLOCK_MONOTONIC_RAW /* Defined in glibc bits/time.h */ #define
> > +CLOCK_TYPE_ID CLOCK_MONOTONIC_RAW #else #define CLOCK_TYPE_ID
> > +CLOCK_MONOTONIC #endif
> > +
> > +#define NS_PER_SEC 1E9
> > +
> >  static char *flowtype_to_str(uint16_t flow_type);
> >
> >  static const struct {
> > @@ -136,9 +144,10 @@ nic_stats_display(portid_t port_id)
> >         static uint64_t prev_pkts_tx[RTE_MAX_ETHPORTS];
> >         static uint64_t prev_bytes_rx[RTE_MAX_ETHPORTS];
> >         static uint64_t prev_bytes_tx[RTE_MAX_ETHPORTS];
> > -       static uint64_t prev_cycles[RTE_MAX_ETHPORTS];
> > +       static uint64_t prev_ns[RTE_MAX_ETHPORTS];
> > +       struct timespec cur_time;
> >         uint64_t diff_pkts_rx, diff_pkts_tx, diff_bytes_rx, diff_bytes_tx,
> > -                                                               diff_cycles;
> > +
> > + diff_ns;
> >         uint64_t mpps_rx, mpps_tx, mbps_rx, mbps_tx;
> >         struct rte_eth_stats stats;
> >         struct rte_port *port = &ports[port_id]; @@ -195,10 +204,17 @@
> > nic_stats_display(portid_t port_id)
> >                 }
> >         }
> >
> > -       diff_cycles = prev_cycles[port_id];
> > -       prev_cycles[port_id] = rte_rdtsc();
> > -       if (diff_cycles > 0)
> > -               diff_cycles = prev_cycles[port_id] - diff_cycles;
> > +       diff_ns = 0;
> > +       if (clock_gettime(CLOCK_TYPE_ID, &cur_time) == 0) {
> > +               uint64_t ns;
> > +
> > +               ns = cur_time.tv_sec * NS_PER_SEC;
> > +               ns += cur_time.tv_nsec;
> > +
> > +               if (prev_ns[port_id] != 0)
> > +                       diff_ns = ns - prev_ns[port_id];
> > +               prev_ns[port_id] = ns;
> > +       }
> >
> >         diff_pkts_rx = (stats.ipackets > prev_pkts_rx[port_id]) ?
> >                 (stats.ipackets - prev_pkts_rx[port_id]) : 0; @@
> > -206,10 +222,10 @@ nic_stats_display(portid_t port_id)
> >                 (stats.opackets - prev_pkts_tx[port_id]) : 0;
> >         prev_pkts_rx[port_id] = stats.ipackets;
> >         prev_pkts_tx[port_id] = stats.opackets;
> > -       mpps_rx = diff_cycles > 0 ?
> > -               diff_pkts_rx * rte_get_tsc_hz() / diff_cycles : 0;
> > -       mpps_tx = diff_cycles > 0 ?
> > -               diff_pkts_tx * rte_get_tsc_hz() / diff_cycles : 0;
> > +       mpps_rx = diff_ns > 0 ?
> > +               (double)diff_pkts_rx / diff_ns * NS_PER_SEC : 0;
> > +       mpps_tx = diff_ns > 0 ?
> > +               (double)diff_pkts_tx / diff_ns * NS_PER_SEC : 0;
> >
> >         diff_bytes_rx = (stats.ibytes > prev_bytes_rx[port_id]) ?
> >                 (stats.ibytes - prev_bytes_rx[port_id]) : 0; @@
> > -217,10 +233,10 @@ nic_stats_display(portid_t port_id)
> >                 (stats.obytes - prev_bytes_tx[port_id]) : 0;
> >         prev_bytes_rx[port_id] = stats.ibytes;
> >         prev_bytes_tx[port_id] = stats.obytes;
> > -       mbps_rx = diff_cycles > 0 ?
> > -               diff_bytes_rx * rte_get_tsc_hz() / diff_cycles : 0;
> > -       mbps_tx = diff_cycles > 0 ?
> > -               diff_bytes_tx * rte_get_tsc_hz() / diff_cycles : 0;
> > +       mbps_rx = diff_ns > 0 ?
> > +               (double)diff_bytes_rx / diff_ns * NS_PER_SEC : 0;
> > +       mbps_tx = diff_ns > 0 ?
> > +               (double)diff_bytes_tx / diff_ns * NS_PER_SEC : 0;
> >
> >         printf("\n  Throughput (since last show)\n");
> >         printf("  Rx-pps: %12"PRIu64"          Rx-bps: %12"PRIu64"\n  Tx-
> pps: %12"
> > --
> > 2.17.1
> >

  reply	other threads:[~2020-06-18  4:03 UTC|newest]

Thread overview: 40+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-06-17 14:43 Honnappa Nagarahalli
2020-06-17 14:43 ` [dpdk-dev] [PATCH 2/5] app/testpmd: enable burst stats for flowgen mode rx path Honnappa Nagarahalli
2020-06-18 14:57   ` Phil Yang
2020-06-17 14:43 ` [dpdk-dev] [PATCH 3/5] app/testpmd: enable burst stats for noisy vnf mode Honnappa Nagarahalli
2020-06-18  7:16   ` Jens Freimann
2020-06-17 14:43 ` [dpdk-dev] [PATCH 4/5] app/testpmd: fix burst percentage calculation Honnappa Nagarahalli
2020-06-18 15:01   ` Phil Yang
2020-06-23 13:33   ` Ali Alnubani
2020-06-17 14:43 ` [dpdk-dev] [PATCH 5/5] app/testpmd: enable empty polls in burst stats Honnappa Nagarahalli
2020-06-18 15:05   ` Phil Yang
2020-06-23 13:34   ` Ali Alnubani
2020-06-17 15:16 ` [dpdk-dev] [PATCH 1/5] app/testpmd: clock gettime call in throughput calculation Jerin Jacob
2020-06-18  4:03   ` Honnappa Nagarahalli [this message]
2020-06-18 10:16     ` Jerin Jacob
2020-06-18 15:08 ` Phil Yang
2020-06-23 13:33 ` Ali Alnubani
2020-06-26 22:09 ` [dpdk-dev] [PATCH v2 " Honnappa Nagarahalli
2020-06-26 22:09   ` [dpdk-dev] [PATCH v2 2/5] app/testpmd: enable burst stats for flowgen mode rx path Honnappa Nagarahalli
2020-07-06 16:02     ` Ferruh Yigit
2020-07-06 17:06       ` Honnappa Nagarahalli
2020-07-06 17:17         ` Ferruh Yigit
2020-07-06 18:46           ` Honnappa Nagarahalli
2020-06-26 22:09   ` [dpdk-dev] [PATCH v2 3/5] app/testpmd: enable burst stats for noisy vnf mode Honnappa Nagarahalli
2020-07-06 16:08     ` Ferruh Yigit
2020-07-06 16:59       ` Honnappa Nagarahalli
2020-07-06 17:11         ` Ferruh Yigit
2020-07-06 17:41           ` Honnappa Nagarahalli
2020-06-26 22:09   ` [dpdk-dev] [PATCH v2 4/5] app/testpmd: fix burst percentage calculation Honnappa Nagarahalli
2020-07-06 16:10     ` Ferruh Yigit
2020-06-26 22:09   ` [dpdk-dev] [PATCH v2 5/5] app/testpmd: enable empty polls in burst stats Honnappa Nagarahalli
2020-07-06 17:05     ` Ferruh Yigit
2020-07-06 19:11       ` Honnappa Nagarahalli
2020-07-07  9:32         ` Ferruh Yigit
2020-07-06 15:36   ` [dpdk-dev] [PATCH v2 1/5] app/testpmd: clock gettime call in throughput calculation Ferruh Yigit
2020-07-06 16:53     ` Honnappa Nagarahalli
2020-07-06 17:19       ` Ferruh Yigit
2020-07-06 23:32 ` [dpdk-dev] [PATCH v3 1/3] " Honnappa Nagarahalli
2020-07-06 23:32   ` [dpdk-dev] [PATCH v3 2/3] app/testpmd: fix burst percentage calculation Honnappa Nagarahalli
2020-07-06 23:32   ` [dpdk-dev] [PATCH v3 3/3] app/testpmd: enable empty polls in burst stats Honnappa Nagarahalli
2020-07-07 17:47   ` [dpdk-dev] [PATCH v3 1/3] app/testpmd: clock gettime call in throughput calculation Ferruh Yigit

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=DB6PR0802MB2216C9AA0EFB9488DA4582AE989B0@DB6PR0802MB2216.eurprd08.prod.outlook.com \
    --to=honnappa.nagarahalli@arm.com \
    --cc=Phil.Yang@arm.com \
    --cc=Ruifeng.Wang@arm.com \
    --cc=alialnu@mellanox.com \
    --cc=beilei.xing@intel.com \
    --cc=bernard.iremonger@intel.com \
    --cc=dev@dpdk.org \
    --cc=hemant.agrawal@nxp.com \
    --cc=jerinj@marvell.com \
    --cc=jerinjacobk@gmail.com \
    --cc=nd@arm.com \
    --cc=orgerlitz@mellanox.com \
    --cc=stable@dpdk.org \
    --cc=thomas@monjalon.net \
    --cc=viacheslavo@mellanox.com \
    --cc=wenzhuo.lu@intel.com \
    --cc=zhihong.wang@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).