Qemu/KVM虚拟机网卡TC双向限速
更新:HHH   时间:2023-1-7


本文档由成都征天科技有限公司天极云团队原创出品,转载请注明出处,征天科技致力于为企业和个人提供专业的云计算IaaS和PaaS层产品和服务,官网地址:www.tjiyun.com 欢迎访问。
本文档主要介绍Qemu/KVM虚拟机使用TC做网卡流量双向限速的原理和操作。

一.TC限速相关介绍

1.TC限速原理介绍
Linux操作系统中的流量控制器TC(Traffic Control)用于Linux内核的流量控制,主要是通过在输出端口处建立一个队列来实现流量控制。
接收包从输入接口进来后,经过流量限制丢弃不符合规定的数据包,由输入多路分配器进行判断选择,如果接收包的目的主机是本主机,那么将该包送给上层处理,否则需要进行转发,将接收包交到转发块(Forwarding Block)处理。转发块同时也接收本主机上层(TCP、UDP等)产生的包,通过查看路由表,决定所处理包的下一跳。然后,对包进行排列以便将它们送到输出接口。
从以上介绍可以看出,TC只能对网卡发出的数据包做分类限制,不能对网卡接收的数据包做分类限制,但是可以对网卡接收的数据包流量做一个整体限制。因为我们项目中只需要对网卡接收的流量做整体限制,所以TC刚好可以满足我们对网卡流量双向限制的要求。

2.TC限速基本概念介绍
TC对流量的处理由三种对象控制,它们是:
队列规则 qdisc(queueing discipline)
类(class)
分类器(Classifiers).

qdisc队列规则(queueing discipline)
qdisc(队列规则)是queueing discipline的简写,它是理解流量控制(traffic control)的基础。无论何时,内核如果需要通过某个网络接口发送数据包,它都需要按照为这个接口配置的qdisc把数据包加入队列。然后,内核会尽可能多地从qdisc里面取出数据包,把它们交给网络适配器驱动模块。最简单的qdisc是pfifo,它不对进入的数据包做任何的处理,数据包采用先入先出的方式通过队列。不过,它会保存网络接口一时无法处理的数据包。
可分类的qdisc包括:
(1)CBQ
CBQ是Class Based Queueing(基于类别排队)的缩写。它实现了一个丰富的连接共享类别结构,既有限制(shaping)带宽的能力,也具有带宽优先级管理的能力。带宽限制是通过计算连接的空闲时间完成的。空闲时间的计算标准是数据包离队事件的频率和下层连接(数据链路层)的带宽。
(2)HTB
HTB是Hierarchy Token Bucket的缩写。通过在实践基础上的改进,它实现了一个丰富的连接共享类别体系。使用HTB可以很容易地保证每个类别的带宽,虽然它也允许特定的类可以突破带宽上限,占用别的类的带宽。HTB可以通过TBF(Token Bucket Filter)实现带宽限制,也能够划分类别的优先级。
(3)PRIO
PRIO qdisc不能限制带宽,因为属于不同类别的数据包是顺序离队的。使用PRIO qdisc可以很容易对流量进行优先级管理,只有属于高优先级类别的数据包全部发送完毕,才会发送属于低优先级类别的数据包。为了方便管理,需要使用iptables或者ipchains处理数据包的服务类型(Type Of Service,ToS)。

Class 类
某些qdisc可以包含一些类别,不同的类别中可以包含更深入的qdisc,通过这些细分的qdisc还可以为进入队列的数据包排队。通过设置各种类别数据包的离队次序,qdisc可以设置网络数据流量的优先级。

Filter 规则
Filter(过滤器)用于为数据包分类,决定它们按照何种qdisc进入队列。无论何时数据包进入一个划分子类的类别中,都需要进行分类。分类的方法可以有多种,使用fileter(过滤器)就是其中之一。使用filter(过滤器)分类时,内核会调用附属于这个类(class)的所有过滤器,直到返回一个判决。如果没有判决返回,就作进一步的处理,而处理方式和qdisc有关。需要注意的是,filter(过滤器)是在qdisc内部,它们不能作为主体。

二.TC限速操作

1.虚拟机流入流量限制
(1)清除tap01网卡设备上所有的流入规则,防止与新添加的规则冲突。
# tc qdisc del dev tap01 root
(2)在网络设备tap01上绑定一个htb类型的qdisc根队列
# tc qdisc add dev tap01 root handle 1: htb default 9999
(3)在qdisc根队列1:下创建一个子类1:5,并设置子类的流量速率为50Mb/s
# tc class add dev tap01 parent 1: classid 1:5 htb rate 50Mbit burst 1Mbit
(4)为子类1:5添加随机公平队列sfq,防止该类被某一会话连接独占
# tc qdisc add dev tap01 parent 1:5 handle 5: sfq perturb 10
(5)为子类1:5添加过滤器,用来将目标地址为0.0.0.0/0(指所有网络)的数据包发往类1:5,使用其中的规则出队
# tc filter add dev tap01 parent 1: protocol ip prio 1 u32 match ip dst 0.0.0.0/0 flowid 1:5
注: tap01为虚拟机连接到网桥的网卡,与虚拟机内部的网卡一一对应。因tap01口的出方向的流量就是进入虚拟机内部网卡的流量,所以限制tap01口的出方向的流量,就可以限制流入虚拟机的网络流量。

2.虚拟机流出流量限制
(1)清除tap01网卡设备上所有的流入规则,防止与新添加的规则冲突。
# tc qdisc del dev tap01 ingress
(2)在网络设备tap01上绑定一个处理ingress流量的qdisc根队列
# tc qdisc add dev tap01 ingress handle ffff:
(3)为类ffff:添加过滤器,并限制流量为50Mb/s
# tc filter add dev tap01 parent ffff: protocol all prio 1 basic police rate 50Mbit burst 10Mbit mtu 65535 drop
注: tap01为虚拟机连接到网桥的网卡,与虚拟机内部的网卡一一对应。因tap01口的入方向的流量就是虚拟机内部网卡发出的流量,所以限制tap01口的入方向的流量,即可限制流出虚拟机的网络流量。
命令中的数字10和65535存在关联性,需要一起修改,否则会导致限速不准确。

如您有任何问题,欢迎与我们交流,微信号 ztkj_tjiyun

返回云计算教程...