流量控制--6.Classful Queuing Disciplines (qdiscs)

charlieroro發表於2020-11-30

Classful Queuing Disciplines

可以使用classful qdisc的代理來解鎖Linux流量控制的靈活性和控制力。classful qdisc可以附加過濾器,允許將報文重定向到特定的類和子佇列。

有幾個常見的術語用來描述直接附加到root qdisc和終止類的類。附加到root qdisc的類稱為根類,一般為內部類。任何特定qdisc中的終止類稱為葉類,類似於樹形結構的類。除了把結構比喻成一棵樹外,通常也會使用家庭關係進行比喻。

7.1. HTB, 層級令牌桶

HTB是Linux中CBQ(參閱第7.4章)qdisc的一種更易理解和直觀的替換品。CBQ和HTB可以控制給定鏈路上的出站頻寬。這兩種方式都可以使用一個物理鏈路來模擬多個較慢的連結,並將不同的鏈路傳送到不同的模擬鏈路上。在這兩種情況下,必須指定如何將物理鏈路劃分為模擬鏈路,以及確定要傳送的報文使用哪個模擬鏈路。

HTB使用了令牌和桶的概念,並使用了基於類的系統和過濾器對流量進行復雜和細粒度的控制。通過一個複雜的借用模型,HTB可以實現各種複雜的流量控制技術。另一種最簡單的方式是在整流時使用HTB。

通過理解令牌和桶或掌握HTB的功能可以瞭解到,HTB僅僅是一個邏輯上的步驟。該qdisc允許使用者定義令牌和桶的特性,並允許使用者任意巢狀這些桶。當與分類方案結合使用時,可以以非常細粒度的方式控制流量。

例11. HTB的tc用法:

Usage: ... qdisc add ... htb [default N] [r2q N]
 default  minor id of class to which unclassified packets are sent {0}
 r2q      DRR quantums are computed as rate in Bps/r2q {10}
 debug    string of 16 numbers each 0-3 {0}

... class add ... htb rate R1 burst B1 [prio P] [slot S] [pslot PS]
                      [ceil R2] [cburst B2] [mtu MTU] [quantum Q]
 rate     rate allocated to this class (class can still borrow)
 burst    max bytes burst which can be accumulated during idle period {computed}
 ceil     definite upper class rate (no borrows) {rate}
 cburst   burst but for ceil {computed}
 mtu      max packet size we create rate map for {1600}
 prio     priority of leaf; lower are served first {0}
 quantum  how much bytes to serve from leaf at once {use r2q}

TC HTB version 3.3

7.1.1. 軟體要求

不同於前面討論的幾乎所有軟體,HTB是一個新的qdisc,現有的發行版可能缺少使用HTB所需要的所有軟體和能力。核心版本2.4.20及其以後的版本會支援HTB,早期的核心版本需要打補丁。為了在使用者空間支援HTB,參見HTB

7.1.2. 整流

HTB的最常見應用之一是將傳輸的流量調整到特定速率。

所有的整流都發生在葉類上。內部或根類上不會傳送整流,這些類僅會在借用模型中給出如何分配可用的令牌。

7.1.3. 借用

HTB的一個基本功能是借用機制。當子類超速率之後會借用父類的令牌。在達到ceil(此時子類會有資料包排隊,等待傳輸,直到有更多可用的令牌為止。)之前,子類會持續嘗試借用父類的令牌。由於使用HTB僅可以建立兩種主要的類(葉子類和內部類),因此下面的表和圖區分了借用機制的各種可能的狀態和行為。

表2.HTB型別狀態和和潛在的action令牌

type of class class state HTB internal state action taken
leaf < rate HTB_CAN_SEND 葉子類會出站佇列中的資料,不能大於突發的報文。
leaf > rate, < ceil HTB_MAY_BORROW 葉子類會嘗試從父類借用令牌(tokens/ctokens)。如果有可用的令牌,則以quantum增量的方式借出,且葉子類的出站速率不能大於cburst位元組。
leaf > ceil HTB_CANT_SEND 沒有出佇列的報文。會導致報文延遲,並增加延遲以滿足所需的速率。
inner, root < rate HTB_CAN_SEND 內部類會給子類借用令牌
inner, root > rate, < ceil HTB_MAY_BORROW 葉子類會嘗試從父類借用令牌(tokens/ctokens),父類會以quantum遞增的方式將令牌借給競爭的子類。
inner, root > ceil HTB_CANT_SEND 內部類不會嘗試從父類借用令牌,且父類不會將令牌借給子類。

