摘要:Linux从kernel 开始支持QOS不过需要重新编译内核运行make config时将EXPERIMENTAL_OPTIONS设置成y并且将Class Based Queueing (CBQ) Token Bucket Flow Traffic Shapers 设置为 y 运行 make dep; make clean; make bzilo生成新的内核
Linux从kernel 开始支持QOS不过需要重新编译内核运行make config时将EXPERIMENTAL_OPTIONS设置成y并且将Class Based Queueing (CBQ) Token Bucket Flow Traffic Shapers 设置为 y 运行 make dep; make clean; make bzilo生成新的内核
在Linux操作系统中流量控制器(TC)主要是在输出端口处建立一个队列进行流量控制控制的方式是基于路由亦即基于目的IP地址或目的子网的网络号的流量控制流量控制器TC其基本的功能模块为队列分类和过滤器Linux内核中支持的队列有Class Based Queue Token Bucket Flow CSZ First In First Out Priority TEQL SFQ ATM RED这里我们讨论的队列与分类都是基于CBQ(Class Based Queue)的而过滤器是基于路由(Route)的
配置和使用流量控制器TC主要分以下几个方面分别为建立队列建立分类建立过滤器和建立路由另外还需要对现有的队列分类过滤器和路由进行监视
其基本使用步骤为
) 针对网络物理设备(如以太网卡eth)绑定一个CBQ队列
) 在该队列上建立分类
) 为每一分类建立一个基于路由的过滤器
) 最后与过滤器相配合建立特定的路由表
先假设一个简单的环境
流量控制器上的以太网卡(eth) 的IP地址为在其上建立一个CBQ队列假设包的平均大小为字节包间隔发送单元的大小为字节可接收沖突的发送最长包数目为字节
假如有三种类型的流量需要控制:
) 是发往主机的其IP地址为其流量带宽控制在Mbit优先级为
) 是发往主机的其IP地址为其流量带宽控制在Mbit优先级为
) 是发往子网的其子网号为子网掩码为流量带宽控制在Mbit优先级为
建立队列
一般情况下针对一个网卡只需建立一个队列
将一个cbq队列绑定到网络物理设备eth上其编号为:网络物理设备eth的实际带宽为 Mbit包的平均大小为字节包间隔发送单元的大小为字节最小传输包大小为字节
·tc qdisc add dev eth root handle : cbq bandwidth Mbit avpkt cell mpu
建立分类
分类建立在队列之上一般情况下针对一个队列需建立一个根分类然后再在其上建立子分类对于分类按其分类的编号顺序起作用编号小的优先一旦符合某个分类匹配规则通过该分类发送数据包则其后的分类不再起作用
) 创建根分类:分配带宽为Mbit优先级别为
·tc class add dev eth parent : classid : cbq bandwidth Mbit rate Mbit maxburst allot prio avpkt cell weight Mbit
该队列的最大可用带宽为Mbit实际分配的带宽为Mbit可接收沖突的发送最长包数目为字节最大传输单元加MAC头的大小为字节优先级别为包的平均大小为字节包间隔发送单元的大小为字节相应于实际带宽的加权速率为Mbit
)创建分类:其父分类为:分配带宽为Mbit优先级别为
·tc class add dev eth parent : classid : cbq bandwidth Mbit rate Mbit maxburst allot prio avpkt cell weight Kbit split : bounded
该队列的最大可用带宽为Mbit实际分配的带宽为 Mbit可接收沖突的发送最长包数目为字节最大传输单元加MAC头的大小为字节优先级别为包的平均大小为字节包间隔发送单元的大小为字节相应于实际带宽的加权速率为Kbit分类的分离点为:且不可借用未使用带宽
)创建分类:其父分类为:分配带宽为Mbit优先级别为
·tc class add dev eth parent : classid : cbq bandwidth Mbit rate Mbit maxburst allot prio avpkt cell weight Kbit split :
该队列的最大可用带宽为Mbit实际分配的带宽为 Mbit可接收沖突的发送最长包数目为字节最大传输单元加MAC头的大小为字节优先级别为包的平均大小为字节包间隔发送单元的大小为字节相应于实际带宽的加权速率为Kbit分类的分离点为:
)创建分类:其父分类为:分配带宽为Mbit优先级别为
·tc class add dev eth parent : classid : cbq bandwidth Mbit rate Mbit maxburst allot prio avpkt cell weight Kbit split :
该队列的最大可用带宽为Mbit实际分配的带宽为 Kbit可接收沖突的发送最长包数目为字节最大传输单元加MAC头的大小为字节优先级别为包的平均大小为字节包间隔发送单元的大小为字节相应于实际带宽的加权速率为Kbit分类的分离点为:
建立过滤器
过滤器主要服务于分类一般只需针对根分类提供一个过滤器然后为每个子分类提供路由映射
) 应用路由分类器到cbq队列的根父分类编号为:过滤协议为ip优先级别为过滤器为基于路由表
·tc filter add dev eth parent : protocol ip prio route
) 建立路由映射分类: : :
·tc filter add dev eth parent : protocol ip prio route to flowid :
·tc filter add dev eth parent : protocol ip prio route to flowid :
·tc filter add dev eth parent : protocol ip prio route to flowid :
建立路由
该路由是与前面所建立的路由映射一一对应
) 发往主机的数据包通过分类转发(分类的速率Mbit)
·ip route add dev eth via realm
) 发往主机的数据包通过分类转发(分类的速率Mbit)
·ip route add dev eth via realm
)发往子网/的数据包通过分类转发(分类的速率Mbit)
·ip route add / dev eth via realm
注一般对于流量控制器所直接连接的网段建议使用IP主机地址流量控制限制不要使用子网流量控制限制如一定需要对直连子网使用子网流量控制限制则在建立该子网的路由映射前需将原先由系统建立的路由删除才可完成相应步骤
监视
主要包括对现有队列分类过滤器和路由的状况进行监视
)显示队列的状况
简单显示指定设备(这里为eth)的队列状况
·tc qdisc ls dev eth
qdisc cbq : rate Mbit (boundedisolated) prio notransmit
详细显示指定设备(这里为eth)的队列状况
·tc s qdisc ls dev eth
qdisc cbq : rate Mbit (boundedisolated) prio notransmit
Sent bytes pkts (dropped overlimits )
borrowed overactions avgidle undertime
这里主要显示了通过该队列发送了个数据包数据流量为个字节丢弃的包数目为超过速率限制的包数目为
)显示分类的状况
简单显示指定设备(这里为eth)的分类状况
·tc class ls dev eth
class cbq : root rate Mbit (boundedisolated) prio notransmit
class cbq : parent : rate Mbit prio notransmit #notransmit表示优先级为
class cbq : parent : rate Mbit prio
class cbq : parent : rate Mbit prio
class cbq : parent : rate Mbit prio
详细显示指定设备(这里为eth)的分类状况
·tc s class ls dev eth
class cbq : root rate Mbit (boundedisolated) prio notransmit
Sent bytes pkts (dropped overlimits )
borrowed overactions avgidle undertime
class cbq : parent : rate Mbit prio notransmit
Sent bytes pkts (dropped overlimits )
borrowed overactions avgidle undertime
class cbq : parent : rate Mbit prio
Sent bytes pkts (dropped overlimits )