目录

简介

先决条件

要求

使用的组件

CPU 使用率较高时的症状

故障排除高CPU利用率

确定原因并解决问题

由于中断而导致 CPU 使用率较高

在思科 7600 系列路由器上启用 Netflow NDE 时 CPU 使用率高

由于进程而导致 CPU 使用率较高

PCI 和快速内存池显示非常高的使用率

%SNMP-4-HIGHCPU：进程超过[chars]的[dec]ms threshold([dec]ms IOS quantum) — 结果[chars]

软件加密造成的 CPU 使用率高

分段造成的 CPU 使用率高

用于获得详细信息的命令

show processes cpu 命令

show interfaces命令

show interfaces switching命令

show interfaces stat命令

show ip nat translations命令

show align命令

show version命令

show log命令

高CPU条件下自动数据收集的EEM脚本

使用SNMP OID的EEM脚本示例

带有CPU阈值通知消息的EEM脚本示例

启动/停止CPU配置文件的EEM脚本示例

用于定期数据收集的UNIX Shell脚本

相关信息

简介

本文档介绍思科路由器上CPU使用率较高的常见症状和原因，并提供常见问题的指导原则和解决方案。

先决条件

要求

Cisco 建议您了解以下主题：

- Cisco 路由器

- Cisco IOS®软件交换路径

有关 Cisco IOS 软件交换路径的信息，请参阅性能调整基础知识。

使用的组件

本文档不限于特定的软件和硬件版本。

本文档中的信息都是基于特定实验室环境中的设备编写的。本文档中使用的所有设备最初均采用原始（默认）配置。如果您的网络处于活动状态，请确保您了解所有命令的潜在影响。

CPU 使用率较高时的症状

此列表介绍了 CPU 使用率较高时的常见症状。如果您注意到这些症状中的任何一种，请使用本文档中提供的步骤对问题进行故障排除。

- 高百分比的  show processes cpu  命令输出.

如果您有思科设备的 show processes cpu 命令输出，可以使用思科 CLI 分析器揭示潜在问题并进行修复。

注意：要使用思科CLI分析器，您必须是注册思科用户，必须登录并启用JavaScript。

- 性能较低

- 路由器上的服务无法做出响应，例如：

- Telnet 中的响应速度缓慢，或者无法通过 Telnet 连接到路由器

- 控制台的响应速度缓慢

- 对 ping 命令做出响应的速度缓慢，或者无响应

- 路由器不将路由更新发送到其他路由器

- 缓冲区故障数高

排除CPU使用率过高故障

一旦您发现 CPU 使用率高的症状中列出的任何症状，请执行以下操作：

- 检查是否存在可能的安全问题。通常，CPU 使用率较高是由安全问题（例如网络中运行的蠕虫或病毒）引起的。如果最近没有对网络进行任何更改，则安全问题尤其可能是导致故障的原因。通常，当您向访问列表添加更多行时，配置更改可以减轻此问题的影响。 思科产品安全建议和通知包含有关检测最可能的原因和有关特定解决方法的信息。

有关其他信息，请参阅：

- 关于 Internet 威胁的 100 个问题和解答

- 思科产品安全建议和通知

- 思科威胁控制

- 确保使用thor命令 debug ，关闭路由器中的 undebug all 所有命 no debug all 令。

- 您能否在路由器 show 上发出命令？如果是，请使用以下命令立即开始收集更多 show 信息。

- 路由器是否不可访问？是否可以再现此问题？如果是，请重新启动路由器，然后在重现问题之前配置命令 scheduler interval 500 。这会将优先级较低的进程调度为每 500 毫秒运行一次，从而可为您提供运行某些命令的时间，即使 CPU 使用率为 100%，也是如此。在Cisco 7200和Cisco 7500系列路由器上，使用命 scheduler allocate 3000 1000 令。

- 路由器出现 CPU 使用率较高的症状的时间间隔是否较短且无法预测？如果是，请定期收集命令的输出 show processes cpu ，该输出显示高CPU使用率是由中断还是由某个进程引起的。使用此UNIX脚本，并根据您首先找到的内容修改此脚本，以收集进一步调查问题所需的数据。

确定原因并解决问题

使用 show processes cpu 命令检查 CPU 使用率较高是由于中断还是由于进程导致的。

由于中断而导致 CPU 使用率较高

有关详细信息，请参阅排除由于中断而导致的 CPU 使用率较高的故障。如果 CPU 使用率的级别上升是由于出现了中断（这些中断可能是由于 CEF 交换数据包而引起的），则 CPU 使用率的级别不会影响路由器性能。

在思科 7600 系列路由器上启用 Netflow NDE 时 CPU 使用率高

如果为版本7配置了NetFlow，则流由路由处理器执行，这会导致CPU使用率过高。

