内容
前言
前提条件
需求
使用的组件
惯例
CPU
使用率较高时的症状
初始故障排除
确定原因并解决问题
由于中断而导致
CPU
使用率较高
高CPU,当启用在Cisco
7600系列路由器时的NetFlow
NDE
由于进程而导致
CPU
使用率较高
PCI
和快速内存池显示非常高的使用率
%SNMP-4-HIGHCPU
:
Process
exceeds
[dec]ms
threshold
([dec]ms
IOS
quantum)
for
[chars]
of
[chars]--result
[chars]
高CPU由于软件加密
用于获取详细信息的命令
show
processes
cpu
命令
show
interfaces
命令
show
interfaces
switching
命令
show
interfaces
stat
命令
show
ip
nat
translations
show
align
命令
show
version
命令
show
log
命令
用于定期收集数据的
UNIX
Shell
脚本
本文档介绍了
Cisco
路由器上的
CPU
使用率较高的常见原因和症状,并提供了故障排除指导原则和解决方案。
故障排除在Cisco路由器的高CPU利用率要求对Cisco
IOS软件交换路径的®
了解。 有关
Cisco
IOS
软件交换路径的信息,请参阅性能调整基础知识。
本文档不限于特定的软件和硬件版本。
有关文档规则的详细信息,请参阅
Cisco
技术提示规则。
此列表介绍了
CPU
使用率较高时的常见症状。
如果您注意到其中的任何一种症状,请按照本文档中的故障排除步骤解决问题。
一旦注意到以上任何一个症状,请执行以下操作:
使用
show
processes
cpu
命令检查 CPU
使用率较高是由于中断还是由于进程导致的。
有关详细信息,请参阅排除由于中断而导致的
CPU
使用率较高的故障。
如果 CPU
使用率的级别上升是由于出现了中断(这些中断可能是由于
CEF
交换数据包而引起的),则
CPU
使用率的级别不会影响路由器性能。
如果NetFlow为版本7配置,流由路由处理器进行,可能导致高CPU利用率。
对于故障排除高CPU利用率由于NetFlow版本7,请配置mls
nde发送方版本5,
NetFlow
Export由SP执行,是版本5或版本9的默认值。
请检查哪一个进程正在向
CPU
进行加载。
与进程相关的异常活动将导致日志中记录一条错误消息。
因此,应该首先检查
show
logging
exec
命令的输出中是否存在任何与占用大量
CPU
周期的进程有关的错误。
对于排除在执行进程时
CPU
使用率较高的故障,调试可能也很有帮助。
然而,由于调试可能导致
CPU
使用率更高,因此,执行调试时应该非常小心。
为了使调试安全且有用,应该满足以下前提条件:
排除在执行 IP
输入进程时
CPU
使用率较高的故障中提供了
IP
数据包的示例调试会话。
有关如何排除在执行特定进程时
CPU
使用率较高的故障,请访问以下相应链接:
-
ARP
输入
-“排除由于进程而导致的
CPU
使用率较高的故障”文档中的“ARP
输入”部分
-
BGP
路由器
-“排除由于
BGP
扫描程序或
BGP
路由器进程而导致的
CPU
使用率较高的故障”文档中的“由于
BGP
路由器进程而导致
CPU
使用率较高”部分
-
BGP
扫描程序
-“排除由于
BGP
扫描程序或
BGP
路由器进程而导致的
CPU
使用率较高的故障”文档中的“由于
BGP
扫描程序而导致
CPU
使用率较高”部分
-
EXEC
-
在执行
EXEC
和虚拟
EXEC
进程时
CPU
使用率较高
-
HyBridge
输入
-
在带有
ATM
接口的路由器上排除由于
HyBridge
输入进程而导致的
CPU
使用率较高的故障
-
IP
输入
-
排除由于
IP
输入进程而导致的
CPU
使用率较高的故障
-
IP
简单网络管理协议
(SNMP)
- IP
简单网络管理协议
(SNMP)
导致
CPU
使用率较高
-
LC
ADJ
更新程序
- 在
Cisco
12000
系列
Internet
路由器上执行
LC
邻接关系更新程序进程时导致
CPU
使用率较高的原因是什么?
-
TCP
计时器
-“排除由于进程而导致的
CPU
使用率较高的故障”文档中的“TCP
计时器”部分
-
TTY
后台
-“排除由于进程而导致的
CPU
使用率较高的故障”文档中的“TTY
后台”部分
-
虚拟
EXEC
-
在执行
Exec
和虚拟
Exec
进程时
CPU
使用率较高
-
Vtemplate
Backgr
-“排除由于进程而导致的
CPU
使用率较高的故障”文档中的“虚拟模板后台”部分
-
其他进程
-“排除由于进程而导致的
CPU
使用率较高的故障”文档中的“其他进程”部分
发现 PCI
和快速内存池的空闲内存不足是正常的。
PCI
内存用于为连接到
PRP 主板上
GT64260
控制器的 PCI
总线提供对该控制器的内存访问。
此内存用于系统控制器和其他部件之间的内部通信,因此其使用率总是看起来较高。
如果需要更多内存,它将退回到处理器池内存。
快速内存是留出来以供硬件接口描述符块
(IDB)
数据结构使用的少量内存。
此内存在整个启动过程中也被完全保留,由于它被充分使用,因此其使用率总是显示为较高。
由于此原因,发现快速内存池的空闲内存不足是正常的。
CPU hog
消息如下所示:
SNMP-4-HIGHCPU: Process exceeds 200ms threshold (200ms IOS quantum)
for GET of rmon.19.16.0--result rmon.19.16.0
一条新的
syslog
消息
(HIGHCPU)
已添加到
12.4(13)
版本的 IOS
中。
如果进程占用
CPU
的时间超过
200
毫秒,则它将报告
HIGHCPU
消息。
HIGHCPU
消息对路由器没有影响。
它只是告诉您哪一个进程导致
CPU
使用率较高。
HIGHCPU
消息类似于
CPUHOG
消息,但与
CPUHOG
消息相比,HIGHCPU
消息的容限阈值低得多,只占前者容限阈值时间量的
1/10,即以毫秒为测量单位。
在 2600
上运行的
12.4(13)
之前的版本中,由于
IOS
版本没有此增强功能,进程运行了较长时间也不会生成消息。
SNMP PDU
处理(MIB
对象查询)应该在单个
CPU
时间段内执行,以确保
PDU
中的每个对象都像是被同时检索的一样。
这是 SNMP
协议标准强加的要求。
某些对象是系统中许多数据的聚合,因此,即使它们是单个对象,也会由于对其进行检测的方式而涉及大量处理。
如果这些对象未按照
MIB
Instrumentation
规则的要求放弃
CPU,则可能会生成此错误消息。
另外,如果在同一对象组/表中轮询几个不同的对象,然后收到错误信息,那么其原因通常并非上面所述的原因。
总之,此消息用于识别使用的
CPU
时间多于预期时间(但仍然不是
CPUHOG)的对象。
一些
NMS/检测工具在轮询时表现不佳。
CSCsl18139(仅限注册用户)中记录了该问题。
当没有在设备安装的硬件加密模块,然后来通过设备的所有加密流量将必须由软件加密。
这非常强化中央处理。
它不是推荐使用任何加密部署的软件加密与一个合理的吞吐量需求。
一个选项解决此问题是减少运输量加密流量(请重路由流量或限制加密)的流。
然而,解决此发货的最佳方法是获得硬件加密模块安装为排除需要对于加密发生通过软件的此设备。
这些命令提供有关该问题的详细信息:
如果路由器完全无法访问,请首先对其重新加电。
然后,定期收集以上命令(show
log
命令除外,其消息应记录在
syslog
服务器上)的输出。
用于收集输出的时间间隔应为五分钟。
可以使用此
UNIX
shell 脚本手动或自动收集数据。
也可以使用
HTTP 或
SNMP
收集数据。
有关在
Cisco
路由器上配置
HTTP 和
SNMP
的详细信息,请参阅
Cisco
IOS 软件配置文档。
这是
show
processes
cpu
命令输出标题的示例:
CPU utilization for five seconds: X%/Y%; one minute: Z%; five minutes: W%
PID Runtime(ms) Invoked uSecs 5Sec 1Min 5Min TTY Process
下表说明了标题中的字段:
字段 |
说明 |
x |
过去五秒内的平均总使用率(中断 + 进程) |
Y |
过去五秒内由于中断导致的平均使用率1 |
Z |
过去一分钟内的平均总使用率2 |
W |
过去五分钟内的平均总使用率2 |
PID |
进程 ID |
运行时间 |
进程已使用的 CPU 时间(毫秒) |
调用 |
已调用进程的次数 |
uSecs |
每次调用所占用的 CPU 时间(微秒) |
5sec |
过去五秒内任务的 CPU 使用率 |
1Min |
过去一分钟内任务的 CPU 使用率2 |
5Min |
过去五分钟内任务的 CPU 使用率2 |
TTY |
控制该进程的终端 |
进程 |
进程的名称 |
1进程级别上的
CPU 使用率
= X - Y
2这些值不表示算术平均值,而表示指数衰減平均值。
因此,最近的值对计算的平均值具有更多影响。
有关
show
processes
cpu
命令的详细说明,请访问此链接。
注意: 不应将
CPU
总使用率用作一种度量路由器是否可以交换更多数据包的方法。
在 Cisco
7500
路由器上,Versatile
Interface
Processors
(VIP)
和路由/交换处理器
(RSP)
不会报告线性的
CPU 使用率。
接近每秒数据包交换能力的一半时,CPU
使用率已达到
90% 至
95%。
命令参考包含
show
interfaces
命令的详细说明。
此命令用于确定接口上的活动交换路径。
有关 Cisco
IOS
软件中的交换路径的详细信息,请参阅配置交换路径文档。
这是针对一个接口的
show
interfaces
switching
命令的示例输出:
RouterA#show interfaces switching
Ethernet0
Throttle count 0
Drops RP 0 SP 0
SPD Flushes Fast 0 SSE 0
SPD Aggress Fast 0
SPD Priority Inputs 0 Drops 0
Protocol Path Pkts In Chars In Pkts Out Chars Out
Other Process 0 0 595 35700
Cache misses 0
Fast 0 0 0 0
Auton/SSE 0 0 0 0
IP Process 4 456 4 456
Cache misses 0
Fast 0 0 0 0
Auton/SSE 0 0 0 0
IPX Process 0 0 2 120
Cache misses 0
Fast 0 0 0 0
Auton/SSE 0 0 0 0
Trans. Bridge Process 0 0 0 0
Cache misses 0
Fast 11 660 0 0
Auton/SSE 0 0 0 0
DEC MOP Process 0 0 10 770
Cache misses 0
Fast 0 0 0 0
Auton/SSE 0 0 0 0
ARP Process 1 60 2 120
Cache misses 0
Fast 0 0 0 0
Auton/SSE 0 0 0 0
CDP Process 200 63700 100 31183
Cache misses 0
Fast 0 0 0 0
Auton/SSE 0 0 0 0
该输出列出了此接口上配置的所有协议的交换路径,因此您可以很方便地查看经过路由器的数据流的类型和流量。
下表介绍了输出字段。
字段 |
定义 |
进程 |
处理的数据包。 这些数据包可能是发往路由器的数据包,或者是快速交换缓存中没有其条目的数据包。 |
Cache misses |
快速交换缓存中没有其条目的数据包。 发往此目的地的第一个数据包(或数据流,具体取决于所配置的快速交换类型)将被处理。 所有后续数据包将进行快速交换,除非传出接口上已明确禁用快速交换。 |
快速 |
快速交换的数据包。 默认情况下,快速交换处于启用状态。 |
Auton/SSE |
自主交换数据包、硅交换数据包或分布式交换数据包。 只能用于带有交换处理器或硅交换处理器(分别用于自主交换或硅交换)的 Cisco 7000 系列路由器,或者用于带有 VIP(用于分布式交换)的 Cisco 7500 系列路由器。 |
此命令是
show
interfaces
switching
命令的摘要版本。
下面是针对一个接口的示例输出:
RouterA#show interfaces stat
Ethernet0
Switching path Pkts In Chars In Pkts Out Chars Out
Processor 52077 12245489 24646 3170041
Route cache 0 0 0 0
Distributed cache 0 0 0 0
Total 52077 12245489 24646 3170041
show
interfaces
stat
命令的输出因平台而异,具体取决于可用的、已配置的交换路径。
show
ip nat
translations
命令显示路由器上处于活动状态的“网络地址转换
(NAT)”转换。
每个活动转换都会产生
CPU
中断,并会对路由器的总
CPU
使用率产生影响。
数量非常庞大的转换可能会对路由器的性能产生影响。
下面是
show ip
nat
translations
命令的示例输出:
router#show ip nat translations
Pro Inside global Inside local Outside local Outside global
--- 172.16.131.1 10.10.10.1 --- ---
只有在基于精简指令集计算
(RISC)
处理器的平台上才能使用此命令。
在这些平台上,CPU
可以对未对齐的内存读/写进行更正。
下面是部分示例输出:
Alignment data for:
4500 Software (C4500-DS40-M), Version mis-aligned RELEASE SOFTWARE (fc1)
Compiled Tue 31-Mar-98 15:05 by jdoe
Total Corrections 33911, Recorded 2, Reads 33911, Writes 0
Initial Initial
Address Count Access Type Traceback
40025F4D 15561 16bit read 0x606F4A7C 0x601C78F8 0x6012FE94 0x600102C0
40025F72 18350 32bit read 0x606FB260 0x6013113C 0x600102C0 0x60010988
对于跟踪高
CPU
使用率问题而言,此命令输出的重要部分是
Cisco
IOS
软件版本、平台、CPU
类型和路由器的正常运行时间。
命令参考提供了
show
version
命令的详细说明。
此命令显示缓冲日志消息的内容。
有关记录系统消息的详细信息,请参阅路由器配置故障排除指南中的记录系统错误消息部分。
此附录介绍了一个用于从路由器定期捕获数据的简单脚本。
脚本的核心是以下一行:
(echo "show version") | telnet 192.168.1.1
括号中的命令在子
shell
中执行,输出将发送到
Telnet
会话。
这是一个用于捕获
show
version
命令输出和
show
processes
cpu
命令输出的示例脚本:
#!/opt/local/bin/bash
###########################################
# Router's IP address
#
IP_ADDRESS='10.200.40.53'
# Directory where the log files will be stored
#
DIR=/var/log/router
########################################
if [ ! -e $DIR ]
then
mkdir $DIR
fi
# Tag specification: mmddhhmm
DATE=`date +'%m%d'`
TIME=`date +'%H%M'`
TAG=$DATE$TIME
# Collect data from the router
(echo "foo";\
echo "bar";\
echo "term len 0";\
echo "show version";\
echo "show processes cpu";\
echo "term len 15";\
echo "show memory summary";\
echo "q";\
sleep 30)|telnet $IP_ADDRESS > $DIR/info.$TAG 2>$DIR/info.$TAG.msg
注意: 在此脚本中,包括口令在内的所有数据均以明文格式发送。
在第一个部分中,您需要为日志文件指定
IP
地址和目标目录。
第二个部分包含发送到路由器的实际命令。
首先是用户名,然后是口令,等等。
还包括了一个技巧,用于仅捕获特定命令输出的前几行。
终端长度设置为较短(在本例中设为
15
行),并且“q”字符只在提示时发送。
如果数据是定期收集的,那么
show
version
的输出显示问题是否具有周期性,例如,问题是否总是在每天的特定时间或每周特定的星期几出现。
如果需要收集更多命令的输出,可以采用上述示例所示的相同方式将命令添加到脚本中。
如果需要截断发送到文件的命令输出,则首先需要延长休眠周期(休眠命令在括号中)。
如果 CPU
使用率较高的问题经常出现,但持续时间不长,请每五分钟运行该脚本一次。
否则,可以每
15 或 30
分钟运行它一次。
为了便于使用,请将该脚本保存在文件(例如
/usr/bin/router-script)中。
然后,若要每五分钟运行该脚本一次,请向
/etc/crontab
文件添加以下行:
*/5 * * * * /usr/bin/router-script
重新启动
cron
服务器。
如果您无权更改
/etc/crontab
文件,请在单独的进程中运行该脚本,如下所示:
while [ 1 ]; do ./router-script ; sleep 300; done &