下圖展示了借用令牌的流程,被借用的令牌會計入父類。為了借用模型能夠正常工作,每個類都必須精確計算自身和子類使用的令牌。基於這種原則,子類或葉子類使用的令牌會計入父類中,直到到達root類。

任何想要借用令牌的子類會從其父類中請求一個令牌,如果父類也達到了rate的限制,它將會向自己的父類借用令牌,以此類推,直到找到一個可用的令牌或達到root類為止。因此借用的令牌會流向葉子類,而對令牌的統計則會流向root類。

注意:上圖中有好幾個HTB root類,每個root類都可以模擬一個虛擬迴路。

7.1.4. HTB 類引數

default

每個HTB qdisc物件可選的引數,預設的default為0,這樣未分類的流量會使用硬體速度出佇列,不會經過附加到root qdisc的所有類。

rate

用於設定限制傳輸流量的最小速度。可以認為其相當於資訊的提交速率,或為一個給定的葉子類保證的頻寬。

ceil

用於設定限制傳輸流量的最大速度。借用模型應該說明如何使用該引數。可以認為其等同於"突發的頻寬"。

burst

rate的桶大小。HTB在等待更多令牌前可以入佇列burst位元組的資料。

cburst

ceil 的桶大小。HTB在等待更多ctokens前可以入佇列cburst 位元組的資料。

quantum

這是HTB用於控制借用的關鍵引數。通常HTB會計算一個正確的quantum ,使用者無需指定。修改該值會對競爭下的借用和整流造成巨大的影響(因為它會在流量超過rate(且低於ceil)的子類間對流量進行分割,並傳輸這些子類的報文)。

r2q

提供給使用者使用,用於幫助優化特定類的quantum

mtu

prio

在輪詢處理中,可以優先處理具有最低優先順序欄位數值的類對應的報文。強制欄位。

prio

類在層次結構中的位置。如果一個類直連到一個qdisc而不是另一個類,則可以省略minor(見下)。強制性欄位。

prio

與qdisc型別,也可以命名類。major號必須等於其附加到的qdisc的major號。該欄位是可選的,但在類包含子類時需要配置該欄位。

7.1.5. HTB root 引數

一個HTB qdisc類樹的root包含三個欄位:

parent major:minor | root

該強制引數確定了HTB例項的位置:介面的root位置還是位於一個已存在的類中。

handle major:

與其他的qdisc類似,可以給HTB分配一個控制程式碼,該控制程式碼應該包含一個major號,後跟一個冒號。可選欄位,但如果類將在這個qdisc中生成,則非常有用。

default minor-id

未分類的流量會使用該minor-id傳送到類。

7.1.6. 規則

以下是從http://www.docum.org/docum.org/和(new) LARTC mailing list (也可以參見 (old) LARTC mailing list archive)中挑選的使用HTB的一般準則。這些準則可以方便初學者在最大程度上了解HTB。

  • HTB的整流僅發生在葉子類上。

  • 由於HTB不會在除葉子類的類上進行整流,因此葉子類的rates 之和不能大於父類的ceil。理想情況下子類的rates 之和應該與父類的ceil相匹配,允許父類將剩餘的頻寬(ceil - rate)分配給子類。

    在使用HTB時,會多次重複這個關鍵概念。只有葉子類才會真正進行整流;報文只會在這些葉子類上延遲。內部類(到root類路徑上的類)定義瞭如何進行借入/借出(參見Section 7.1.3, “Borrowing”)。

  • 只有在一個類大於rate但低於ceil時才會用到quantum

  • quantum 應該設定為等於或大於MTU的值。即使在quantum 很小的情況下,HTB也會至少給每個服務一次報文入佇列的機會。這種情況下,HTB將無法精確計算真實使用的頻寬。

  • 父類以增量為quantum的方式將令牌提供給子類,以便獲得最大的粒度和最均勻的瞬時頻寬分佈,quantum 應該儘量小,但不能小於MTU。

  • tokens和ctokens的不同點僅對葉子類有意義,因為非葉子的類僅會借給子類令牌。

  • 對HTB借用的更精確的描述應該是"使用"(並不會歸還)

7.1.7. 分類

如前面所述,一個HTB例項可能會包含很多類,每個類都包含一個qdisc,預設為tc-pfifo。當入佇列一個報文時,HTB會從root類開始,使用多種方式來決定哪個類去接收該資料。在沒有特殊配置選項的情況下,處理會相當簡單。在樹的每個節點上查詢一條指令,然後轉到指令指向的類。如果找到的類是一個葉子類,則將報文入佇列到此處,如果不是一個葉子節點,則從該節點開始重複上述工作。