要对NetFlow版本7导致的CPU使用率过高进行故障排除，请配置 mls nde sender 版本5，因为NetFlow导出由SP执行，这是版本5或版本9的默认设置。

由于进程而导致 CPU 使用率较高

检查哪个进程加载CPU。与进程相关的异常活动将导致日志中记录一条错误消息。因此 show logging exec ，必须首先检查命令输出，查找与消耗大量CPU周期的进程相关的任何错误。

可以使用debug命令对这些进程中的CPU使用率过高进行故障排除。执行debug命令时必须非常谨慎，因为它会进一步提高CPU利用率。为了安全地使用debug命令，必须满足以下必备条件：

- 必须禁用除缓冲区日志记录之外的所有日志记录目标，或者必须使用适当的命令将其日志记录严重性级别从7（调试）降至6（信息）或更低 logging destination [ severity-level ]  configuration 值。要查看启用了哪些日志记录目标和相应级别，请阅读命令的 show logging exec 标题行。

- 必须增加日志记录缓冲区大小才能捕获足够的信息。有关详细信息，请参阅命令说 logging buffer global configuration 明。

- 为了能够更好地读取和理解调试，必须启用日期时间和毫秒时间戳。有关详细信息，请参阅命令说 service timestamps global configuration 。

排除因输入进程导致的CPU使用率较高的故障中提供了IP数据包的调试会话示例。

要对特定进程中的CPU使用率过高进行故障排除，请参阅：

- ARP输入 — 文档排除由于进程而导致的CPU使用率较高的故障中的ARP输入部分。

- BGP路由器 — 排除由BGP扫描程序或BGP路由器进程引起的高CPU故障文档中的“由于BGP路由器进程而导致CPU使用率过高”部分。

- BGP 扫描程序 -“排除由于 BGP 扫描程序或 BGP 路由器进程而导致的 CPU 使用率较高的故障”文档中的“由于 BGP 扫描程序而导致 CPU 使用率较高”部分.

- EXEC - EXEC和虚拟EXEC进程中的CPU使用率高。

- HyBridge Input — 对带ATM接口的路由器上的HyBridge输入进程导致的CPU使用率过高进行故障排除。

- IP Input — 由于IP输入进程而导致的CPU使用率过高故障排除。

- IP简单网络管理协议(SNMP)- IP简单网络管理协议(SNMP)导致高CPU利用率。

- LC ADJ 更新程序 - 在 Cisco 12000 系列 Internet 路由器上执行 LC 邻接关系更新程序进程时导致 CPU 使用率较高的原因是什么？

- TCP计时器 — 文档排除由于进程而导致的CPU使用率较高的故障中的TCP计时器部分。

- TTY Background — 文档“排除由于进程而导致的CPU使用率较高的故障”的TTY Background部分。

- 虚拟EXEC — 请参阅EXEC链接。在Exec和虚拟Exec进程的高CPU利用率.

- Vtemplate Backgr — 文档排除由于进程而导致的CPU使用率较高的故障中的虚拟模板背景部分。

- SSH Process — 如果它捕获或启用调试show tech，则可能进入高位。

- 其他进程 — 文档的其他进程部分，排除由于进程而导致的CPU使用率较高的故障。

PCI 和快速内存池显示非常高的使用率

发现 PCI 和快速内存池的空闲内存不足是正常的。PCI 内存用于为连接到 PRP 主板上 GT64260 控制器的 PCI 总线提供对该控制器的内存访问。此内存用于系统控制器和其他部件之间的内部通信，因此其使用率总是看起来较高。

如果需要更多内存，它将退回到处理器池内存。快速内存是留出来以供硬件接口描述符块 (IDB) 数据结构使用的少量内存。此内存在整个启动过程中也被完全保留，由于它被充分使用，因此其使用率总是显示为较高。由于此原因，发现快速内存池的空闲内存不足是正常的。

%SNMP-4-HIGHCPU：进程超过[chars]的[dec]ms threshold([dec]ms IOS quantum) — 结果[chars]

CPU hog 消息如下所示：

SNMP-4-HIGHCPU: Process exceeds 200ms threshold (200ms Cisco IOS quantum)

for GET of rmon.19.16.0--result rmon.19.16.0

12.4(13)中向Cisco IOS添加了新系统日志消息(HIGHCPU)。如果进程占用 CPU 的时间超过 200 毫秒，则它将报告 HIGHCPU 消息。HIGHCPU 消息对路由器没有影响。它只是告诉您哪一个进程导致 CPU 使用率较高。HIGHCPU 消息类似于 CPUHOG 消息，但与 CPUHOG 消息相比，HIGHCPU 消息的容限阈值低得多，只占前者容限阈值时间量的 1/10，即以毫秒为测量单位。在2600上12.4(13)之前的版本中，进程运行时间更长，但是没有生成消息，因为Cisco IOS版本没有此增强功能。

