Linux核心TC工具鏈路頻寬設計--HTB佇列規定
1 HTB(Hierarchical Token Bucket, 分層的令牌桶)
HTB 使用令牌和儲存桶的概念,以及基於類的系統和過濾器,以允許對流量進行復雜和精細的控制。藉助複雜的借用模型,HTB 可以執行各種複雜的流量控制技術。該佇列規則允許使用者定義所使用的令牌和桶的特徵,並允許使用者以任意方式巢狀這些桶。當與分類方案結合使用時,可以非常精細地控制流量。HTB 非常適用於這種情況:如果有一個固定速率的鏈路,希望分割給多種不同的用途使用,為每種用途做出頻寬承諾並實現定量的頻寬借用。HTB 不同於 CBQ 的是並不靠計算閒置時間來整形。它是一個分類的令牌桶過濾器。
1.1 HTB 的引數介紹
default
每個 HTB 佇列的可選引數,預設值為 0,其意義是任何未分類的流量以物理網絡卡的速率出隊,完全繞過連線到根佇列的任何分類。如果指定了 default 的值,未分類(不能和 filter 匹配)的流量(預設的)會被送到這個引數所指定的類中。
rate
用來設定限制傳輸的流量速率。
ceil
用來設定限制傳輸流量的最大所需速率。如果需要設定共享頻寬,則需使用此引數。這個引數可以被認為相當於“可突發頻寬”
burst
桶的大小。前面在討論不可分類的佇列規則時提到過令牌桶過濾器 TBF,桶的概念就是其中的令牌,用於處理資料的傳輸時必要的引數,如果需要具體瞭解可以參考前面的內容
cburst
這是 ceil 桶的大小。在等待更多的令牌到來之前,HTB 會使 cburst 位元組出列。這裡涉及令牌流與資料流的概念與關係,具體可參考前面不可分類的佇列規定
quantum
每輪當前的類能傳送的位元組數,這是用來控制租借頻寬的關鍵引數。其預設計算 quantum = rate / r2q。quantum 必須大於 1500 小於 60000。quantum 只在 class 的流量超過了 rate 但是沒有超過 ceil 時使用,它的值越小,頻寬共享的效果就越好。
1.2 配置範例
這個配置把 WEB 伺服器的流量控制為 5Mbps、SMTP 流量控制在 3Mbps。而且二者一共不得超過 6Mbps,互相之間允許借用頻寬。
# sudo tc qdisc add dev enp0s5 root handle 1: htb default 30 # sudo tc class add dev enp0s5 parent 1:0 classid 1:1 htb rate 6Mbit burst 15k # sudo tc class add dev enp0s5 parent 1:1 classid 1:10 htb rate 5Mbit burst 15k # sudo tc class add dev enp0s5 parent 1:1 classid 1:20 htb rate 3Mbit ceil 6Mbit burst 15k # sudo tc class add dev enp0s5 parent 1:1 classid 1:30 htb rate 1kbit ceil 6Mbit burst 15k
在那些類的下方放置 SFQ:
# sudo tc qdisc add dev enp0s5 parent 1:10 handle 10: sfq perturb 10 # sudo tc qdisc add dev enp0s5 parent 1:20 handle 20: sfq perturb 10 # sudo tc qdisc add dev enp0s5 parent 1:30 handle 30: sfq perturb 10
新增過濾器,直接把流量導向相應的類:
# U32="sudo tc filter add dev enp0s5 protocol ip parent 1:0 prio 1 u32" # $U32 match ip dport 80 0xffff flowid 1:10 # $U32 match ip sport 25 0xffff flowid 1:20
如果 10: 和 20: 都得到了保證的速率,剩下的就是分割了,它們借用的比率是 5:3。未被分類的流量被送到了 30:,僅有一點點頻寬,但是卻可以任意借用剩下的頻寬。因為其內部使用了 SFQ,而可以公平發包。
控制伺服器對外的速度為 20Mbit,伺服器只能向外發 20Mbit 的資料包。
# sudo tc qdisc del dev enp0s5 root 2> /dev/null > /dev/null # sudo tc qdisc add dev enp0s5 root handle 1: htb # sudo tc class add dev enp0s5 parent 1:0 classid 1:1 rate 100Mbit ceil 100Mbit # sudo tc class add dev enp0s5 parent 1:1 classid 1:10 rate 20Mbit ceil 20Mbit # sudo tc qdisc add dev enp0s5 parent 1:10 sfq perturb 10 # sudo tc filter add dev enp0s5 protocol ip parent 1:0 prio 2 u32 match ip dst 192.168.224.60 flowid 1:1 # sudo tc filter add dev enp0s5 protocol ip parent 1:0 prio 2 u32 match ip dst 0.0.0.0/0 flowid 1:10
上面的命令中建立了兩個分類,第一個分類的速率為 100Mbit,假設伺服器的 IP 為 192.168.224.60,第一個過濾器是用來處理髮往伺服器的資料包,讓所有發往伺服器的資料包由 1:1 直接處理,相當於不受限制。而發往其他目標主機的資料包由 1:10 處理,即伺服器只能向外傳送 20Mbit 的資料包。如果這裡只建立了一個分類,即上面的 1:10,則所有沒有被分類的資料包會被網絡卡直接處理,也能達到不對其限制的目的,但是發往伺服器的資料包也會被 1:10 所處理,但這並不是我們所需要的,因此需要再建立一個分類,用來單獨處理髮往伺服器的資料包,使其不受限制,這個分類的速率可以盡情的設定很大。