• Linux下的网络输入输出流量的带宽控制(2015-11-23更新)


    Linux下的网络输入输出流量的带宽控制

    整理者:赤子玄心

    QQ:280604597

    Email:280604597@qq.com

    大家有什么不明白的地方,或者想要详细了解的地方可以联系我,我会认真回复的

    1   概念

    Linux中可以对不同网卡的网络输入输出的数据包做复杂的带宽控制,可以做到针对输入或输出的数据包的不同的源发地址、不同的源发端口、不同的目的地址、不同的目的端口做不同的带宽控制。

    Linux中的QoS分为入口(Ingress)部分和出口(Egress)部分,入口部分主要用于进行输入流量的带宽控制,出口部分主要用于进行输出流量的带宽控制。

    Linux是通过队列对网络流量进行带宽控制,大多数队列(qdisc)都是用于输出流量的带宽控制,例如HTB队列等,而输入流量只有一个队列,即Ingress队列。HTB队列的可以设置复杂的队列规则,从而灵活的控制输出流量的带宽,而ingress队列的功能很简单,不可指定复杂的队列规则,但可以重定向数据包incoming packets。如果要对输入流量做复杂的带宽控制,可以通过Ingress队列把输入流量重定向到虚拟设备ifb,然后对虚拟设备ifb的输出流量配置HTB队列,就能达到对输入流量设置复杂的队列规则。

    Linux的每个网络设备上,默认都会有一个输出队列,默认没有输入队列。添加新的输出队列会覆盖默认的输出队列。

    当队列的带宽被占满时,操作系统就会延迟发送数据包,再不行就丢包。

     

     

    2   HTB队列

    2.1 模型

     

    2.2 简介

    队列等级划分:一个HTB队列有且只有一个根分类,一个根分类下可以有零至多个主分类,一个主分类下可以有零至多个子分类,一个子分类下还可以有零至多个子分类,……

    所有分类的流量统计是在这个分类的入口做的。

    所有分类的流量带宽控制是在这个分类的通道里做的。

    只有根分类入口上能添加过滤器,其他队列入口只做分流,即使添加过滤器也不会触发。

    过滤器只能把数据包扔给最底层的队列,如果该队列有子分类,则数据包不能扔给这个队列,因为有子分类的主分类或子分类是没有队列通道的。注意:如果一定要扔给父队列,这个过滤器能添加成功,且过滤器还能匹配成功,但是数据包就是不走这个队列。

    经过测试,发现子分类的带宽不受父分类的带宽控制。

    网络设备名:网络设备的名字,一般叫ethX,用ifconfig或ip link命令查看。

    虚拟网络设备名:虚拟网络设备的名字,一般叫ifbX,用ifconfig或ip link命令查看。

    优先级:优先处理的等级,为整数,数值越低优先级越高。经过测试,发现htb队列的优先级高低没有对数据包产生影响。

    队列的优先级由高到低为0、1、2、3、4、5、6、7,最高为0,最低为7。如果过滤器的优先级为0,会导致无法删除此过滤器。

    3   输出流量控制

    注意:tc命令都是实时生效的。

    3.1 查看根分类

    Shell命令:tc  [-s]  qdisc  show  dev  网络设备名

    注意:-s选项表示显示网络流量信息。

    例如:tc  qdisc  show  dev  eth0

    解释:查看eth0设备的队列信息。

    例如:tc  -s  qdisc  show  dev  eth1

    解释:查看eth1设备的队列信息,并显示队列的网络流量信息。

    3.2 添加根分类

    Shell命令:tc  qdisc  add  dev  网络设备名  root  [handle  根分类句柄]  htb  [default  默认分类句柄]

    注意:如果指定了默认分类句柄,当数据包在不被任何过滤器匹配成功时候,就走默认分类。如果指定的默认分类不存在或不指定,数据包就走根分类。

    注意:如果要指定根分类句柄,那么其范围必须是大于等于1、小于等于ffff的十六进制数值。如果是其他数值或不指定,则会出现随机的句柄。

    例如:tc  qdisc  add  dev  eth0  root  htb

    解释:在eth0设备上添加HTB队列的根分类,队列句柄为随机,默认分类为根分类。

    例如:tc  qdisc  add  dev  eth0  root  handle  1:  htb

    解释:在eth0设备上添加HTB队列的根分类,队列句柄为1:,默认分类为根分类。

    例如:tc  qdisc  add  dev  eth1  root  handle  2:  htb  default 2:1

    解释:在eth1设备上添加HTB队列的根分类,队列句柄为2:,默认分类句柄为2:1的分类。

    3.3 删除根分类

    Shell命令:tc  qdisc  del  dev  网络设备名  root

    3.4 查看主分类或子分类

    Shell命令:tc  [-s]  class  show  dev  网络设备名

    注意:-s选项表示显示网络流量信息。

    3.5 添加主分类或子分类

    Shell命令:tc  class  add  dev  网络设备名  [parent  父分类句柄]  classid  该分类句柄  htb  rate  保留带宽{MBps|KBps|Bps|Mbit|Kbit|bit}  [ceil  共享带宽{MBps|KBps|Bps|Mbit|Kbit|bit}]  [prio  优先级]

    注意:如果指定的父队列句柄不存在或不指定时,则父分类就是根分类。

    注意:如果不指定共享带宽,则共享带宽和保留带宽一样。

    注意:如果指定的优先级为负数,则会导致命令执行失败。如果指定的优先级大于等于8,则优先级实际会设置成7。如果不指定优先级,则优先级实际会设置成0。

    bit表示位每秒传输

    Bps表示字节每秒传输

    KBps表示千字节每秒传输

    MBps表示兆字节每秒传输

    1MBps=1000KBps

    1KBps=1000Bps

    使用Mbit、Kbit、bit单位控制输出流量带宽时,会导致控制不准,控制输入流量带宽时没问题。

    使用MBps、KBps、Bps单位控制输入输出流量带宽都很准。

    例如:tc  class  add  dev  eth0  classid  1:1  htb  rate  100MBps

    解释:在eth0设备上添加主分类,父分类默认为根分类,该分类句柄为1:1,保留带宽为100MBps(800000Kbit),共享带宽默认与保留带宽一样,优先级默认为0。

    例如:tc  class  add  dev  eth0  parent  1:1  classid  1:2  htb  rate  50MBps  ceil  100MBps  prio  1

    解释:在eth0设备上添加子分类,父分类为1:1,该分类句柄为1:2,保留带宽为50MBps(400000Kbit),共享带宽为100MBps(800000Kbit),优先级为1。

    3.6 修改主分类或子分类

    Shell命令:tc  class  change  dev  网络设备名  classid  分类句柄  htb  rate  保留带宽{MBps|KBps|Bps|Mbit|Kbit|bit}  [ceil  共享带宽{MBps|KBps|Bps|Mbit|Kbit|bit}]  [prio  优先级]

    注意:保留带宽是必须要填的,且无法修改父分类。

    注意:如果不指定共享带宽,则共享带宽和保留带宽一样。

    注意:如果指定的优先级为负数,则会导致命令执行失败。如果指定的优先级大于等于8,则优先级实际会设置成7。如果不指定优先级,则优先级实际会设置成0。

    3.7 删除主分类或子分类

    Shell命令:tc  class  del  dev  网络设备名  classid  分类句柄

    注意:如果有过滤器的与要删除的队列有关联,必须先删除过滤器,然后才能删除该队列。

    注意:如果要删除的队列有子队列时,必须先删除子队列,然后才能删除该队列。

    3.8 查看过滤器

    Shell命令:tc  [-s]  filter  {show|ls}  dev  网络设备名

    3.9 添加过滤器

    Shell命令:tc  filter  add  dev  网络设备名  parent  根分类句柄  protocol  ip  [prio  优先级]  u32 [match  ip  src  源发IP地址/XX]  [match  ip  sport  XXX  0xffff]  [match  ip  dst  目的IP地址/XX]  [match  ip  dport  XXX  0xffff]  flowid  分类句柄

    注意:如果优先级为0或不指定,则优先级实际会设置成很大的一个数,也就是说优先级很低。

    3.10  删除过滤器

    删除指定优先级的所有过滤器:tc  filter  del  dev  网络设备名  prio  优先级

    删除指定句柄的单个过滤器:tc  filter  del  dev  网络设备名  parent  根分类句柄  protocol  ip  prio  优先级  handle  句柄  u32

    4   输入流量控制

    加载虚拟网络设备驱动:

    modprobe ifb

    启用虚拟网络设备:

    ip  link  set  dev  虚拟网络设备名  up  [txqueuelen  1000]

    给网络设备添加ingress队列,ingress队列用于对输入流量控制:

    tc  qdisc  add  dev  网络设备名  ingress

    注意:ingress队列的句柄默认是ffff:,无法修改。

    将网络设备的输入流量重定向到虚拟网络设备的输出流量上:

    tc  filter  add  dev  网络设备名  parent  ffff:  protocol  ip  u32  match  u32  0  0  flowid  1:1  action  mirred  egress  redirect  dev  虚拟网络设备名

    5   tc命令

    tc qdisc

    tc class {add | replace | change | del}

    tc filter

    6   例子

    l  一个:

    以下eth1为内网网卡地址

    tc qdisc del dev eth1 root #删除以前的队列

    tc qdisc add dev eth1 root handle 1: htb #开启限速规则为htb(分层令牌桶)

    tc class add dev eth1 parent 1: classid 1:1 htb rate 3mbit burst 15k #规划限制带宽为3M峰值15k

    tc qdisc add dev eth1 parent 1:1 handle 10: sqf perturb 10 #设定平均分配带宽

    tc filter add dev eth1 protocol ip parent 1:0 prio 1 u32 match ip dst 192.168.8.17 flowid 1:1 #限制192.168.8.17速度为3mbit

  • 相关阅读:
    提取ecshop的mysql类
    phpexcel读取excel的xls xlsx csv格式
    Awstats显示国家地区插件GeoIP安装
    GeoIP Legacy City数据库安装说明
    JavaArrayList和数组间的相互转换
    mysql 初步认识
    HTTP ContentType
    ibatis 增加调试方法
    你了解Java中的Future吗?
    Java 环境问题总结
  • 原文地址:https://www.cnblogs.com/gaoyaguo/p/3643801.html
Copyright © 2020-2023  润新知