网络:云中的网络Qos

引入

在小区里面,是不是经常有住户不自觉就霸占公共通道,如果你找他理论,他的话就像一个相声《楼道曲》说的一样:“公用公用,你用我用,大家都用,我为什么不能用?”。

除此之外,你租房子的时候,有没有碰到这样的情况:本来合租共享 WIFI,一个人狂下小电影,从而你网都上不去,是不是很懊恼?

在云平台上,也有这种现象,好在有一种流量控制技术,可以实现Qos(Quality of Service),从而保障大多数用户的服务质量

对于控制一台机器的网络Qos,分两个方向,一个入,一个出
在这里插入图片描述

其实我们能控制的只有出方向,通过Shaping,将出的流量控制成自己想要的模样。而进入的方向是无法控制的,只能通过Policy将包丢弃

控制网络的Qos有哪些方式?

在Linux下,可以通过TC控制网络的QoS,主要就是通过队列的方式

无类别排队规则(classless Queuing Disciplines)

pfifo_fast

在ip addr时,有一个pfifo_fast,这是一种把网络包分类的技术。
在这里插入图片描述

  • pfifo_fast分为三个先入先出队列,称为三个Band。根据网络包里面TOS,看这个包到底应该进入哪个队列。TOS总共四位,每一位表示的意思不同,总共16种类型。

  • 通过命令行tc qdisc show dev eth0,可以输出结果promap,也是16个数字。在0到2之间,和TOS的16种类型对应起来,表示不同的TOS对应的不同的队列。其中Band 0 优先级最高,发送完毕之后才轮到Band 1 发送,最后才是Band 2。

随机公平队列

在这里插入图片描述

  • 会建立很多的FIFO的队列,TCP Session会计算hash值,通过hash值分配到某个队列。在队列的另一端,网络包会通过轮询策略从各个队列中取出发送。这样不会有一个session占据所有的流量
  • 当然如果两个session的hash是一样的,会共享一个队列,也有可能相互影响。hash函数会经常改变,从而session不会总是相互影响

令牌桶规则(TBF、Token Bucket Filter)

在这里插入图片描述

  • 所有的网络包排成队列进行发送,但不是到了队头就能发送,而是需要拿到令牌之后才能发送
  • 令牌根据设定的速度生成,所以即使队列很长,也是按照一定的规则进行发送的
  • 当没有包在队列中的时候,令牌还是以既定的速度生成,但不是无限累积的,而是放满了桶位置。设置桶的大小是为了避免下面的情况:当长时间没有网络包发送的时候,积累了大量的令牌,突然来了大量的网络包,每个都能得到令牌,造成瞬间流量大增

基于类别的队列规则(classful queuing disciplines)

分层令牌桶规则(HTB,Hierarchical Token Bucket)

HTB往往是一颗树,下面看一个具体的例子,通过TC如何构建一颗HTB树

在这里插入图片描述
使用TC可以为某个网卡eth0创建一个HTB的队列规则,需要付给它一个句柄为(1:)

这是整棵树的根节点,接下来会有分支,比如上图有三个分支,句柄分别为(:10),(:11)、(:12)。最后的参数为default 12,表示默认发给第三个分支(1:12)

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

对于这个网卡,需要规定发送的速度。一般有两个速度可以配置,一个是rate,表示一般情况下的速度;一个是ceil,表示最高情况下的速度。对于根节点来讲,这两个速度是一样的,于是创建一个root class,速度为(rate=100bps,ceil=100kbps)。

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

接下来要创建分支,也即创建几个子 class。每个子 class 统一有两个速度。三个分支分别为(rate=30kbps,ceil=100kbps)、(rate=10kbps,ceil=100kbps)、(rate=60kbps,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

你会发现三个 rate 加起来,是整个网卡允许的最大速度

HTB有个很好的特性,同一个root class下的子类可以相互借流量,如果不直接在队列规则下创建一个root class,而是直接创建三个class,它们之间是不能相互借流量的。借流量的策略,可以使得当前不使用这个分支的流量的时候,可以借给另一个分支,从而不浪费带宽,使带宽发挥最大的作用。

最后,创建叶子队列规则,分别为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

基于这个队列规则,我们还可以通过 TC 设定发送规则:从 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

在云中网络 Openvswitch 中,主要使用的是分层令牌桶规则(HTB),将总的带宽在一棵树上按照配置的比例进行分配,并且在一个分支不用的时候,可以借给另外的分支,从而增强带宽利用率。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值