[dpdk-dev] [RFC PATCH v2 2/3] lib: add bitrate statistics library
On 28/10/2016 15:39, Morten Br?rup wrote: > Comments below. [..] > When working with statistical calculations using integer arithmetic, > you should round off the integer result by adding 0.5 to the result, > which you do by adding half of the divisor to the dividend, like > this: > > delta = (delta * alpha_percent + 50) / 100; > > The numbers in this particular case are probably very big, so not > rounding off doesn't affect the result a lot; but then you should add > a comment about why rounding down is acceptable. A minor point, but will roll it into the next patchset.
[dpdk-dev] [RFC PATCH v2 2/3] lib: add bitrate statistics library
On 28/10/2016 09:12, Stephen Hemminger wrote: > On Fri, 28 Oct 2016 09:04:30 +0800 > Remy Horton wrote: > >> + >> +struct rte_stats_bitrate_s { >> +uint64_t last_ibytes; >> +uint64_t last_obytes; >> +uint64_t peak_ibits; >> +uint64_t peak_obits; >> +uint64_t ewma_ibits; >> +uint64_t ewma_obits; >> +}; >> + > > Reader/write access of 64 bit values is not safe on 32 bit platforms. > I think you need to add a generation counter (see Linux kernel syncp) > to handle 32 bit architecture. If done correctly, it would be a nop > on 64 bit platforms. I don't see a problem since this is private persistent data that is only read/written from rte_stats_bitrate_calc(), and once calculated it pushes them into the metrics library using rte_metrics_update_metrics(). The idea is that downstream consumers get the values using rte_metrics_get_values() rather than reading rte_stats_bitrate_s directly. Having said that, what you mention quite likley affects the metrics library itself.. :)
[dpdk-dev] [RFC PATCH v2 2/3] lib: add bitrate statistics library
Comments below. > -Original Message- > From: dev [mailto:dev-bounces at dpdk.org] On Behalf Of Remy Horton > Sent: Friday, October 28, 2016 3:05 AM > To: dev at dpdk.org > Subject: [dpdk-dev] [RFC PATCH v2 2/3] lib: add bitrate statistics > library > > This patch adds a library that calculates peak and average data-rate > statistics. For ethernet devices. These statistics are reported using > the metrics library. > > Signed-off-by: Remy Horton > diff --git a/lib/librte_bitratestats/rte_bitrate.c > b/lib/librte_bitratestats/rte_bitrate.c > new file mode 100644 > index 000..fcdf401 > --- /dev/null > +++ b/lib/librte_bitratestats/rte_bitrate.c > @@ -0,0 +1,126 @@ > +/*- > + * BSD LICENSE > + * > + * Copyright(c) 2016 Intel Corporation. All rights reserved. > + * All rights reserved. > + * > + * Redistribution and use in source and binary forms, with or > without > + * modification, are permitted provided that the following > conditions > + * are met: > + * > + * * Redistributions of source code must retain the above > copyright > + * notice, this list of conditions and the following disclaimer. > + * * Redistributions in binary form must reproduce the above > copyright > + * notice, this list of conditions and the following disclaimer > in > + * the documentation and/or other materials provided with the > + * distribution. > + * * Neither the name of Intel Corporation nor the names of its > + * contributors may be used to endorse or promote products > derived > + * from this software without specific prior written permission. > + * > + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND > CONTRIBUTORS > + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT > + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS > FOR > + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE > COPYRIGHT > + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, > INCIDENTAL, > + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT > + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF > USE, > + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON > ANY > + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR > TORT > + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE > USE > + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH > DAMAGE. > + */ > + > +#include > +#include > +#include > +#include > +#include > + > + > +struct rte_stats_bitrate_s { > + uint64_t last_ibytes; > + uint64_t last_obytes; > + uint64_t peak_ibits; > + uint64_t peak_obits; > + uint64_t ewma_ibits; > + uint64_t ewma_obits; > +}; > + > +struct rte_stats_bitrates_s { > + struct rte_stats_bitrate_s port_stats[RTE_MAX_ETHPORTS]; > + uint16_t id_stats_set; > +}; > + > + > +struct rte_stats_bitrates_s *rte_stats_bitrate_create(void) { > + return rte_zmalloc(NULL, sizeof(struct rte_stats_bitrates_s), 0); > } > + > + > +int > +rte_stats_bitrate_reg(struct rte_stats_bitrates_s *bitrate_data) > +{ > + const char *names[] = { > + "mean_bits_in", "mean_bits_out", > + "peak_bits_in", "peak_bits_out", > + }; > + int return_value; > + > + bitrate_data = rte_stats_bitrate_create(); > + if (bitrate_data == NULL) > + rte_exit(EXIT_FAILURE, "Could not allocate bitrate > data.\n"); > + return_value = rte_metrics_reg_metrics(&names[0], 4); > + if (return_value >= 0) > + bitrate_data->id_stats_set = return_value; > + return return_value; > +} > + > + > +int > +rte_stats_bitrate_calc(struct rte_stats_bitrates_s *bitrate_data, > + uint8_t port_id) > +{ > + struct rte_stats_bitrate_s *port_data; > + struct rte_eth_stats eth_stats; > + int ret_code; > + uint64_t cnt_bits; > + int64_t delta; > + const int64_t alpha_percent = 20; > + uint64_t values[4]; > + > + ret_code = rte_eth_stats_get(port_id, ð_stats); > + if (ret_code != 0) > + return ret_code; > + > + port_data = &bitrate_data->port_stats[port_id]; > + > + /* Incoming */ > + cnt_bits = (eth_stats.ibytes - port_data->last_ibytes) << 3; > + port_data->last_ibytes = eth_stats.ibytes; > + if (cnt_bits > port_data->peak_ibits) > + port_data->peak_ibits = cnt_bits; > + delta = cnt_bits;
[dpdk-dev] [RFC PATCH v2 2/3] lib: add bitrate statistics library
This patch adds a library that calculates peak and average data-rate statistics. For ethernet devices. These statistics are reported using the metrics library. Signed-off-by: Remy Horton --- config/common_base | 5 + doc/api/doxy-api-index.md | 1 + doc/api/doxy-api.conf | 1 + lib/Makefile | 1 + lib/librte_bitratestats/Makefile | 53 + lib/librte_bitratestats/rte_bitrate.c | 126 + lib/librte_bitratestats/rte_bitrate.h | 80 + .../rte_bitratestats_version.map | 9 ++ lib/librte_metrics/rte_metrics.c | 22 ++-- lib/librte_metrics/rte_metrics.h | 4 +- mk/rte.app.mk | 1 + 11 files changed, 291 insertions(+), 12 deletions(-) create mode 100644 lib/librte_bitratestats/Makefile create mode 100644 lib/librte_bitratestats/rte_bitrate.c create mode 100644 lib/librte_bitratestats/rte_bitrate.h create mode 100644 lib/librte_bitratestats/rte_bitratestats_version.map diff --git a/config/common_base b/config/common_base index c23a632..e778c00 100644 --- a/config/common_base +++ b/config/common_base @@ -597,3 +597,8 @@ CONFIG_RTE_TEST_PMD_RECORD_BURST_STATS=n # Compile the device metrics library # CONFIG_RTE_LIBRTE_METRICS=y + +# +# Compile the bitrate statistics library +# +CONFIG_RTE_LIBRTE_BITRATE=y diff --git a/doc/api/doxy-api-index.md b/doc/api/doxy-api-index.md index ca50fa6..91e8ea6 100644 --- a/doc/api/doxy-api-index.md +++ b/doc/api/doxy-api-index.md @@ -148,4 +148,5 @@ There are many libraries, so their headers may be grouped by topics: [ABI compat] (@ref rte_compat.h), [keepalive] (@ref rte_keepalive.h), [Device Metrics] (@ref rte_metrics.h), + [Bitrate Statistics] (@ref rte_bitrate.h), [version](@ref rte_version.h) diff --git a/doc/api/doxy-api.conf b/doc/api/doxy-api.conf index fe830eb..8765ddd 100644 --- a/doc/api/doxy-api.conf +++ b/doc/api/doxy-api.conf @@ -58,6 +58,7 @@ INPUT = doc/api/doxy-api-index.md \ lib/librte_ring \ lib/librte_sched \ lib/librte_metrics \ + lib/librte_bitratestats \ lib/librte_table \ lib/librte_timer \ lib/librte_vhost diff --git a/lib/Makefile b/lib/Makefile index 5d85dcf..e211bc0 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -59,6 +59,7 @@ DIRS-$(CONFIG_RTE_LIBRTE_PIPELINE) += librte_pipeline DIRS-$(CONFIG_RTE_LIBRTE_REORDER) += librte_reorder DIRS-$(CONFIG_RTE_LIBRTE_PDUMP) += librte_pdump DIRS-$(CONFIG_RTE_LIBRTE_METRICS) += librte_metrics +DIRS-$(CONFIG_RTE_LIBRTE_BITRATE) += librte_bitratestats ifeq ($(CONFIG_RTE_EXEC_ENV_LINUXAPP),y) DIRS-$(CONFIG_RTE_LIBRTE_KNI) += librte_kni diff --git a/lib/librte_bitratestats/Makefile b/lib/librte_bitratestats/Makefile new file mode 100644 index 000..b725d4e --- /dev/null +++ b/lib/librte_bitratestats/Makefile @@ -0,0 +1,53 @@ +# BSD LICENSE +# +# Copyright(c) 2016 Intel Corporation. All rights reserved. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Intel Corporation nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +include $(RTE_SDK)/mk/rte.vars.mk + +# library name +LIB = librte_bitratest
[dpdk-dev] [RFC PATCH v2 2/3] lib: add bitrate statistics library
On Fri, 28 Oct 2016 09:04:30 +0800 Remy Horton wrote: > + > +struct rte_stats_bitrate_s { > + uint64_t last_ibytes; > + uint64_t last_obytes; > + uint64_t peak_ibits; > + uint64_t peak_obits; > + uint64_t ewma_ibits; > + uint64_t ewma_obits; > +}; > + Reader/write access of 64 bit values is not safe on 32 bit platforms. I think you need to add a generation counter (see Linux kernel syncp) to handle 32 bit architecture. If done correctly, it would be a nop on 64 bit platforms.