在訪問的每個節點上會執行以下操作,直到傳送到另一個節點(子節點)或終止該過程為止。

  • 查詢附加到類的過濾器。如果傳送到一個葉節點,則工作完成。否則,重新啟動。
  • 如果上述操作沒有返回指令,則在該節點上將報文入佇列。

這種演算法會確保報文總是在某個地方結束。

7.2. HFSC, 分層公平服務曲線(Hierarchical Fair Service Curve)

HFSC classful qdisc會對延遲敏感的流量和吞吐量敏感的流量進行平衡。當處於擁塞或擠壓狀態下時,HFSC排隊規則會在需要時根據服務曲線定義穿插處理對延遲敏感的流量。

7.3. PRIO, 優先順序排程器

PRIO classful qdisc的工作原理非常簡單。當它需要入佇列一個報文時,會檢查第一個類,如果該類包含報文,則將該報文入佇列,否則檢查下一個類,直到最後一個類。PRIO是一個不會延遲報文的排程器,它是一個連續工作的qdisc(儘管包含在類中的qdisc可能不是連續工作的)。

7.3.1. 演算法

當使用tc qdisc add命令建立PRIO時,會建立固定數目的bands(與pfifo類似)。每個band就是一個類(雖然不能使用tc class add新增類)。建立qdisc的時候建立的band的數目是固定的。

當入佇列報文時,總會優先檢查band 0。如果band 0中沒有報文,則PRIO會檢查band 1,以此類推。具有最大可靠性的報文會進入band 0,最小延遲的報文會進入band 1,其餘進入band 2。

由於PRIO本地包含minor號0,band 0實際上就是major:1,band 1為major:2,等等。對於major,可以用handle引數替換'tc qdisc add'上分配給qdisc的major號。

7.3.2. 用法

$ tc qdisc ... dev dev ( parent classid | root) [ handle major: ] prio [bands bands ] [ priomap band band band...  ] [ estimator interval time‐constant ]

7.3.3. 分類

有三種方式決定一個報文入佇列時的band:

  • 在使用者空間中,具有足夠特權的程式可以直接使用SO_PRIORITY對目標類進行編碼。
  • 通過程式設計,附加到root qdisc的tc過濾器可以將任何流量直接指向一個類。
  • 通常,參考priomap,報文的優先順序是從分配給報文的服務型別(ToS)派生出來的。

只有此qdisc指定了priomap。

7.3.4. 可配置的引數

  • bands:不同band的數目,如果該值不是預設值3,則需要更新priomap。

  • priomap:附加到root qdisc的tc過濾器,可以將流量直接指向一個類。

一個priomap 指定了該qdisc如何將一個報文對映到一個特定的band。對報文的對映基於其TOS的值。

   0     1     2     3     4     5     6     7
+-----+-----+-----+-----+-----+-----+-----+-----+
|   PRECEDENCE    |          ToS          | MBZ |   RFC 791
+-----+-----+-----+-----+-----+-----+-----+-----+

   0     1     2     3     4     5     6     7
+-----+-----+-----+-----+-----+-----+-----+-----+
|    DiffServ Code Point (DSCP)     |  (unused) |   RFC 2474
+-----+-----+-----+-----+-----+-----+-----+-----+

RFC 791 和RFC 2474對(4個位元位的)TOS的定義稍微有所不同,後者取代了前者在格式上的定義,但不是所有的軟體,系統和術語都能及時跟上這種變化。因此,報文分析程式通常會使用Type of Service (ToS)而不是DiffServ Code Point (DSCP)。

RFC 791 對IP的TOS首部的解析如下:

Binary Decimal Meaning
1000 8 Minimize delay (md)
0100 4 Maximize throughput (mt)
0010 2 Maximize reliability (mr)
0001 1 Minimize monetary cost (mmc)
0000 0 Normal Service

由於這4個位元位的右邊還有一個位元位,因此TOS欄位的實際值為TOS位元值的兩倍。執行 tcpdump -v -v可以顯示整個TOS欄位的值,而不僅僅4個位元位的值。

下表展示瞭如何將TOS值對映到priomap band:

