Linux流量控制控發不控收,所以只能對產生瓶頸網卡處的發包速率進行控制..而網絡瓶頸分析亦為Linux網絡流控的第一步。
二種流控算法上分:
無類算法 用於樹葉級無分支的隊列 SFQ TBF pFIFO
分類算法 用於多分支的隊列 PRIO HTB CBQ
調度
在分類器的幫助下,一個隊列規定可以裁定某些數據包可以排在其他數據包之前發送。這種處理叫做“調度”,比如此前提到的pfifo_fast就是這樣的。調度也可以叫做“重排序”,但這樣容易混亂。
整形
在一個數據包發送之前進行適當的延遲,以免超過事先規定好的最大速率,這種處理叫做“整形”。整形在出對處進行。習慣上,通過丟包來降速也經常被稱為整形。
1 pfifo_fast
這個隊列的特點就象它的名字——先進先出(FIFO),也就是說沒有任何數據包被特殊對待。至少不是非常特殊。
這個隊列有3個所謂的“頻道”。FIFO規則應用於每一個頻道。並且:如果在0頻道有數據包等待發送,1頻道的包就不會被處理,1頻道和2頻道之間的關系也是如此。
內核遵照數據包的TOS標記,把帶有“最小延遲”標記的包放進0頻道。
不要把這個無類的簡單隊列規定與分類的PRIO相混淆!雖然它們的行為有些類似,但對於無類的pfifo_fast而言,你不能使用tc命令向其中添加其它的隊列規定。
pfifo_fast隊列規定作為硬性的缺省設置,你不能對它進行配置
2.隊列控制的無類算法 SFQ
SFQ(Stochastic Fairness Queueing 隨機公平隊列)是公平隊列算法家族中的一個簡單實現.它的精確性不如其它的方法,但實現了高度的公平,需要的計算量亦很少。
SFQ算法主要針對一個TCP會話或者UDP流.流量被分成相當多數量的FIFO隊列中,每個隊列對應一個會話.數據按照簡單輪轉的方式發送, 每個會話都按順序得到發送機會. 這種方式非常公平,保證了每一個會話都不會沒其它會話所淹沒.
SFQ之所以被稱為"隨機",是因為它並不是真的為每一個會話創建一個隊列,而是使用一個散列算法,把所有的會話映射到有限的幾個隊列中去. 因為使用了散列,所以可能多個會話分配在同一個隊列裡,從而需要共享發包的機會,也就是共享帶寬.為了不讓這種效應太明顯,SFQ會頻繁地改變散列算法, 以便把這種效應控制在幾秒鐘之內(時間由參數設定).
注:SFQ只會發生在數據發生擁堵,產生等待隊列的網卡上..出口網卡若無等待隊列,SFQ亦不起作用...
以下示例即在網卡上建立SFQ:
#tc qdisc add dev eth0 root handle 1: sfq
SFQ參數有perturb(重新調整算法間隔) quantum 基本上不需要手工調整:
perturb
多少秒後重新配置一次散列算法。如果取消設置,散列算法將永遠不會重新配置(不建議這樣做)。10秒應該是一個合適的值。
quantum
一個流至少要傳輸多少字節後才切換到下一個隊列。卻省設置為一個最大包的長度(MTU的大小)。不要設置這個數值低於MTU!
handle 1: 規定算法編號.
#tc qdisc sh dev eth0 顯示算法
#tc qdisc del dev eth0 root 刪除 注:默認eht0支持TOS
SFQ隊列一般用在樹葉級,配合其它流量整形算法一並使用。