Re: clogging qdisc

Linux Advanced Routing and Traffic Control

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



sch_cake looks promising but is too simple. I've got thousands of customers with different tariffs

My setup (eth0 is FROM customers, eth1 is TO Internet):

/sbin/tc qdisc add dev eth0 root handle 1: hfsc default 1
/sbin/tc qdisc add dev eth1 root handle 1: hfsc default 1

#Base class
/sbin/tc class add dev eth0 parent 1: classid 1:1 hfsc sc m1 2048000kbit d 10000000 m2 2048000kbit ul m1 2048000kbit d 10000000 m2 2048000kbit /sbin/tc class add dev eth1 parent 1: classid 1:1 hfsc sc m1 2048000kbit d 10000000 m2 2048000kbit ul m1 2048000kbit d 10000000 m2 2048000kbit

#Hash filters 1 lvl
/sbin/tc filter add dev eth0 parent 1:0 prio 1 handle 255: protocol ip u32 divisor 256 /sbin/tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 ht 800:: match ip dst 192.168.0.0/16 hashkey mask 0x0000ff00 at 16 link 255: /sbin/tc filter add dev eth1 parent 1:0 prio 1 handle 255: protocol ip u32 divisor 256 /sbin/tc filter add dev eth1 protocol ip parent 1:0 prio 1 u32 ht 800:: match ip src 192.168.0.0/16 hashkey mask 0x0000ff00 at 12 link 255:

#Hash filters 2 lvl
for i in `seq 1 254`; do
    Hi=`printf "%.2x" $i`
    /sbin/tc filter add dev eth0 parent 1:0 prio 1 handle $Hi: protocol ip u32 divisor 256     /sbin/tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 ht 255:$Hi: match ip dst 192.168.$i.0/24 hashkey mask 0x000000ff at 16 link $Hi:
done

for i in `seq 1 254`; do
    Hi=`printf "%.2x" $i`
    /sbin/tc filter add dev eth1 parent 1:0 prio 1 handle $Hi: protocol ip u32 divisor 256     /sbin/tc filter add dev eth1 protocol ip parent 1:0 prio 1 u32 ht 255:$Hi: match ip src 192.168.$i.0/24 hashkey mask 0x000000ff at 12 link $Hi:
done

#And for every customer (about 3000):
######################
let dwnrate=12288
let dwnceil=14336
/sbin/tc class add dev eth0 parent 1: classid 1:0113 hfsc sc m1 $dwnceil"kbit" d 30000000 m2 $dwnrate"kbit" ul m1 $dwnceil"kbit" d 30000000 m2 $dwnrate"kbit"
/sbin/tc qdisc add dev eth0 parent 1:0113 handle 0113: sfq perturb 10

let uplrate=3072
let uplceil=3584
/sbin/tc class add dev eth1 parent 1: classid 1:0113 hfsc sc m1 $uplceil"kbit" d 30000000 m2 $uplrate"kbit" ul m1 $uplceil"kbit" d 30000000 m2 $uplrate"kbit"
/sbin/tc qdisc add dev eth1 parent 1:0113 handle 0113: sfq perturb 10

/sbin/tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 ht 01:13: match ip dst 192.168.1.19/32 flowid 1:0113 /sbin/tc filter add dev eth1 protocol ip parent 1:0 prio 1 u32 ht 01:13: match ip src 192.168.1.19/32 flowid 1:0113
######################

let dwnrate=8192
let dwnceil=10240
/sbin/tc class add dev eth0 parent 1: classid 1:0219 hfsc sc m1 $dwnceil"kbit" d 30000000 m2 $dwnrate"kbit" ul m1 $dwnceil"kbit" d 30000000 m2 $dwnrate"kbit"
/sbin/tc qdisc add dev eth0 parent 1:0219 handle 0219: sfq perturb 10

