CISCO Catalyst 6500交換機配置ERSPAN造成CPU高的問題以及解決辦法

軟硬件平臺

硬件平臺: Catalyst 6500 系列交換機

當前,支持ERSPAN的硬件爲Supervisor 720 配置 PFC3 (其中PFC3A需要硬件版本號爲3.2或以上)。

硬件平臺: Catalyst 6500 系列交換機

問題描述

和傳統的SPAN一樣,ERSPAN能夠將SPAN源接口的流量複製到目的接口上,但是ERSPAN更吸引人的地方在於,被監控接口和目標接口可以在不同的網絡設備上,利用IP GRE隧道,使得用戶可以跨越3層網絡進行遠程多臺設備的診斷和鏡像工作。

圖1對比了本地SPAN (Local SPAN),遠程SPAN (RSPAN)和ERSPAN的區別:

CISCO <wbr>Catalyst <wbr>6500交換機配置ERSPAN造成CPU高的問題以及解決辦法

ERSPAN的配置並不複雜,但是在配置的過程中,如果稍不注意,可能會導致Catalyst 6500 系列交換機CPU高的問題。本文就其中兩個最典型的ERSPAN造成高CPU的場景進行分析,並給出解決辦法。

故障診斷步驟

場景 1

在ERSPAN的目的設備上,發現CPU高,而且絕大部分的CPU是中斷(interrupt)高(X%/Y%,其中X代表CPU的總數值,Y代表 中斷,如果Y值很高,則表示中斷造成了CPU高的現象,其佔據了CPU利用率的絕大部分)。例如我們看到下面的CPU進程輸出,中斷爲90%,中斷數值過 高一般意味着有過多的流量流向了CPU,進行了軟件轉發。

6506#show proc cpu CPU utilization for five seconds: 99%/90%; one minute: 99%; five minutes: 99%

通過檢查配置,我們發現,在ERSPAN的源設備上,其源會話的配置完全正確:

6506(config)#monitor session 1 type erspan-source 6506(config-mon-erspan-src)#source vlan 10 6506(config-mon-erspan-src)#destination 6506(config-mon-erspan-src-dst)#ip address 10.100.100.1 6506(config-mon-erspan-src-dst)#erspan-id 16506(config-mon-erspan-src-dst)#origin ip address 10.10.10.1 6506(config-mon-erspan-src-dst)#exit 6506(config-mon-erspan-src)#no shut 6506(config-mon-erspan-src)#exit

但是在ERSPAN的目的設備上,只在loopback 0接口下配置了目的IP地址,並沒有ERSPAN目的會話的相關配置(或者可能錯誤的刪除掉了相關配置):

6509e(config)#interface loopback0 6509e(config-if)#ip address 10.100.100.1 255.255.255.255

這便是造成ERSPAN目的設備CPU高的根本原因。如果在源設備上,ERSPAN的源會話配置完畢並且已經激活,該會話就會把抓到的數據包發向 ERSPAN的目的接口。而在目的設備上,目的ip地址已經配置完畢且接口是開啓狀態,但是ERSPAN的目的會話功能並沒有被激活,因此從源設備過來的 ERSPAN流量會直接流向目的設備的CPU,造成CPU中斷過高。爲了避免這樣的問題,則需要相應的在目的設備上增加ERSPAN目的會話的相關配置, 來終結去向CPU的ERSPAN流量。事實上,推薦的最簡潔的目的會話配置可以是隻包括目的會話ID以及IP地址的配置,例如:

6509e(config)#monitor session 1 6509e(config-mon-erspan-dst)#source 6509e(config-mon-erspan-dst-src)#ip address 10.100.100.1

由此可見,如果ERSPAN目的設備的目的會話配置有誤或者不完全,則會造成目的設備高CPU現象。爲了避免該問題,較合理的配置順序爲先在目的設備上配置ERSPAN會話終結功能,再配置ERSPAN源設備。

場景 2

在ERSPAN的源設備上,CPU高,且中斷高。

首先,檢查相關配置,發現源和目的會話的配置都正確,如下:

