Linux
為什麼這個 TC 腳本不工作
我們的應用程序有三類流量,每類流量都涉及三個埠。我們想通過 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 策略,它將起作用。
最後,我建議您切換到
htb
qdisc fromcbq
,因為它更準確(它使用TBF
不依賴於介面特徵的 Token Bucket Filter)。