OpenvSwitch 中使用 QoS 进行限速和整流

news/2025/1/24 22:51:00/

OVS自身并不实现QoS功能,QoS功能的实现是在linux内核中,OVS只是能够配置部分OVS支持的QoS类型。

如果需要一些OVS不支持的QoS类型,可以通过patch来支持这些配置,也可以通过传统的TC流量控制工具直接进行QoS的策略配置

文章目录

      • 单个队列限速
      • 底层原理
      • 删除 QoS 设置
      • 多队列限速
      • 参考

QoS在OVS中的使用和传统网络一样,主要分为如下两种:

  • Policing管制:用于控制接口上接收分组(ingress)的速率,是一种简单的QoS的功能,通过简单的丢包机制实现接口速率的限制,它既可以作用于物理接口,也可以作用于虚拟接口;
  • Shaping整形:是作用于接口上的出口流量(egress)策略,可以实现多个QoS队列,不同队列里面处理不同策略,一般用这种方式。

单个队列限速

建立一个简单的拓扑:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W4hl1kHI-1645692470547)(https://secure2.wostatic.cn/static/8QxXsAEDftuvCGQWjvqhrp/image.png)]

mininet> links
s1-eth1<->h1-eth0 (OK OK)
s1-eth2<->h2-eth0 (OK OK)

h1为数据发送端,h2为数据接收端,使用 iPerf 打UDP流:

h2 iperf -s -p 5566 -i 1 -u &
h1 iperf -c h2 -p 5566 -b 100m -t 10 -i 1 -u

可以看到带宽能达到设置的100M:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sL7SUHft-1645692470548)(https://secure2.wostatic.cn/static/j6r5CJn427q7if3aci3n93/image.png)]

接下来对出端口s1-eth2进行QoS设置。

其中 -- 用于把命令分割成单独解析的命令行,\ 用于换行。最大最小转发速率均为 1M,完整代码:

ovs-vsctl set port s1-eth2 qos=@newqos -- \
--id=@newqos create qos type=linux-htb queues=0=@q0 -- \
--id=@q0 create queue other-config:min-rate=1000000 other-config:max-rate=1000000

返回以下,上面一行是 qos 配置标识名qosID ,下面一行是 queue 标识名queueID 。

01043d15-d17d-4b27-bc45-52a0c9226adc
4a466860-c769-4cee-b2ff-ffd507924727

详细解释:

设置端口 s1-eth2 的 qos 规则名为 newqos

set port s1-eth2 qos=@newqos

创建 newqos 规则,类型为 linux-htb,连接key值为0的队列q0

id=@newqos create qos type=linux-htb queues=0=@q0

创建 q0 队列,设置最大最小转发速率均为 1M

id=@q0 create queue other-config:min-rate=1000000 other-config:max-rate=1000000

通过命令 ovs-vsctl list port s1-eth2 可以看到 s1-eth2 端口的 port 表中有 qos 配置:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-86ia9Lb2-1645692470548)(https://secure2.wostatic.cn/static/vgCz8fJSPSDKW7su9VDSKg/image.png)]

通过命令 ovs-vsctl list qos 查看 qos 配置表,其中有 queue 配置:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4vokMAF0-1645692470548)(https://secure2.wostatic.cn/static/sWD4uQvPJMGeZ9ZEwjz2BG/image.png)]

通过命令 ovs-vsctl list queue 查看 queue 配置表,可看到限制的速率:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Wns3Z7xI-1645692470549)(https://secure2.wostatic.cn/static/gc4zUNnpTmVwS57j5fMvSD/image.png)]

再通过上面同样的方法进行 iPerf 打流,可以看到速率被限制在 1M。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qBRy159L-1645692470549)(https://secure2.wostatic.cn/static/6wSG9dX67h39XdHyqSXevc/image.png)]

底层原理

前面提到过TC工具,其实qos底层也是使用的TC进行流量控制。
关于 TC 流量控制工具详解可看这篇博客

使用 tc -s -d qdisc show dev s1-eth2,发现使用的 htb 队列:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jZr5mRJ0-1648635967491)(https://secure2.wostatic.cn/static/6K13KAQ1b4McqTe9MZV76y/image.png)]
使用 tc -s -d class show dev s1-eth2,可以看到设置的类:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xcBjEhAj-1648635967493)(https://secure2.wostatic.cn/static/fNx7UHNFxb8txFU3dK4ft4/image.png)]
其中1:fffe 为ingress 入口队列的类。

删除 QoS 设置

若要取消某端口QoS设置,可以用下面的命令:

ovs-vsctl clear port s1-eth2 qos    //使端口s1-eth2的qos设置失效

使用 ovs-vsctl list port s1-eth2 查看端口s1-eth2的话,会发现端口qos项的qosID没有了。虽然端口 s1-eth2 已经不受这一条qos限制了,但是之前设置的qos和queue还存在系统中,可以用 ovs-vsctl list qosovs-vsctl list queue 命令查看。

若要删除这些qos和queue,需要以下命令

ovs-vsctl destroy qos qosID    //qosID 可通过前文list命令查看
ovs-vsctl destroy queue queueID    //queueID 可通过前文list命令查看
ovs-vsctl -- destroy qos s1-eth2 -- clear port s1-eth2 qos    //取消并删除qos一步达成,注意两条命令顺序不能换,不然先clear的话,轮到destroy去找s1-eth2的qos就找不见了

或者先取消所有端口绑定的qos后,直接全部删除:

ovs-vsctl -- --all destroy qos -- --all destroy queue

多队列限速

关闭拓扑重启后,之前创建的qos和queue仍然存在,只是没绑定到端口上,所以可以先运行ovs-vsctl -- --all destroy qos -- --all destroy queue 删除所有qos。

在以上拓扑交换机上多接一个主机h3,IP 为10.0.0.3/24。拓扑为:

mininet> links
s1-eth1<->h1-eth0 (OK OK)
s1-eth2<->h2-eth0 (OK OK)
s1-eth3<->h3-eth0 (OK OK)

对出端口s1-eth2进行QoS设置:

ovs-vsctl set port s1-eth2 qos=@newqos -- \
--id=@newqos create qos type=linux-htb other-config:max-rate=5000000 other-config:min-rate=5000000 queues=0=@q0,1=@q1 -- \
--id=@q0 create queue other-config:min-rate=1000000 other-config:max-rate=2000000 -- \
--id=@q1 create queue other-config:min-rate=4000000 other-config:max-rate=4000000

以上对 s1-eth2 被限速为5Mbits/s,对应设置了两个队列,队列0设置速率1 Mbits/s,队列1设置速率4 Mbits/s。返回qosID 和两个queueID:

2af78d23-3247-403c-bc8a-93d080d3cc51
ea3e24ad-c648-452c-a89d-95f4c01f47de
a20457f3-b2c4-4ada-b19f-865235cb3100

要使这些队列生效,还需要手动设置OVS流表,将数据包放入指定队列中。

以下命令将 s1-eth1 来的包放入q0,s1-eth3来的包放入q1:

ovs-ofctl -O OpenFlow13 add-flow s1 in_port="s1-eth1",actions=set_queue:0,output:"s1-eth2"
ovs-ofctl -O OpenFlow13 add-flow s1 in_port="s1-eth3",actions=set_queue:1,output:"s1-eth2"

使用命令 ovs-ofctl dump-flows -O OpenFlow13 s1 查看 s1 流表:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bTSga2py-1645692470549)(https://secure2.wostatic.cn/static/gBAv1fAMekYSqUgD3qt62a/image.png)]

使用 iPerf 在5566端口打UDP流测试q0:

h2 iperf -s -p 5566 -i 1 -u &
h1 iperf -c h2 -p 5566 -u -b 100m -t 5 -i 1

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fCdeSfLJ-1645692470550)(https://secure2.wostatic.cn/static/sfj8Lv3fctLLL8F4ozSpBn/image.png)]

在5567端口打TCP流测试q1:

h2 iperf -s -p 5567 -i 1 &
h3 iperf -c h2 -p 5567 -b 100m -t 5 -i 1

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-B1KcvoOf-1645692470550)(https://secure2.wostatic.cn/static/uVmp7JmEG2uvYnjDySjGJq/image.png)]

可以看到两个队列都限速成功。

设置OVS流表还可以通过目的端口、来源IP等来配置队列,具体可参考 OVS 流表操作:

ovs-ofctl -O OpenFlow13 add-flow s1 ip,udp,tp_dst=5566,actions=set_queue:0,output:"s1-eth2"
ovs-ofctl -O OpenFlow13 add-flow s1 ip,nw_src=10.0.0.3,actions=set_queue:1,output:"s1-eth2"

参考

Quality of Service (QoS)
Open vSwitch之QoS的实现
Open vSwitch 出口流量QoS实现


http://www.ppmy.cn/news/144876.html

相关文章

5547

题意就是做一个4*4的数独&#xff0c;之前做过9*9的&#xff0c;没什么取巧的&#xff0c;也就是用深搜 比较不一样的是&#xff0c;这道题在有多组解得时候要把解都输出&#xff0c;要用到回溯法 时间还是有点长的&#xff0c;勉强过了吧 #include #include #include #inclu…

RDM6300 125KHz ID卡读卡器

RDM6300 RDM6300是一个针对125KHz ID卡的读卡模块, 用于读取EM4100兼容ID卡信息, 由一片C8051F330和一片LM358D双运放组成 注: EM4100, 4200卡是只读的, 复制卡, 是把T5577/5557/5567/EM4305卡设置成EM4100格式的ID卡 Pin definition 第一组 5 pin, 方脚(靠外)是PIN1 串口波特率…

TCL软件测试笔试题-精品

最近去了TCL国际e城面试。 面试题分为五个部分。分别是软件测试理论、一篇关于TV开关机测试的英语阅读等&#xff0c;最后是python编程题。 五、编程试题&#xff08;Python&#xff09; 1、请给出以下代码的输出结果&#xff1a; print("this is"3) print(&quo…

5656

FMPP的简单教程http://pipe.iteye.com/blog/185276 freemarker要熟悉一下list以及map的遍历http://echowhere.blog.sohu.com/40872593.html

go pprof 及 trace 完整操作指南 GC或性能分析 (windows平台linux平台皆可)

pprof 和 trace 这东西可以分析GC具体的瓶颈位置&#xff01;&#xff01;以及每一个线程具体什么时候运行的&#xff01;&#xff01;反正各种好处&#xff01; 之前网上 大家各种抄袭&#xff0c;复制&#xff0c;我相信没有几个人真正玩过这玩意儿&#xff0c;因为项目需要…

netstat命令详解

引言 netsta命令是一个监控TCP/IP网络非常有用的工具,它可以侠士路由表&#xff0c;实际网络连接以及每一个网络接口设备的状态信息。 语法选项 netstat [选项] -a或--all&#xff1a;显示所有连线中的Socket&#xff1b; -A<网络类型>或--<网络类型>&#xf…

2021-10-28 工作记录--fastAdmin-一张图细化FastAdmin中的表格列表的部分功能

fastAdmin 可参考的优秀文章&#xff08;去fastAdmin问答社区上也可以看到&#xff09;【堪称yyds】&#xff1a; 1、https://ask.fastadmin.net/article/5567.html 2、https://ask.fastadmin.net/article/323.html 下面内容在上面两篇文章中均有所描述&#xff0c;但不是直接…

数据脱敏,你会了吗(二)

数据脱敏 – 正则表达式 上节的内容我们说到了使用工具类对要出输出的数据进行掩码处理以达到保护数据的目的&#xff0c;上面的方法在一些简单场景都好使用&#xff0c;但是遇到类似最后提出的json字符串处理起来就 力有不逮 了。这时就需要用到一种新的字符串处理技术 – 没…