ERSPAN源會話配置:

6506(config)#monitor session 1 type erspan-source 6506(config-mon-erspan-src)#source vlan 10 6506(config-mon-erspan-src)#destination 6506(config-mon-erspan-src-dst)#ip address 10.100.100.1 6506(config-mon-erspan-src-dst)#erspan-id 16506(config-mon-erspan-src-dst)#origin ip address 10.10.10.1 6506(config-mon-erspan-src-dst)#exit 6506(config-mon-erspan-src)#no shut 6506(config-mon-erspan-src)#exit

ERSPAN目的會話配置:

6509e(config)#monitor session 1 type erspan-destination 6509e(config-mon-erspan-dst)#destination int gig 7/25 6509e(config-mon-erspan-dst)#source 6509e(config-mon-erspan-dst-src)#ip address 10.100.100.1 6509e(config-mon-erspan-dst-src)#erspan-id 1 6509e(config-mon-erspan-dst-src)#exit 6509e(config-mon-erspan-dst)#no shut 6509e(config-mon-erspan-dst)#exit

於是我們可以在ERSPAN源設備上通過使用Netdr抓取流向CPU的數據包:

6506#debug netdr capture rx 6506#no debug netdr capture rx 6506#show netdr captured-packets

通過 show netdr captured-packets 的輸出,我們發現,絕大多數去CPU的數據包都是長度大於1500 byte的GRE數據包,並且DF位爲1。

------- dump of incoming inband packet -------

interface NULL, routine draco2_process_rx_packet_inline dbus info: src_vlan 0x3FE(1022), src_indx 0x7FFD(32765), len 0x600(1536) bpdu 0, index_dir 0, flood 0, dont_lrn 0, dest_indx 0x380(896) 08020C00 03FE0000 7FFD0006 00280000 002F0000 00000000 429F0000 03800000 mistral hdr: req_token 0x0(0), src_index 0x7FFD(32765), rx_offset 0x76(118) requeue 0, obl_pkt 0, vlan 0x3FE(1022) destmac 00.1F.CA.1D.5E.00, srcmac 0A.0B.0C.0D.0E.0F, protocol 0800 protocol ip: version 0x04, hlen 0x05, tos 0x00, totlen 1518, identifier 1023 df 1, mf 0, fo 0, ttl 255, src 10.10.10.1, dst 10.100.100.1, proto 47

通過檢查接口配置發現,其接口的MTU配置爲1500 byte。

一般來說,Catalyst 6500交換機會把超過接口MTU值而造成MTU檢測失敗的數據包發到CPU進行分片或產生ICMP不可達信息。ERSPAN的源設備不會對MTU檢測失 敗的ERSPAN數據包進行分片處理。實際上,源設備把ERSPAN的數據包的DF位置爲1,防止該數據包在ERSPAN的全程路徑上進行分片處理。而且 ERSPAN的目的會話也不會對分片了的數據包進行重組。因此,如果ERSPAN數據包的大小超過了接口的MTU數值,導致MTU檢測失敗,該數據包會被 發往CPU,最終被丟棄。

ERSPAN可以支持的最大3層數據包的大小爲9202 byte。因此,爲了不造成MTU檢測失敗,導致CPU高和數據包的丟棄,就需要在ERSPAN的路徑上的所有接口上配置足夠大的MTU數值。對於3層以 太接口,可以配置的MTU範圍爲64 byte到9216 byte。因此,對於ERSPAN,推薦的MTU配置爲9216 byte,且該MTU數值應該應用於從ERSPAN的源設備到目的設備中間經過的所有接口上。

當然,對於MTU檢測失敗造成CPU高的問題,我們也可以通過使用命令mls rate-limit all mtu-failure rate(例如,可以將rate數值設爲10 pps)來限制由於超過接口MTU值而流向CPU的數據包的數量,但是這樣做只能緩解CPU的壓力,並不能防止超出MTU的ERSPAN數據包丟失。
發佈了153 篇原創文章 · 獲贊 29 · 訪問量 36萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章