1. 程式人生 > >Linux核心TC工具鏈路頻寬設計--HTB佇列規定

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 所處理,但這並不是我們所需要的,因此需要再建立一個分類,用來單獨處理髮往伺服器的資料包,使其不受限制,這個分類的速率可以盡情的設定很大。