Linux的頻寬管理系統

來源:互聯網
上載者:User

原載Linux寶庫 
http://www.linuxmine.com
Linux 包含複雜的頻寬管理系統 TC (流量控制,Traffic Control)。該系統支援分類、優先、共用和輸入、輸出資料流量限制等。這套系統能和專用的頻寬管理系統相媲美。
1. 基本的構成塊
tc 包括三個基本的構成塊: 隊列規定(queueing discipline )、類(class)和分類器(Classifiers) 。
隊列規定能看作裝置的流量/資料包管理器。 隊列規定內封裝了其他兩個主要TC組件(類和分類器),控制資料的流動。
目前,有一些裝置隊列規定能用來管理裝置,包括類基隊列(CBQ),優先順序和CSZ (Clark-Shenker-Zhang)等。CBQ 是一種終極隊列,即他能夠包含其他隊列(甚至其他CBQ)。
類由裝置隊列規定來管理。類由若干規則(rule)構成,這些規則用以管理那個類所擁有的資料。例如,某類裡的全部資料包都受到 1 Mbps的速率限度,而在午夜和早上6點的一段時間段內允許最高達 3 Mbps。
一些隊列規定能綁定到類上,包括FIFO(先進先出),RED(隨機早期探測),SFQ(隨機公平隊列)和令牌桶(Token Bucket)。
如果裝置上未綁定隊列規定,則使用基本的FIFO。另外, CBQ,CSZ和優先順序也能用於類,及類的子類。這表明使用TC,能輕鬆地建造非常複雜的流量控制。管理類的隊列規定能稱為類隊列規定(class queueing disciplines)。
一般地,類隊列規定管理該類的資料和隊列,能決定延遲、丟掉或重新分類他管理的包。分類器或過濾器描述包,並且把他們映射到隊列規定所管理的類。
這些過濾器通常都提供簡單的描述語言,指定選擇包、把包映射到類的方法。
目前,TC能使用的過濾器有:fwmark分類器,u32分類器,基於路由的分類器和RSVP分類器(分別用於IPV6、IPV4)等;其中,fwmark分類器允許我們使用 Linux netfilter 代碼選擇流量,而u32分類器允許我們選擇基於 ANY 頭的流量 。所有的防火牆過濾器, 例如,ipchains,都能用來分類包。
TC代碼位於核心,不同的功能塊既能編譯為模組,也能直接編進核心。 和核心代碼或模組的通訊和設定由使用者級程式tc完成。
2. 樣本
2.1 編譯核心
首先要確保選中 Kernel/User netlink socket,因為只有這樣 tc 才能通過 netlink 和核心通訊。
然後,把隊列規定和分類器都編進核心。這其中包括:
QoS or fair queueing, CBQ packet scheduler, CSZ packet scheduler, the simplest PRIO pseudoscheduler, RED queue, SFQ queue, TBF queue, QoS support, rate estimator, packet classifier API, routing-tables-based classifier, U32 classifier, special RSVP classifier 和 special RSVP classifier for IPv6。
然後就是大家熟知的編譯和安裝過程了。
2.2 建立
[網際網路] ---〈E3、T3 等〉--- [Linux 路由器] --- [Office+ISP]
eth1 eth0
中的 Linux 路由器有兩個介面,不妨稱之為 eth0 和 eth1。eth1 串連到路由器, eth0 串連到包括公司防火牆在內的子網上。
由於我們只能限制發送的內容,所以我們需要兩套獨立的、但可能非常相似的規則集。我們能通過改動發送次序來控制傳輸速率。通過修改 eth0 上的隊列,我們能確定客戶 的下載(download)速率;通過修改 eth1 上的隊列,我們能確定我們公司自己的用 戶的上傳(upload)速率。
比如說,公司串連到網際網路的線路頻寬為 10 兆,同時滿足外部客戶和公司自己使用者的需要;此時,我們就需要一種策略,來進行管理和協調。CBQ 就能滿足我們的需求。
我們有兩個主類:’ISP’ 和 ’Office’。我們能決定,客戶有 8 兆的頻寬,Office使用者有 2 兆的頻寬。
我們首先發布如下的命令:
# tc qdisc add dev eth0 root handle 10: cbq bandwidth 10Mbit avpkt 1000
其含義是:我們設定了 eth0 的隊列規定,root 表示這是根(root)規定,其控制代碼 (handle)設定為 10:’。 其類型為 CBQ。頻寬為 10 M,平均包大小為 1000 位元組。
下面產生根類(root class):
# tc class add dev eth0 parent 10:0 classid 10:1 cbq bandwidth 10Mbit rate
  10Mbit allot 1514 weight 1Mbit prio 8 maxburst 20 avpkt 1000
