Linux

為什麼這個 TC 腳本不工作

  • September 26, 2013

我們的應用程序有三類流量,每類流量都涉及三個埠。我們想通過 TC 通過埠號來限制流量,所以我做了一個簡單的 TC 腳本來進行測試,但是腳本沒有按我的預期工作。

下面是我用來設置 TC 的那些 shell 命令。預期的結果是 SecureCRT 和 Apache(SecureCRT 使用 22 埠,Apache 使用 80)的下載速率將被限制在 100K/S,但我們得到的實際結果是下載速率保持不變——大約 5MB/s。

  tc qdisc del dev eth0 root
  tc qdisc add dev eth0 root handle 1:0 cbq bandwidth 1Mbit avpkt 1000 cell 8

  tc class add dev eth0 parent 1:0 classid 1:1 cbq bandwidth 1Mbit rate 1Mbit 
  weight 100kbit prio 5 allot 1514 cell 8 maxburst 20 avpkt 1000 bounded

  tc class add dev eth0 parent 1:0 classid 1:2 cbq bandwidth 1Mbit rate 1Mbit
  weight 100kbit prio 5 allot 1514 cell 8 maxburst 20 avpkt 1000 bounded

  tc class add dev eth0 parent 1:0 classid 1:3 cbq bandwidth 1Mbit rate 1Mbit
  weight 100kbit prio 5 allot 1514 cell 8 maxburst 20 avpkt 1000 bounded


  tc class add dev eth0 parent 1:1 classid 1:1001 cbq bandwidth 1Mbit rate 
  800kbit weight 80kbit prio 8 allot 1514 cell 8 maxburst 20 avpkt 1000
  tc qdisc add dev eth0 parent 1:1001 handle 1001: sfq

  tc class add dev eth0 parent 1:1 classid 1:1002 cbq bandwidth 1Mbit rate
  800kbit weight 80kbit prio 8 allot 1514 cell 8 maxburst 20 avpkt 1000
  tc qdisc add dev eth0 parent 1:1002 handle 1002: sfq

  tc class add dev eth0 parent 1:1 classid 1:1003 cbq bandwidth 1Mbit rate 
  800kbit weight 80kbit prio 8 allot 1514 cell 8 maxburst 20 avpkt 1000
  tc qdisc add dev eth0 parent 1:1003 handle 1003: sfq


  tc class add dev eth0 parent 1:2 classid 1:2001 cbq bandwidth 1Mbit rate
   800kbit weight 80kbit prio 8 allot 1514 cell 8 maxburst 20 avpkt 1000
  tc qdisc add dev eth0 parent 1:2001 handle 2001: sfq

  tc class add dev eth0 parent 1:2 classid 1:2002 cbq bandwidth 1Mbit rate
     800kbit weight 80kbit prio 8 allot 1514 cell 8 maxburst 20 avpkt 1000
  tc qdisc add dev eth0 parent 1:2002 handle 2002: sfq

  tc class add dev eth0 parent 1:2 classid 1:2003 cbq bandwidth 1Mbit rate 
     800kbit weight 80kbit prio 8 allot 1514 cell 8 maxburst 20 avpkt 1000
  tc qdisc add dev eth0 parent 1:2003 handle 2003: sfq


  tc class add dev eth0 parent 1:3 classid 1:3001 cbq bandwidth 1Mbit rate
     800kbit weight 80kbit prio 8 allot 1514 cell 8 maxburst 20 avpkt 1000
  tc qdisc add dev eth0 parent 1:3001 handle 3001: sfq

  tc class add dev eth0 parent 1:3 classid 1:3002 cbq bandwidth 1Mbit rate
    800kbit weight 80kbit prio 8 allot 1514 cell 8 maxburst 20 avpkt 1000
  tc qdisc add dev eth0 parent 1:3002 handle 3002: sfq

  tc class add dev eth0 parent 1:3 classid 1:3003 cbq bandwidth 1Mbit rate
    800kbit weight 80kbit prio 8 allot 1514 cell 8 maxburst 20 avpkt 1000
  tc qdisc add dev eth0 parent 1:3003 handle 3003: sfq

  tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32 match ip sport 
            80 0xffff flowid 1:3001
  tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32 match ip sport
            22 0xffff flowid 1:3002

您不能對流量進行分類,然後對“傳入”流量或ingress通常呼叫的方式使用整形或延遲。該圖是從LARTC 文件中藉用的:

Userspace programs
                    ^
                    |
    +---------------+-----------------------------------------+
    |               Y                                         |
    |    -------> IP Stack                                    |
    |   |              |                                      |
    |   |              Y                                      |
    |   |              Y                                      |
    |   ^              |                                      |
    |   |  / ----------> Forwarding ->                        |
    |   ^ /                           |                       |
    |   |/                            Y                       |
    |   |                             |                       |
    |   ^                             Y          /-qdisc1-\   |
    |   |                            Egress     /--qdisc2--\  |
 --->->Ingress                       Classifier ---qdisc3---- | ->
    |   Qdisc                                   \__qdisc4__/  |
    |                                            \-qdiscN_/   |
    |                                                         |
    +----------------------------------------------------------+

Linux 有簡單的 ingres qdisc,但它的功能非常有限,因為沒有入口隊列。但是可以使用IMQ device“模擬”入口排隊的(InterMediate Queuing device)來解決它。

此外,當您的伺服器充當路由器(打開 IP 轉發)時,您可以調整/延遲傳入流量。如果伺服器有兩個網路介面——例如用於 Internet 訪問的 eth0 和用於本地網路訪問的 eth1——並且來自本地網路的客戶端正在下載某些內容,那麼,此流量是 eth0 介面上的傳入/入口和 eth1 介面上的傳出/出口。因此,如果您在 eth1 介面上定義 QoS 策略,它將起作用。

最後,我建議您切換到htbqdisc from cbq,因為它更準確(它使用TBF不依賴於介面特徵的 Token Bucket Filter)。

引用自:https://serverfault.com/questions/541749