let uplrate=2048
let uplceil=2560
/sbin/tc class add dev eth1 parent 1: classid 1:0219 hfsc sc m1 $uplceil"kbit" d 30000000 m2 $uplrate"kbit" ul m1 $uplceil"kbit" d 30000000 m2 $uplrate"kbit"
/sbin/tc qdisc add dev eth1 parent 1:0219 handle 0219: sfq perturb 10


/sbin/tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 ht 02:19: match ip dst 192.168.2.25/32 flowid 1:0219 /sbin/tc filter add dev eth1 protocol ip parent 1:0 prio 1 u32 ht 02:19: match ip src 192.168.2.25/32 flowid 1:0219

######################

I use static routing and next container (linked by bridge common for both containers) is doing NAT


I would like to delete classes and filters one by one to find out if this is specific customer that is causing trouble...

I can do:

/sbin/tc qdisc del dev eth0 parent 1:0219 handle 0219: sfq perturb 10

but I can't do

/sbin/tc class del dev eth0 parent 1: classid 1:0219

or

/sbin/tc class del dev eth0 parent 1: classid 1:0219 hfsc sc m1 10240kbit d 30000000 m2 8192kbit ul m1 10240kbit d 30000000 m2 8192kbit

because:

RTNETLINK answers: Device or resource busy

Why?


Deleting filters also does not work as expected

/sbin/tc filter del dev eth0 protocol ip parent 1:0 prio 1 u32 ht 02:19: match ip dst 192.168.2.25/32 flowid 1:0219

deletes all filters. After that

tc -s filter ls dev eth0

returns nothing. Why?


GG


On 28.12.2018 12:57, Dave Taht wrote:
I am of course, always interested in more folk dumping hfsc and
complicated designs, and trying sch_cake....

On Fri, Dec 28, 2018 at 3:54 AM Alan Goodman
<notifications@xxxxxxxxxxxxxxxxxxxxxxxx> wrote:
Perhaps you should post an example of your tc setup?

I had a bug a few months back where traffic in important queues would
seemingly randomly get 100% drop rate (as in your example below).  Upon
penning an email with the tc setup I realised that I had a leaf class on
the wrong branch and was trying to guarantee 99.9+% of traffic for that
leaf if it had significant traffic... Number 1:2 was swapped for number
1:1 and everything went back to normal.

Alan

On 27/12/2018 22:26, Grzegorz Gwóźdź wrote:
Are there any "hacks" in TC allowing to look in the guts?

It looks like it's changing state to "clogged" but

tc -s class ls dev eth0

looks completely normal (only grows number of sfq queues created
dynamically for every connection since more and more connections are
created but not closed)

In fact i've noticed something interesting during "clugged" state...

a few runs of:

tc -s class ls dev eth0

shows that filters sort packets well but packets that goes into
suitable classes are dropped:

class hfsc 1:1012 parent 1: leaf 1012: sc m1 6144Kbit d 10.0s m2
4096Kbit ul m1 6144Kbit d 10.0s m2 4096Kbit
  Sent 103306048 bytes 75008 pkt (dropped 12, overlimits 0 requeues 0)
  backlog 39Kb 127p requeues 0
  period 13718 work 103306048 bytes rtwork 103306048 bytes level 0

and after a while:

class hfsc 1:1012 parent 1: leaf 1012: sc m1 6144Kbit d 10.0s m2
4096Kbit ul m1 6144Kbit d 10.0s m2 4096Kbit
  Sent 103306048 bytes 75008 pkt (dropped 116, overlimits 0 requeues 0)
  backlog 39160b 127p requeues 0
  period 13718 work 103306048 bytes rtwork 103306048 bytes level 0

"Sent" stands still and all packets are "dropped"

Some classes passes packets but as time goes by more and more classes
stops passing and starts dropping.


GG







[Index of Archives]     [LARTC Home Page]     [Netfilter]     [Netfilter Development]     [Network Development]     [Bugtraq]     [GCC Help]     [Yosemite News]     [Linux Kernel]     [Fedora Users]
  Powered by Linux