ToS Field ToS Bits Meaning Linux Priority Band
0x0 0 Normal Service 0 Best Effort 1
0x2 1 Minimize Monetary Cost (mmc) 1 Filler 2
0x4 2 Maximize Reliability (mr) 0 Best Effort 1
0x6 3 mmc+mr 0 Best Effort 1
0x8 4 Maximize Throughput (mt) 2 Bulk 2
0xa 5 mmc+mt 2 Bulk 2
0xc 6 mr+mt 2 Bulk 2
0xe 7 mmc+mr+mt 2 Bulk 2
0x10 8 Minimize Delay (md) 6 Interactive 0
0x12 9 mmc+md 6 Interactive 0
0x14 10 mr+md 6 Interactive 0
0x16 11 mmc+mr+md 6 Interactive 0
0x18 12 mt+md 4 Int. Bulk 1
0x1a 13 mmc+mt+md 4 Int. Bulk 1
0x1c 14 mr+mt+md 4 Int. Bulk 1
0x1e 15 mmc+mr+mt+md 4 Int. Bulk 1

第二列包含相關的四個ToS位的值,以及它們的含義。例如,15表示想要最小貨幣成本,最大可靠性,最大吞吐量以及最小延遲。

第四列列出了Linux核心解析TOS位元位的方式,展示了TOS對映到的優先順序。

最後一列展示了預設的priomap值。在命令列中,預設的priomap為:1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1,其對應的優先順序為4,對應的band為1。priormap允許更高的優先順序(>7),這類優先順序並不對應TOS的對映,表示其他的含義。

7.3.5. 類

無法對PRIO類進行進一步的配置——它們在附加PRIO qdisc時自動建立。但每個類可以包含更多的qdisc。

7.3.6. Bugs

當低band中包含了大量流時,可能會導致高band飢餓。可以給這些band附加一個整流器,以確保這些band不會佔用大部分鏈路。

7.4. CBQ, 基於類的佇列 (CBQ)

CBQ是一個流量控制系統的類實現。CBQ是一個classful qdisc,它可以在類層次結構中共享鏈路。它包含整流元素以及優先順序功能。通過對入佇列事件的鏈路空閒時間和對底層鏈路頻寬的瞭解來實現整流。

7.4.1. 整流演算法

通過計算鏈路空閒時間以及設定當結果偏離了設定的限定值時所採取的動作來實現整流。

當一個10mbit/s連線到1mbit/s時,該鏈路上90%的時間都是空閒的。如果不是,則需要對其進行限流,使其90%的時間處於空閒狀態。

從核心的角度很難對流量進行衡量,因此,CBQ會根據裝置驅動程式請求資料之間的毫秒數計算空閒時間。結合報文的大小,可以近似知道鏈路滿或空的程度。

應當謹慎應對這種結果,因為並不是每次都能計算出合適的結果。在不太真實的網路裝置(例如乙太網上的PPP或TCP / IP上的PPTP)的情況下,對物理鏈路頻寬的定義可能不正確。

在操作時,有效空閒時間是用指數加權移動平均(EWMA)來進行測量的。這種針對空閒狀態計算出的最近的報文數是以前的報文數的指數倍。EWMA是一種有效的計算方法,可以解決系統處於活動狀態或非活動狀態的問題。例如,UNIX系統的平均負載就採用了這種計算方式。

從EWMA測得的值中減去計算出的空閒時間,結果稱為avgidle(平均空閒時間)。一個完美載入的鏈路的avgidle應該為0:接收的報文間隔等於計算的結果。

一個過載的鏈路的avgidle為負值,如果負值過大,則CBQ會限流。相反,如果一個空閒的鏈路的avgidle過大,則在一段時間的靜默後,可能會允許無限的頻寬。為了防止發生這種情況,將avgidle的上限是maxidle

從理論上講,如果超出限制,CBQ會嚴格限制計算出的用於放通報文的時間,然後放通一個報文,然後再進行限流。由於定時器精度的限制,這種方式可能不可行,參見下圖的minburst引數。

7.4.2. 分類

在CBQ qdisc下可能存在很多類。每個類會包含其他qdisc,預設為tc-pfifo

當入佇列一個報文時,CBQ會從root開始,使用多種方法來確定使用哪個類來接收該資料。如果做出判定,則對接收的類重複此過程,該類可能有進一步的方法來將流量分類到子類(如果有的話)。CBQ可以使用如下方法將一個報文分類給任何子類:

  • skb->priority類編碼。可以由設定了SO_PRIORITY setsockopt的使用者空間的應用進行設定。skb->priority類編碼只適用於當skb->priority持有此qdisc中現有類的major:minor控制程式碼的情況。
  • 附加到該類的tc過濾器
  • 一個類的defmap,由split和defmap引數設定。defmap 可能包含針對每個可能的Linux報文優先順序的指令。

