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

浙公網安備 33010602011771號