On Tue, Apr 07, 2020 at 03:28:06AM +0000, 姜立东 via dev wrote: > From 077ab5387ca2b1dbe64389ef2d2aa8f3956f7c57 Mon Sep 17 00:00:00 2001 > From: Jiang Lidong <[email protected]> > Date: Tue, 7 Apr 2020 10:33:14 +0800 > Subject: [PATCH] dpif-netdev: includes microsecond delta in meter bucket > calculation > > When dp-netdev meter rate is higher than 200Mbps, observe > more than 10% bias from configured rate value with UDP traffic. > > In dp-netdev meter, millisecond delta between now and last used > is taken into bucket size calcualtion, while sub-millisecond part > is truncated. > > If traffic rate is pretty high, time delta can be few milliseconds, > its ratio to truncated part is less than 10:1, the loss of bucket > size caused by truncated can be observed obviously by commited > traffic rate. > > In this patch, microsendcond delta part is included in calculation > of meter bucket to make it more precise. > > Signed-off-by: Jiang Lidong <[email protected]>
one minor typo s/microsendcond/microsecond/ Otherwise, looks good to me, thanks! Acked-by: William Tu <[email protected]> > --- > lib/dpif-netdev.c | 5 +++++ > 1 file changed, 5 insertions(+) > > diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c > index e456cc9..ef14e83 100644 > --- a/lib/dpif-netdev.c > +++ b/lib/dpif-netdev.c > @@ -5735,6 +5735,7 @@ dp_netdev_run_meter(struct dp_netdev *dp, struct > dp_packet_batch *packets_, > struct dp_packet *packet; > long long int long_delta_t; /* msec */ > uint32_t delta_t; /* msec */ > + uint32_t delta_in_us; /* usec */ > const size_t cnt = dp_packet_batch_size(packets_); > uint32_t bytes, volume; > int exceeded_band[NETDEV_MAX_BURST]; > @@ -5765,6 +5766,9 @@ dp_netdev_run_meter(struct dp_netdev *dp, struct > dp_packet_batch *packets_, > Assuming that all racing threads received packets at the same time > to avoid overflow. */ > long_delta_t = 0; > + delta_in_us = 0; > + } else { > + delta_in_us = (now - meter->used) % 1000; > } > > /* Make sure delta_t will not be too large, so that bucket will not > @@ -5800,6 +5804,7 @@ dp_netdev_run_meter(struct dp_netdev *dp, struct > dp_packet_batch *packets_, > > /* Update band's bucket. */ > band->bucket += delta_t * band->up.rate; > + band->bucket += delta_in_us * band->up.rate / 1000; > if (band->bucket > band->up.burst_size) { > band->bucket = band->up.burst_size; > } > -- > 1.8.3.1 > _______________________________________________ > dev mailing list > [email protected] > https://mail.openvswitch.org/mailman/listinfo/ovs-dev _______________________________________________ dev mailing list [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-dev