SNMP PDU 处理（MIB 对象查询）应该在单个 CPU 时间段内执行，以确保 PDU 中的每个对象都像是被同时检索的一样。这是 SNMP 协议标准强加的要求。某些对象是系统中许多数据的聚合，因此，即使它们是单个对象，也会由于对其进行检测的方式而涉及大量处理。如果这些对象未按照 MIB Instrumentation 规则的要求放弃 CPU，则可能会生成此错误消息。另外，如果在同一对象组/表中轮询几个不同的对象，然后收到错误信息，那么其原因通常并非上面所述的原因。

此消息用于确定所用 CPU 时间比预期多（但尚未耗费过多 CPUH）的对象。一些 NMS/检测工具在轮询时表现不佳。此问题记录在思科漏洞ID CSCsl18139中。

注意：只有注册的思科用户才能访问内部工具和漏洞信息。

软件加密造成的 CPU 使用率高

当设备未安装硬件加密模块时，所有经过加密的流量都必须由软件加密。这会使用非常多的 CPU。对于任何具有合理吞吐量要求的加密部署，建议不要使用软件加密。要解决此问题，一种选择是减少加密流量（重新路由流量或限制加密的流）。但是，解决此问题的最好办法是为此设备安装硬件加密模块，避免使用软件进行加密。

注意：如果在隧道/物理接口上启用加密映射，则会导致内存消耗过程，并可能导致CPU增加。

分段造成的 CPU 使用率高

如果CPU必须重组大量数据包，则重组会使CPU运行率非常高。

要排除由于分段而导致的CPU使用率较高的故障，请在接口上发出tcp mss-adjust 1400命令，该命令设置通过路由器的TCP同步/启动(SYN)数据包的最大分段大小(MSS)值。

用于获得详细信息的命令

这些命令提供有关该问题的详细信息：

- show processes cpu

- show interfaces

- show interfaces switching

- show interfaces stat

- show ip nat translations

- show align

- show version

- show log

有关show命令的详细信息，请参阅Cisco IOS配置基础命令参考。

如果路由器完全无法访问，请首先对其重新加电。然后，定期收集此部分中命令的输出(命令除外 show log )，该命令的消息必须记录在syslog服务器上。收集输出的间隔必须为五分钟。您可以使用此UNIX shell脚本手动或自动收集数据。您还可以使用HTTP或SNMP收集数据。

命show processes cpu 令

以下是命令报头的示例 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

Runtime

进程已使用的 CPU 时间（毫秒）

Invoked

已调用进程的次数

uSecs

每次调用所占用的 CPU 时间（微秒）

5Sec

过去五秒内任务的 CPU 使用率

1Min

过去一分钟内任务的 CPU 使用率^2

5Min

过去五分钟内任务的 CPU 使用率^2

TTY

控制该进程的终端

Process

进程的名称

1 进程级 CPU 使用率 = X - Y

2 这些值并非算术平均值，而是以指数方式衰减的平均值。因此，最近的值对计算的平均值具有更多影响。

有关详细信息，请参阅show commands参考指南。

注:CPU总利用率不能用于衡量路由器交换更多数据包的能力。在 Cisco 7500 路由器上，Versatile Interface Processors (VIP) 和路由/交换处理器 (RSP) 不会报告线性的 CPU 使用率。接近每秒数据包交换能力的一半时，CPU 使用率已达到 90% 至 95%。

命show interfaces令

此命令用于确定活动接口。

命show interfaces switching令

此命令用于确定接口上的活动交换路径。

以下是用于一个接口的命令 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

输出列出了接口上配置的所有协议的交换路径，因此您可以轻松查看流经路由器的流量类型和数量。下表介绍了输出字段。

字段

定义

Process

处理的数据包。这些数据包可能是发往路由器的数据包，或者是快速交换缓存中没有其条目的数据包。

Cache misses

快速交换缓存中没有其条目的数据包。此目标（或流 — 取决于配置的快速交换类型）的第一个数据包被处理。除非在传出接口上明确禁用快速交换，否则所有后续数据包都会进行快速交换。

Fast

快速交换的数据包。默认情况下，快速交换处于启用状态。

Auton/SSE

自主交换数据包、硅交换数据包或分布式交换数据包。只能用于带有交换处理器或硅交换处理器（分别用于自主交换或硅交换）的 Cisco 7000 系列路由器，或者用于带有 VIP（用于分布式交换）的 Cisco 7500 系列路由器。

命 show interfaces stat 令

此命令是该命令的摘要版 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 令

命令 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      ---              ---

命 show align 令