這條命令其實不比前一條命令有更多的含義。其中,1514 是 MTU 的值。
下面產生 ISP 類:
# tc class add dev eth0 parent 10:1 classid 10:100 cbq bandwidth 10Mbit rate
  8Mbit allot 1514 weight 800Kbit prio 5 maxburst 20 avpkt 1000 bounded
我們分配了 8 兆的頻寬給他,其中 bounded 表示該類不能超過該閥值。
下面產生 Office 類:
# tc class add dev eth0 parent 10:1 classid 10:200 cbq bandwidth 10Mbit rate
  2Mbit allot 1514 weight 200Kbit prio 5 maxburst 20 avpkt 1000 bounded
為了更清晰起見,我們的類能用表示:
我們已向核心通知了我們的類,我們還需要告訴核心怎麼管理隊列,如下所示:
# tc qdisc add dev eth0 parent 10:100 sfq quantum 1514b perturb 15
  # tc qdisc add dev eth0 parent 10:200 sfq quantum 1514b perturb 15
這裡,我們使用了隨機公平隊列(sfq),在消耗 CPU 週期較少的情況下,其效能還是能接受的。其他一些隊列規定可能更好,但要佔用較多的 CPU 資源。令牌桶過濾器也經常使用。
下面更有一件事要作:告訴核心網路包和類的映射關係。
# tc filter add dev eth0 parent 10:0 protocol ip prio 100 u32 match ip dst
  150.151.23.24 flowid 10:200
# tc filter add dev eth0 parent 10:0 protocol ip prio 25 u32 match ip dst
  150.151.0.0/16 flowid 10:100
這裡,我們假定 Office 位於防火牆 150.151.23.24 的後面,其他 IP 位址都屬於 ISP。 u32 匹配是一種比較簡單的匹配,我們能使用 netfilter 產生更加複雜的匹配規則。
我們已指派了下載頻寬,下面是上傳頻寬的分配:
# tc qdisc add dev eth1 root handle 20: cbq bandwidth 10Mbit avpkt 1000
# tc class add dev eth1 parent 20:0 classid 20:1 cbq bandwidth 10Mbit rate
  10Mbit allot 1514 weight 1Mbit prio 8 maxburst 20 avpkt 1000
# tc class add dev eth1 parent 20:1 classid 20:100 cbq bandwidth 10Mbit rate
  8Mbit allot 1514 weight 800Kbit prio 5 maxburst 20 avpkt 1000
  bounded
# tc class add dev eth1 parent 20:1 classid 20:200 cbq bandwidth 10Mbit rate
  2Mbit allot 1514 weight 200Kbit prio 5 maxburst 20 avpkt 1000
  bounded
# tc qdisc add dev eth1 parent 20:100 sfq quantum 1514b perturb 15
  # tc qdisc add dev eth1 parent 20:200 sfq quantum 1514b perturb 15
# tc filter add dev eth1 parent 20:0 protocol ip prio 100 u32 match ip src
  150.151.23.24 flowid 20:200
# tc filter add dev eth1 parent 20:0 protocol ip prio 25 u32 match ip src
  150.151.0.0/16 flowid 20:100
這和前面的描述基本一致,所以就不做更多的解釋了。
註:
在前面的例子中,我們注意到:即使 ISP 客戶多數離線,我們的 Office 使用者也仍然只 有 2 M 的頻寬,這是相當浪費的。我們能刪掉 ’bounded’ 參數,這樣,各類之間就能相互借用頻寬了。
不過,某些類也許不希望向其他類借用頻寬;比如,一條線路上的兩個互為競爭者的 ISP 的情況。在這種情況下,我們能加上關鍵字 ’isolated’。
3. 結束語
目前,Linux 所提供的 QoS(服務品質)是所有作業系統中最複雜、最完善的。另外, BSD 的 ALTQ 應該說也相當不錯;不過,在複雜性、靈活性和可擴充性等方面要落後 Linux 一大截。我不太清晰微軟的產品是否提供了這方面的功能。Sun 的 Solaris 提供 了 CBQ 和 RSVP 的功能。
Linux 也支援 IETF diffserv 特徵。Linux 在 QoS 方面眾多的特徵,將極大提升 Linux 的市場佔有率。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.