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的区别:
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 1 6506(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 1 6506(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数据包丢失。