今天在思考一個案例,長期觀察,發現所有User會用的Edge Port都有TX Drop發生,IoT設備就沒有,兩者是不同的VLAN。
而所有介面都沒有RX Drop,也不是廣播風暴造成的。
由於到Server的骨幹全部都是10G以上,因此不對稱頻寬的網路,是有可能讓TX Drop發生在Edge Port上。
不過Uplink是雙線10G,也會出現TX Drop,穩定緩緩持續增加。
初步判斷是正常現象,本文更進一步研究如何處理。
Virtual Output Queue(VOQ)
封包經過查找之後,決定要從某一或是某些介面出去時,會將封包「直接」放入這些出口介面的VOQ,單個介面有八個VOQ,八個VOQ中可以作為緩衝,也對應著傳送的優先程度。
真正的出口佇列只有一個,VOQ透過Scheduler安排不同優先度封包進入,並等出口佇列送出。
可以想像,VOQ是入口佇列與出口佇列中間的過度。
VOQ的TX Drop
在預設之下,預設流量皆為Local Priority 1,來到Queue 1。
然而VOQ的緩存大小有限,並且隨著Switch機型往更高階提升,如Data Center的緩存更高,甚至有防掉包的機制。
因此在不替換設備前提之下,基本上VOQ的大小是無法調整,就要朝另外一個方法著手。
由於Q1的流量最大,但是VOQ的大小卻沒有相對應更高,因此若套用QoS,就能讓更重要的流量走Q3之類的。
藉此空出Q1,避免Q1短時大流量而丟包。
特定流量QoS
假設要往168.95.1.1的流量要優先一點,可以使用以下設定。
先建Class與Policy。
class ip test
match ip any 168.95.1.1
exit
policy test
class ip test action local-priority 3
exit
然後將Policy放入指定介面或是全局套用。
==== 特定介面 ====
CX10000-LAB(config)#
int 1/1/4
no apply policy test in
exit
==== 全局使用 ====
CX10000-LAB(config)# apply policy test in
QoS實測
使用特定電腦 Ping 168.95.1.1
由於VOQ的關係,命中Policy後,會直接在對應出口介面的佇列,local-priority 3預設對應Q3。
出口介面為1/1/48,使用「show int 1/1/48 queue」查看計數是否增加。

可以看到int 1/1/48的Q3增加。

特定來源目的IP做頻寬限制 – OpenSpeedtest
Client IP為 10.0.0.101,並接至int 1/1/1。
Server IP為 10.0.2.1,並接至int 1/1/4。
以下速率限制為100,000 kbps 即 100Mps。
class ip BW_LIMIT_ACL
10 match any 10.0.0.101/32 10.0.2.1/32
20 match any 10.0.2.1/32 10.0.0.101/32
exit
policy BW_LIMIT_ACL
10 class ip BW_LIMIT_ACL action cir kbps 100000 cbs 100000 exceed drop
exit
int 1/1/1
apply policy BW_LIMIT_ACL in
exit
int 1/1/4
apply policy BW_LIMIT_ACL in
exit
實測結果

非對稱頻寬丟包的幾個辦法
經過上述QoS實測,一針對特定流量給與更高優先的佇列,二針對特定來源目的做頻寬限制。
Flow Control是需要流量路徑沿路啟用,在跨防火牆的環境中,部署比較不方便。
透過特定流量對應更高佇列,可舒緩短時大量造成的背景佇列緩存壓力。
二可以透過QoS進行頻寬限制,超過頻寬造成Filter增加,而不是TX Drop。
三可以針對Edge Port設定頻寬限制,避免短時大量造成硬體與佇列無法處理,稍微降低一點,使用者不會察覺到,也可以讓Server早點踩煞車。
# 只有Engress方向才會有頻寬限制
int 1/1/1
qos shape 90 percent burst 128
exit