不仅Docker会使用Control Group,KVM也会使用Cgroup来控制资源分配 (2)

勿忘初心2018-11-08 14:22

此文已由作者刘超授权网易云社区发布。

欢迎访问网易云社区,了解更多网易技术产品运营经验


四、对网络I/O的控制


对于virsh命令,当前net_cls还不支持

可以通过TC直接控制网卡的流量

TC有两种类型控制网络I/O.


第一种类型为:Classless Queuing Disciplines,也即不分类


默认为pfifo_fast


pfifo是基于ToS和priomap分到不同的队列中



网络包里面有TOS,总共四位


代表5种类型


这是priomap,设置了不同的ToS去哪个队列


还有一种队列名叫SFQ, Stochastic Fair Queuing随机公平队列

会有很多的FIFO的队列,TCP Session或者UDP stream会被分配到某个队列。

包会RoundRobin的从各个队列中取出发送。

这样不会一个Session占据所有的流量。

但不是每一个Session都有一个队列,而是有一个Hash算法,将大量的Session分配到有限的队列中。

这样两个Session会共享一个队列,也有可能互相影响。

Hash函数会经常改变,从而session不会总是相互影响。



还有一种队列名叫TBF, Token Bucket Filter

它有两个概念Tokens and buckets

所有的包排成队列进行发送,但不是到了队头就能发送,而是需要拿到Token才能发送

Token根据设定的速度rate生成,所以即便队列很长,也是按照rate进行发送的

当没有包在队列中的时候,Token还是以既定的速度生成,但是不是无限累积的,而是放满了buckets为止,篮子的大小常用burst/buffer/maxburst来设定

Buckets会避免下面的情况:当长时间没有包发送的时候,积累了大量的Token,突然来了大量的包,每个都能得到Token,造成瞬间流量大增



第二种类型:Classful Queuing Disciplines,是分类的


常见的为HTB, Hierarchical Token Bucket,有以下的概念

  • Shaping:仅仅发生在叶子节点,依赖于其他的Queue

  • Borrowing: 当网络资源空闲的时候,借点过来为我所用

  • Rate:设定的发送速度

  • Ceil:最大的速度,和rate之间的差是最多能向别人借多少



type  of class

class  state

HTB  internal state

action  taken

leaf

< rate

HTB_CAN_SEND

Leaf  class will dequeue queued bytes up to available tokens (no more than burst  packets)

leaf

> rate,  < ceil

HTB_MAY_BORROW

Leaf  class will attempt to borrow tokens/ctokens from parent class. If tokens are  available, they will be lent in quantum increments and the leaf  class will dequeue up to cburst bytes

leaf

> ceil

HTB_CANT_SEND

No  packets will be dequeued. This will cause packet delay and will increase  latency to meet the desired rate.

inner,  root

< rate

HTB_CAN_SEND

Inner  class will lend tokens to children.

inner,  root

> rate,  < ceil

HTB_MAY_BORROW

Inner  class will attempt to borrow tokens/ctokens from parent class, lending them to  competing children in quantum increments per request.

inner,  root

> ceil

HTB_CANT_SEND

Inner  class will not attempt to borrow from its parent and will not lend tokens/ctokens  to children classes.


例如创建一个如下的htb树




创建一个HTB的qdisc在eth0上,句柄为1:,default 12表示默认发送给1:12

tc qdisc add dev eth0 root handle 1: htb default 12

创建一个root class,然后创建几个子class

同一个root class下的子类可以相互借流量,如果直接不在qdisc下面创建一个root class,而是直接创建三个class,他们之间是不能相互借流量的。

tc class add dev eth0 parent 1: classid 1:1 htb rate 100kbps ceil 100kbps

tc class add dev eth0 parent 1:1 classid 1:10 htb rate 30kbps ceil 100kbps

tc class add dev eth0 parent 1:1 classid 1:11 htb rate 10kbps ceil 100kbps

tc class add dev eth0 parent 1:1 classid 1:12 htb rate 60kbps ceil 100kbps


创建叶子qdisc,分别为fifo和sfq

tc qdisc add dev eth0 parent 1:10 handle 20: pfifo limit 5

tc qdisc add dev eth0 parent 1:11 handle 30: pfifo limit 5

tc qdisc add dev eth0 parent 1:12 handle 40: sfq perturb 10


设定规则:从1.2.3.4来的,发送给port 80的包,从1:10走;其他从1.2.3.4发送来的包从1:11走;其他的走默认

tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip src 1.2.3.4 match ip dport 80 0xffff flowid 1:10

tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip src 1.2.3.4 flowid 1:11


当同时发大量的包的时候会出现下面的图形





时间0的时候,0,1,2都以90k的速度发送数据,在时间3的时候,将0的发送停止,红色的线归零,剩余的流量按照比例分给了蓝色的和绿色的线。


在时间6的时候,将0的发送重启为90k,则蓝色和绿色的流量返还给红色的流量。

在时间9的时候,将1的发送停止,绿色的流量为零,剩余的流量按照比例分给了蓝色和红色。

在时间12,将1的发送恢复,红色和蓝色返还流量。

在时间15,将2的发送停止,蓝色流量为零,剩余的流量按照比例分给红色和绿色。

在时间19,将1的发送停止,绿色的流量为零,所有的流量都归了红色。

对于如下的图谱图,创建如下的规则



tc qdisc add dev tap3 root handle 1: htb
tc class add dev tap3 parent 1: classid 1:1 htb rate 100kbps ceil 100kbps
tc class add dev tap3 parent 1:1 classid 1:10 htb rate 20kbps ceil 100kbps
tc class add dev tap3 parent 1:1 classid 1:11 htb rate 80kbps ceil 100kbps
tc qdisc add dev tap3 parent 1:10 handle 20: pfifo limit 5
tc qdisc add dev tap3 parent 1:11 handle 30: pfifo limit 5
tc filter add dev tap3 protocol ip parent 1:0 prio 1 u32 match ip src 192.168.57.100 flowid 1:10
tc filter add dev tap3 protocol ip parent 1:0 prio 1 u32 match ip src 192.168.57.101 flowid 1:11



相关阅读:不仅Docker会使用Control Group,KVM也会使用Cgroup来控制资源分配 (1)

不仅Docker会使用Control Group,KVM也会使用Cgroup来控制资源分配 (2)

不仅Docker会使用Control Group,KVM也会使用Cgroup来控制资源分配 (3)


11.1—11.15云计算基础服务全场5折起

免费体验云安全(易盾)内容安全、验证码等服务

更多网易技术、产品、运营经验分享请点击