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

Reply via email to