在Linux上用HFSC代替HTB作QoS

對於複雜的流量管制方案,階層式演算法是必要的。新近版本的linux可採用的演算法有htb和hfsc 。而htb基本上是將token bucket filter( tbf )轉換成階層式架構,保留了tbf的主要特徵, 而hfsc允許按比例分配頻寬並且控制及分配延遲(latency)。這能夠在只有一條實體網路連線的情況下,又快又好地同時提供頻寬密集的資料傳輸服務及互動式服務。

當網路被一個以上的實體連線連結或提供各種不同的服務時,我們需要一些合理的資源管理以保障個人服務及共享連接使用者的最低頻寬。尤其是關於VOIP或串流服務,無論是單純的頻寬分配或降低延遲都變得相形重要。

在兩個使用者共享一個1000kbit頻寬的網際網路連線的情況下,每個使用者在任何特定的時刻都應該享有最低500kbit的保證頻寬。其中User A,分配最高100kbit的頻寬於網絡電話其餘的傳輸流量爲一般資料傳輸。圖1顯示了相應的結構圖。在Linux上用HFSC代替HTB作QoS



1: Hierarchy of shared network access.

假設所有封包都是固定的大小1500bytes,並且所有等級都以最快速度發送。在1000kbit的頻寬下,每12毫秒(8*1500 byte / 1000000 bit/s = 12ms)發送一個封包。 VOIP佔用的100kbit相當於每秒8個封包。爲了滿足這個類別100kbit的保證速率, qdisc必須從這個類別每120ms發出一個封包,這表示每個封包最高會有132ms的queueing delay。這個例子說明了頻寬與latency的關係。

hfsc演算法同時處理頻寬和延遲兩樣資源。爲了解決這個問題,演算法使用service curve模型以分配資源。 service curve S(t) 表示單位時間t內的工作成果(bits) ,斜率表示傳輸速率。

延遲互動的概念存在於個別等級服務曲線的結構。透過選擇一個由兩部分組成(每一部分都是線性)的服務曲線,VOIP的傳輸延遲可降到30ms。首段服務曲線在30ms的期間內提供400kbit的斜率(傳輸速率),而第二部分則呈現出100kbi的速率t 。雖然在任何一點上都是所有曲線加總後頂多到達服務曲線的總容量,但卻從其他等級賺到了大約78ms的延遲降低。在我們的例子中,VOIP的延遲降低是以經調整至低於全域限制A羣組中未指定資料的等級爲成本。因此,這個等級的最高傳輸延遲從30 ms增加至52.5ms。至於非連續性的資料傳輸,如ftp ,重要的是總吞吐量,延遲的重要性較爲次之,因此仍符合服務曲線的設定值。在Linux上用HFSC代替HTB作QoS


Figure 2: Scenario with linear and multi-part linear service curves.

hfsc 演算法區分成即時(real-time)和連接共享(link-sharing)兩種標準。一個葉類別可以同時指派real-tim及link-sharing曲線,而子類別只能有一個link-sharing曲線。即時(real-time)只適用於葉類別,因爲實際上只有葉類別持有封包。因此即時導向的準則負責必要服務的達成。連接共享(link-sharing)的標準則只涉及本身與相鄰類別的關連,負責公平分配,而不提供絕對的保證。爲了在各種情況下都能夠確保最低延遲時間,分離成兩個標準是必要的。以結果而言,這也表示即使已經短暫超過上層子類別link-sharing曲線之限制,仍然可以根據葉類別的即時保證繼續發送封包。

讓我們談談我們例子中已經啓用,並以其最高速率400 kbit發送封包的資料類別A。現在,如果VOIP類別在任何時間點啓動都被允許根據其real-time的保證得以較高的速率傳送(圖3 )。於是,這意味着A類別在短時間內超出了link-sharing的設定參數500kbit。爲了達成長期的link-sharing的保證速率。 A類別將因這短暫的超支被”懲罰”。在Linux上用HFSC代替HTB作QoS

Figure 3: Between t1 and t2, exceeds the total maximum allowed capacity.

每個類別都會被指定一個與服務完成時間一致的”虛擬時間”。爲了儘快將封包送出,會從根類別開始之階層式架構中全面性的搜尋出提供最低達成的虛擬時間之類別。葉類別找出準則後即發送封包並且那個類別的虛擬時間,從其親類別一路往上到根類別,將相應增加。如果一個類別在其real-time參數的基礎上進行傳輸,其虛擬時間也會被加大。

HFSC usage on Linux

設定一個hfsc qdisc。指定qdisc的根類別到一個網絡介面,並且可以自訂一些規格:

tc qdisc add dev $dev root handle $ID: hfsc [default $classID ]

建立階層式的類別

tc add class dev $dev parent parentID classid $ID hfsc [ [ rt SC ] [ ls SC ] | [ sc SC ] ] [ ul SC ]

屬性是根據以下描述的服務曲線設定:

SC := [ umax bytes dmax ms ] rate BPS

我們可以如link-sharing (ls)曲線般的指定一條real-time曲線( rt )給處於最低層次的葉類別(leaf class),其上層的子類別(inner class)則只能有link-sharing曲線。透過使用ul服務曲線,可以定義每個類別實際對提供服務的上限。可以透過指定單一的SC曲線來代替指定rt曲線及ls曲線。一條服務曲線由斜率描述其傳輸速率。如果曲線由兩部份組成,可以由在保證傳輸速率umax時的maximum delay – dmax指定。

名詞解釋:
層級:
root:根類別,制訂最上層的總頻寬限制
inner class:子類別,定義各主要的頻寬分配
leaf class:葉類別,

# Example from Figure 1.
tc qdisc add dev eth0 root handle 1: hfsc

tc class add dev eth0 parent 1: classid 1:1 hfsc sc rate 1000kbit ul rate 1000kbit

tc class add dev eth0 parent 1:1 classid 1:10 hfsc sc rate 500kbit ul rate 1000kbit

tc class add dev eth0 parent 1:1 classid 1:20 hfsc sc rate 500kbit ul rate 1000kbit

tc class add dev eth0 parent 1:10 classid 1:11 hfsc sc umax 1500b dmax 53ms rate 400kbit ul rate 1000kbit

tc class add dev eth0 parent 1:10 classid 1:12 hfsc sc umax 1500b dmax 30ms rate 100kbit ul rate 1000kbit

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章