[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <1375240122.10515.54.camel@edumazet-glaptop>
Date: Tue, 30 Jul 2013 20:08:42 -0700
From: Eric Dumazet <eric.dumazet@...il.com>
To: Yang Yingliang <yangyingliang@...wei.com>
Cc: Jamal Hadi Salim <jhs@...atatu.com>,
"David S. Miller" <davem@...emloft.net>, netdev@...r.kernel.org
Subject: Re: [PATCH] pkt_sched: fix bandwidth's accuracy of software device
with htb
On Wed, 2013-07-31 at 10:39 +0800, Yang Yingliang wrote:
> When we set bandwidth on the software devices with htb,
> it's not precise.
>
> With htb, sch->limit is set from devices TX queue's
> length that is not 0. Because software devices TX
> queue is 0, sch->limit is set to default value 1.
>
> Because the length of skb_buff queue is bigger than
> sch->limit whose value is 1, some packets are dropped.
> This leads to software devices can't make full use of
> the bandwidth and influence the accuracy.
>
> To fix this issue, set the default value of sch->limit
> to 1000 that is the value of eth device's tx_queueu_len.
>
> Example:
> tc qdisc add dev bond0 root handle 1: htb default 1
> tc class add dev bond0 parent 1:0 classid 1:1 htb rate 1Gbit ceil 1Gbit
> iperf -c host -t 30 -i 10
>
> With old sch->limit:
> [ ID] Interval Transfer Bandwidth
> [ 3] 0.0-10.0 sec 579 MBytes 486 Mbits/sec
> [ 3] 10.0-20.0 sec 604 MBytes 507 Mbits/sec
> [ 3] 20.0-30.0 sec 551 MBytes 462 Mbits/sec
> [ 3] 0.0-30.0 sec 1.69 GBytes 485 Mbits/sec
>
> With new sch->limit:
> [ ID] Interval Transfer Bandwidth
> [ 3] 0.0-10.0 sec 1.11 GBytes 955 Mbits/sec
> [ 3] 10.0-20.0 sec 1.11 GBytes 955 Mbits/sec
> [ 3] 20.0-30.0 sec 1.11 GBytes 955 Mbits/sec
> [ 3] 0.0-30.0 sec 3.33 GBytes 955 Mbits/sec
>
> Signed-off-by: Yang Yingliang <yangyingliang@...wei.com>
> ---
> net/sched/sch_fifo.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/net/sched/sch_fifo.c b/net/sched/sch_fifo.c
> index e15a9eb..8dd27ec 100644
> --- a/net/sched/sch_fifo.c
> +++ b/net/sched/sch_fifo.c
> @@ -54,7 +54,7 @@ static int fifo_init(struct Qdisc *sch, struct nlattr *opt)
> bool is_bfifo = sch->ops == &bfifo_qdisc_ops;
>
> if (opt == NULL) {
> - u32 limit = qdisc_dev(sch)->tx_queue_len ? : 1;
> + u32 limit = qdisc_dev(sch)->tx_queue_len ? : 1000;
>
> if (is_bfifo)
> limit *= psched_mtu(qdisc_dev(sch));
Hmm. This looks like user error to me.
What if existing scripts relied on the limit being 1 ?
If you want to use pfifo on a virtual device, while not setting explicit
limit, you have to "ifconfig bond0 txqueuelen 1000"
Seriously, using pfifo or bfifo without setting explicit plimit/blimit
is not very safe, even with non virtual devices.
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Powered by blists - more mailing lists