每個類也有一個級別。連線到類層次結構底部的葉節點的級別為0。

7.4.3. 分類演算法

分類是一個迴圈,當達到葉子類時終止。迴圈中的任一點都可能跳到一個回退演算法中。迴圈包含如下步驟:

  • 如果報文是本地生成的,且在skb->priority中編碼了一個有效的classid,則選擇該類,並終止迴圈。
  • 查詢附加到該子類的tc過濾器(如果存在)。如果返回的類不是葉子類,則從返回的類上重新執行迴圈。如果返回的類是葉子類,則選擇該類並終止迴圈。
  • 如果tc過濾器沒有返回類,也沒有返回類的有效引用,則將引用的minor 號作為優先順序,然後從該類的defmap中檢索一個此優先順序的類。如果沒有此優先順序的類,則查詢該類的defmap,檢視一個BEST_EFFORT 類。如果這是一個向上引用,或者沒有定義BEST_EFFORT 類,則進入回退演算法。如果發現一個有效的類,且非葉節點,則從該類重啟迴圈;如果是一個葉節點,則選擇該類並終止迴圈。如果根據classid提取的優先順序或BEST_EFFORT優先順序均未發現相關的類,則進入回退演算法。

回退演算法位於迴圈之外,遵循如下規則:

  • 查詢要回退的跳轉發生在哪個類的defmap,如果該defmap包含一個與該類的優先順序(與TOS欄位相關)相同的類,則選擇該類並終止迴圈。
  • 查詢BEST_EFFORT 優先順序的類,如果找到,則選擇該類並終止迴圈。
  • 選擇發生回退演算法的類。 終止迴圈。

當任意一種演算法終止時,報文被加入到所選擇的類中。因此,報文可以不在葉節點入佇列,而在層次結構的中間入佇列。

7.4.4. 鏈路共享演算法

當入佇列傳送到網路驅動的報文時,CBQ決定哪個類可以傳送報文。CBQ使用一個基於權重的輪詢處理,每個類中的報文都有機會按照順序傳送出去。WRR會從具有最高優先順序的類中處理報文,直到這些類中沒有任何資料,然後處理低優先順序的類。

由於每個類都不允許以長度傳送資料,因此只能在每輪中取出可配置數量的資料。

如果一個類即將超出限制,且不受限制,它將嘗試從沒有隔離的兄弟節點中借用avgidle,從下向上重複這個過程。如果一個類無法借用到足夠的avgidle來傳送報文,則這個類會限流,並且不要求報文等待足夠的時間來使avgidle增加到零以上。

7.4.5. Root 引數

CBQ的root qdisc有如下引數:

parent root | major:minor:

強制引數,確定CBQ例項的位置,即介面的root類還是一個現有的類中。

handle major:

與其他類的qdisc類似,CBQ可以分配一個控制程式碼。應該包含一個使用冒號分割的主號。可選引數。

avpkt bytes

為了計算,平均報文大小必須事先可知。預設至少為MTU的2/3。強制引數。

bandwidth rate

底層可用的頻寬,用於確定空閒時間,CBQ必須知道頻寬:A)目標頻寬;B)底層物理介面或C)父qdisc。這是一個至關重要的引數,後面會詳細介紹。強制引數。

cell size

cell大小確定了報文傳輸時間計算的粒度,必須是2的整數次冪,預設為8。

mpu bytes

0大小的報文可能也會佔用傳輸的時間。這個值是報文傳輸時間計算的下限,小於該值的報文仍然被認為是這個大小。預設值為0。

ewma log

CBQ使用指數加權移動平均值(EWMA)來計算空閒狀態,該方法可以以平滑測量的方式輕鬆應對短時間的突發。log值決定了平滑傳送的數量。更低的值意味著更高的靈敏度。必須為0~31之間的數值,預設為5。

一個CBQ qdisc不會自行整流。它需要知道有關底層鏈路的某些引數。實際的整流是在類中完成的。

7.4.6. 類引數

類有很多引數類配置其操作:

parent major:minor

層級結構中類的位置。如果直接附加到一個qdisc,而不是一個類,則可以忽略minor。強制引數。

classid major:minor

與qdisc類似,class是可命名的。majob號必須等於其屬於的qdisc的major號。可選引數,但如果一個類包含子類時必選。

weight weightvalue