只有在基于精简指令集计算 (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

命 show version 令

要跟踪CPU使用率较高的问题，要从命令输出中获取的重要信息包括Cisco IOS软件版本、平台、CPU类型和路由器的正常运行时间。命令参考对此命令进行了详细说明。

命 show log 令

此命令显示缓冲日志消息的内容。

高CPU条件下自动数据收集的EEM脚本

当发生高CPU使用率情况时，可以使用嵌入式事件管理器自动收集数据。  EEM通过监控进程利用率的SNMP OID或监控CPU threshold命令输出的系统日志消息触发。可通过EEM脚本执行各种show命令，并将输出保存到文件系统。

使用SNMP OID的EEM脚本示例

此脚本在进程利用率增加约85%时执行。

有关详细信息，请参阅如何使用SNMP收集Cisco IOS设备上的CPU使用率。

event manager applet high-cpu

!

event snmp oid 1.3.6.1.4.1.9.9.109.1.1.1.1.3 get-type next entry-op gt entry-val 85 poll-interval 5 exit-time 500 maxrun 600

!

action 0.1 cli command "enable"

action 0.2 syslog msg "TAC - Capturing high cpu information to flash:"

action 0.3 cli command "term length 0"

action 1.1 cli command "show process cpu sorted | redirect flash:eem-cpu1.txt"

action 1.2 cli command "show interface | redirect flash:eem-interface1.txt"

action 1.3 cli command "show interface stats | redirect flash:eem-stat1.txt"

action 1.4 cli command "show ip traffic | redirect flash:eem-traffic1.txt"

action 4.1 syslog msg "TAC - Finished logging information to separate eem files in flash"

action 9.4 cli command "end"

action 9.5 cli command "term default length"

!

!

end

带有CPU阈值通知消息的EEM脚本示例

EEM和CPU threshold notifications命令的组合可以触发EEM脚本。在本示例中，当利用率在5秒间隔内上升超过85%时，将生成CPURISHINGTHRESHOLD系统日志消息。  EEM脚本可以触发系统日志消息，并执行保存到文件系统上的文件的命令列表。

process cpu threshold type total rising 85 interval 5

!

event manager applet high-cpu

event syslog pattern "CPURISINGTHRESHOLD"

action 0.1 syslog msg "EEM: HIGH CPU detected. Writing info to flash:eem-log.txt"

action 0.2 cli command "enable"

action 0.3 cli command "term exec prompt timestamp"

action 0.4 cli command "term len 0"

action 1.1 cli command "show process cpu sorted | append flash:eem-log.txt"

action 1.2 cli command "show proc mem sorted | append flash:eem-log.txt"

action 1.3 cli command "show mem alloc total | append flash:eem-log.txt"

action 2.2 syslog msg "EEM: Self-removing applet from configuration..."

action 2.5 cli command "end"

!

end

启动/停止CPU配置文件的EEM脚本示例

EEM用于启动/停止CPU分析以及记录来自各种show命令的数据。有关详细信息，请参阅由于中断引起的高CPU使用率故障排除。

event manager applet High_CPU

event snmp oid 1.3.6.1.4.1.9.9.109.1.1.1.1.4.1 get-type exact entry-op ge entry-val "75" exit-time 10 poll-interval 5

action 0.1 syslog msg "CPU Utilization is high"

action 0.2 cli command "enable"

action 0.4 cli command "show version | append flash:CPU_Profile.txt"

action 0.4 cli command "show log | append flash:CPU_Profile.txt"

action 0.5 cli command "show process cpu sorted | append flash:CPU_Profile.txt"

action 0.6 cli command "show interfaces | append flash:CPU_Profile.txt"

action 0.7 cli command "show region | append flash:CPU_Profile.txt"

action 1.2 cli command "profile 4000F000 42C9FFFF 4"

action 1.3 cli command "profile start"

action 2.3 syslog msg "Entering TCLSH"

action 2.4 cli command "tclsh"

action 2.5 cli command "after 240000"

action 2.6 cli command "exit"

action 2.9 syslog msg "Exiting TCLSH"

action 3.0 cli command "profile stop"

action 3.1 cli command "show profile terse | append flash:CPU_Profile.txt"

action 3.2 cli command "clear profile"

action 3.3 cli command "unprofile all"

action 4.1 syslog msg "Finished logging information to flash:CPU_Profile.txt..."

action 4.2 cli command "end"

用于定期数据收集的UNIX Shell脚本

本附录介绍一种定期从路由器捕获数据的简单脚本。脚本的核心是以下一行：

(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 can 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 地址和目标目录。第二个部分包含发送到路由器的实际命令。首先是username，然后是password，依此类推。为了仅捕获某些命令输出的第一行，此命令将包括在内。终端长度设置为较短（在本例中设为 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 &

相关信息

- Catalyst 2900XL/3500XL 交换机上的 CPU 使用率过高

- 性能调整基础知识

- 思科技术支持和下载