行情資料走的是 IPv4 多播。今天用兩個多播群組,先看交換器在什麼條件下會洪泛,再讓兩個群組同時爆量,看出口佇列會發生什麼事。
exanic-measure 只能送廣播,frame 裡沒有 IP 表頭,送不了多播。所以改用 Python 的 raw socket 自己組 frame:目的 MAC 用多播位址 01:00:5e:01:01:01,裡面包 IPv4/UDP,目的 IP 是群組位址。這條路走 kernel,單一 port 可以送到接近線速。
兩個 port 各送 10 萬個到 239.1.1.1:

Et1、Et2 各收進 10 萬個,交換器把每一批都轉到 VLAN 裡另外兩個 port,Et3 兩批都收到,沒有人訂閱的 Et2 也照收。
接著讓 Et3 那台主機用 socket 加入 239.1.1.1。交換器學到了,卻在 Port-List 的 Et3 前面打了 *:

再送一次,這次 port0 送 239.1.1.1、port1 送 239.1.1.2,各 10 萬個。只有 Et3 訂了 239.1.1.1,Et2 的 OutMcastPkts 還是多了約 10 萬,跟沒人訂閱時一樣。
圖中警告的意思是這台的 snooping 要有 querier 才會生效。show igmp snooping querier(這台交換器的指令不加 ip)查不到 querier,show ip igmp snooping vlan <VLAN> 一直是 IGMP snooping pruning active : False、Flooding traffic to VLAN : True。一般的認知是沒有 querier,訂閱記錄過期後才退回洪泛;這台是一開始就不照訂閱表送。
這個 VLAN 沒有 SVI,要先建一個,再給 querier 一個位址:
configure terminal
interface Vlan<VLAN>
ip address 192.0.2.254/24
exit
ip igmp snooping vlan <VLAN> querier address 192.0.2.254
ip igmp snooping vlan <VLAN> querier
end

設完之後,pruning active 變成 True。再送一次同樣的流量,三次的 OutMcastPkts 增量放在一起看:
| 條件 | Et2(沒訂閱) | Et3 |
|---|---|---|
| 沒人訂閱、沒有 querier | +100030 | +200029 |
| Et3 訂了 239.1.1.1、沒有 querier | +100016 | +200016 |
| Et3 訂了 239.1.1.1、交換器當 querier | +12 | +100012 |
Et2 的增量從 10 萬掉到 12 個,那 12 個是 64 bytes 的控制封包。239.1.1.1 只送給有訂的 Et3,沒人訂的 239.1.1.2 誰都沒收到。
行情最麻煩的是開盤那一刻,好幾個群組同時爆量,全部擠向同一個 port。這次讓 port0、port1 在同一個時刻分別送 239.1.1.1、239.1.1.2。這幾輪沒開 querier,兩個群組都洪泛到 Et3,Et3 就像同時訂了兩個群組的主機,一個 10G 出口接兩條;Et1、Et2 各只收一條,當對照組。
同樣的條件跑了兩輪,數字都落在下表範圍內。丟掉的封包是每組另外再跑一次讀的,Et1、Et2 的 discards 一直是 0。
| 每條 burst(個) | 送完需要 | LANZ 最長佇列(segments) | 擁塞持續 | Et3 丟掉的封包 |
|---|---|---|---|---|
| 100 | 0.13 ms | 沒有紀錄 | — | 0 |
| 200 | 0.25 ms | 658~780 | 194~251 µs | 0 |
| 500 | 0.63 ms | 1722~1955 | 0.9~1.0 ms | 0 |
| 1000 | 1.3 ms | 3682~3708 | 2.2 ms | 0 |
| 2000 | 2.7 ms | 5616~5617 | 4.1~4.2 ms | 333 |
| 5000 | 6.6 ms | 5619~5620 | 7.9~8.2 ms | 3382 |
碰到上限時,LANZ 記到的是 5616~5620,比 status 的 5615 多一點。

封包數一樣,佇列深很多:同樣 1000 個,Day 18 總量只略超過 10G,佇列只到 710 segments,今天約 3700,2000 個就碰上限。差在超出出口的量,今天兩條都在 8.9 Gbit/s 以上,加起來將近出口的兩倍。
LANZ 先看接訂閱主機的出口,一台主機訂的群組同時爆量,佇列就堆在它那個 port。沒有 querier 時,多播會灑到整個 VLAN,每個 port 都要看,爆量那幾輪的 Et3 就是這樣塞到丟包。
訂閱表(show ip igmp snooping groups)平常很穩定,定期存一份跟基線比,群組或 port 對不上,就查是哪台主機上下線、還是有人改了設定。Port-List 出現 *,就是 snooping 沒生效、正在洪泛。
每個多播 VLAN 都要查得到一台 querier:show igmp snooping querier 要有一筆,show ip igmp snooping vlan <VLAN> 的 pruning active 要是 True。巡檢時查一次,動到 VLAN、SVI、上游路由器或交換器重開之後再查。這次的 querier 設定沒存進 startup-config,交換器一重開就沒了,整個 VLAN 又會洪泛,所以 pruning active 從 True 變 False 就要告警。
計數器看 OutMcastPkts 的增量。沒訂閱的 port 平常只有 STP、LLDP 這類零星的控制封包,增量跟行情進來那個 port 的 InMcastPkts 差不多,就是被洪泛了,對照表裡沒有 querier 時的 Et2 就是這樣。
明天用這兩天量到的數字,談 microburst 的告警門檻怎麼定。