當入佇列到底層時,將以迴圈方式使用類處理流量。通常具有更高權重的qdisc的類在一輪迴圈中可以傳送更多的流量,因此該類也可以入佇列更多的流量。由於一個類下的所有權重都被歸一化了,因此只有比率才是重要的。預設使用配置的速率,除非該類的優先順序是最大的,在這種情況下,它的優先順序設定為1。

allot bytes

allot 指定了在每個輪詢中一個qdisc可以入佇列的位元組資料。可以使用上面描述的權重對該引數進行加權。

priority priovalue

在輪詢處理中,具有最低優先順序欄位值的類會優先處理報文。強制欄位。

rate bitrate

這個類(包括子類)能夠傳輸的最大聚合速率。bitrate 使用tc的方式指定速率(如1544kbit)。強制欄位。

bandwidth bitrate

該引數與建立CBQ qdisc時指定的頻寬不同。CBQ類的bandwidth 引數僅用於確定maxidle和offtime,而該引數僅在指定maxburst或minburst時才計算。因此,該引數僅在指定maxburst或minburst時使用。

maxburst packetcount

該報文數用於計算maxidle,這樣在avgidle達到maxidle時,且在avgidle 將到0前,允許平均報文的突發。增加該值可以允許更大的突發。使用者無法直接設定maxilde,只能通過該引數設定。

minburst packetcount

如前面所述,CBQ需要設定限制來防止發生超額。理想的解決方案是精確計算出空閒時間,然後傳遞1個報文。然而,Unix核心通常很難排程小於10ms的事件,因此最好能在一段比較長的時間內限流,然後一次性傳遞minburst的報文,然後使minburst 時間更長。等待的時間稱為offtime。從長遠角度看,更大的minburst 值會獲得更精確的整流效果,但在毫秒時間尺度上會產生更大的突發。

minidle microseconds

minidle:如果avgidle小於0,則說明此時已經超額,需要等到avgidle能夠傳送一個報文為止。為了防止底層鏈路長時間中斷導致的突發,如果avgidle值過低,則會重置為minidle。minidle 使用負值表示,因此10表示avgidle的上限為-10us。

bounded | borrow

指定了一個借用策略。即要麼類會從兄弟節點借用頻寬,要麼將自己視為受限的。 二者是互斥的。

isolated | sharing

指一個共享策略。這個類要麼對它的兄弟類使用共享策略,要麼認為自己是孤立的。二者是互斥的。

split major:minor and defmap bitmap[/bitmap]: 如果查詢附加到類的過濾器之後沒有給出結論,CBQ可以根據報文的優先順序進行分類。有16個優先順序,從0到15。defmap指定了類期望接收的優先順序,優先順序使用點陣圖進行表示。最低有效位對應的優先順序為零。split引數告訴CBQ必須在哪個類上做出決定,這個類應該是要新增的類的(祖)父類。

如, 'tc class add ... classid 10:1 cbq .. split 10:0 defmap c0' 配置類10:0傳送優先順序為6和7到10:1的報文。

可替代的寫法為: 'tc class add ... classid 10:2 cbq ... split 10:0 defmap 3f',將傳送所有的優先順序為0, 1, 2, 3, 4 和5 的報文到10:1。

estimator interval timeconstant: CBQ可以測量每個類使用的頻寬,以及哪些tc過濾器可以用來對報文進行分類。為了確定頻寬,它使用了一個非常簡單的評估器,每隔一微秒測量通過了多少流量。這也是一個EWMA,它的時間常數可以指定,同樣是以微秒為單位。時間常數對應於測量的遲緩性,或者相反,對應平均值對短脈衝的靈敏度。更高的值表示更低的靈敏度。

7.5. WRR, 基於權重的輪詢

該qdisc不包含在標誌的核心中。

WRR qdisc使用加權輪詢方案在其類之間分配頻寬。它與CBQ qdisc類似,包含可以插入任意qdisc的類。具有足夠需求的所有類都將獲得與類相關的權重成比例的頻寬。可以通過tc程式手動設定權重。但是對於傳輸大量資料的類,也可以使它們自動減少。

該qdisc有一個內建的分類器,可以將來自或傳送到不同機器的資料包分配給不同的類(使用MAC或IP以及源或目的地址)。當Linux作為橋時會使用MAC地址。這些類會根據所看到的報文自動分配給機器。

該qdisc在許多無關的人共享Internet連線的站點上時非常有用。WRR發行版的關鍵部分是一組為此類站點設定相關行為的指令碼。

相關文章