Traffic Control
TC 框架可以理解为一个控发不控收的框架,在 ingress 的位置只能做简单的控制,且不能有其他子项。如想对 ingress 进行控制请参考 IMQ 以及 ifb。
处理这几种方式的方法有三种 qdiscs、classes、filters。
Queueing Discipline,内核如果需要通过某个网络接口发送数据包,它都需要按照为这个接口配置的 qdisc (排队规则)把数据包加入队列。内核会尽可能多地从qdisc里面取出数据包,把它们交给网络适配器驱动模块。
某些QDisc(排队规则)可以包含一些类别,不同的类别中可以包含更深入的QDisc(排队规则),通过这些细分的QDisc还可以为进入的队列的数据包排队。通过设置各种类别数据包的离队次序,QDisc可以为设置网络数据流量的优先级。
Filters 用来为 classful qdiscs 去判定如何进行分类排序。当数据包进入一个包含子类的类别中的时候就需要分类,filters 就是其中一种分类的方式。再一个有一个具体的结果被分类器挑选出来之前,所有的 filters 将被尝试的去调用。如果最终也没有返回结果,那么可能需要除了 filters 之外其他的分类方式。Filters 是 qdiscs 内部的方法,不能作为一个主体自己单独使用。
choke :CHOKe (CHOose and Keep for responsive flow, CHOose and Kill for responsive flows)
[p|b]fifo : 最简单的先入先出队列,限制入口流量。
fq :Fair Queueing 公平调度算法。
red : red是Random Early Detection(随机早期探测)的简写。如果使用这种QDISC,当带宽的占用接近于规定的带宽时,系统会随机地丢弃一些数据包。它非常适合高带宽应用。
sfq : sfq是Stochastic Fairness Queueing的简写。它按照会话(session–对应于每个TCP连接或者UDP流)为流量进行排序,然后循环发送每个会话的数据包。
tbf : tbf是Token Bucket Filter的简写,适合于把流速降低到某个值。
pfifo_fast : 在编译内核时,如果打开了高级路由器(Advanced Router)编译选项,pfifo_fast就是系统的标准QDISC。它的队列包括三个波段(band)。在每个波段里面,使用先进先出规则。而三个波段(band)的优先级也不相同,band 0的优先级最高,band 2的最低。如果band0里面有数据包,系统就不会处理band 1里面的数据包,band 1和band 2之间也是一样。数据包是按照服务类型(Type of Service,TOS)被分配多三个波段(band)里面的。
还有一大堆可以使用的方式可以使用,可以参看一下 man page。
还有一大堆可以使用的方式可以使用,可以参看一下 man page,里面有各个方式的详细说明以及算法原理。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5IhLj5k1-1624007281392)(E:\KEDA工作\图片\TC-struct.png)]
整个 TC 是一个树型的结构,每一个 qdisc 可以有很多不同的 class 但是注意每一个 class 只能有一个 qdisc。这样就是以针对已经被分类的数据流量进行进一步的分类。
Userspace programs
^
|
+---------------+-----------------------------------------+
| Y |
| -------> IP Stack |
| | | |
| | Y |
| | Y |
| ^ | |
| | / ----------> Forwarding -> |
| ^ / | |
| |/ Y |
| | | |
| ^ Y /-qdisc1-\ |
| | Egress /--qdisc2--\ |
--->->Ingress Classifier ---qdisc3---- | ->
| Qdisc \__qdisc4__/ |
| \-qdiscN_/ |
| |
+----------------------------------------------------------+
tc qdisc add dev eth0 root handle 1:0 cbq2 bandwidth Kbit avpkt 1 cell 8
使用 CBQ 方法管理队列
bandwidth: 实际带宽
avpkt : 包平均大小
cell : 计算传输时间的细粒度(granularity)
tc class add dev eth0 parent 1:0 classid 1:1 cbq2 bandwidth Kbit rate Kibit weight Kbit allot 1514 cell 8 maxburst 20 minburst 10 avpkt 1 bounded"
rate : 实际带宽
weight : “weight”参数控制WRR过程。每个类都轮流取得发包的机会。如果其中一个类要求的带宽显著地高于其他的类,就应该让它每次比其他的类发送更多 的数据(以字节为单位,可以理解为偏袒数量,例如weight 200Kbit就相当于每次处理优先级的数据比普通数据多处理200Kbit)。CBQ会把一个类下 面所有的weight值加起来后归一化,所以数值可以任意定,只要保持比例合适就可以。人们常把“速率/10”作为参数的值来使用,实际工作得很好。归 一化值后的值乘以“allot”参数后,决定了每次传输多少数据。
allot :最大报文长度(带 MAC 头部)
关于tc作用在入口(ingress)和出口(egress)效果的调研
Linux Advanced Routing & Traffic Control HOWTO
Linux TC的ifb原理以及ingress流控-转
Linux TC 带宽管理队列规则
tc命令详解及限速功能