目錄

簡介

必要條件

需求

採用元件

CPU使用率高的症狀

排除CPU使用率高故障

確定原因並解決問題

由於中斷而導致CPU使用率高

在Cisco 7600系列路由器上啟用NetFlow NDE時高CPU

由於進程導致的CPU使用率高

PCI和FAST記憶體池顯示非常高的利用率

%SNMP-4-HIGHCPU：進程超過[chars]（字元）的[dec]ms閾值（[dec]ms IOS量） — 結果[字元]

軟體加密導致的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指令碼

相關資訊

簡介

本文檔描述了Cisco路由器上CPU使用率較高的常見症狀和原因，並針對常見問題提供了指導原則和解決方案。

必要條件

需求

思科建議您瞭解以下主題：

- 思科路由器

- Cisco IOS®軟體交換路徑

有關Cisco IOS軟體交換路徑的資訊，請參閱效能調整基礎知識。

採用元件

本文件所述內容不限於特定軟體和硬體版本。

本文中的資訊是根據特定實驗室環境內的裝置所建立。文中使用到的所有裝置皆從已清除（預設）的組態來啟動。如果您的網路運作中，請確保您瞭解任何指令可能造成的影響。

CPU使用率高的症狀

此清單介紹了CPU使用率較高的常見症狀。如果您注意到這些症狀中的任何一個，請使用本文檔中提供的步驟對問題進行故障排除。

- 高百分比的  show processes cpu  命令輸出。

如果您的Cisco裝置輸出了 show processes cpu命令，則可以使用Cisco CLI Analyzer顯示潛在問題和修復程式。

註：要使用Cisco CLI Analyzer，您必須是已註冊的Cisco使用者，必須登入並啟用JavaScript。

- 效能緩慢

- 路由器上的服務無法響應，例如：

- Telnet響應緩慢或無法Telnet到路由器

- 控制檯響應緩慢

- 對ping的響應緩慢或無響應

- 路由器不向其它路由器傳送路由更新

- 高緩衝區故障

排除CPU使用率高故障

一旦您發現任何CPU使用率高的症狀中的症狀:

- 檢查是否有可能的安全問題。通常，高CPU利用率是由網路運行的安全問題（如蠕蟲或病毒）造成的。如果網路最近未發生更改，則這很可能是導致此問題的原因。通常，當您在存取清單中增加額外線路時，變更組態會減輕此問題的影響。 思科產品安全建議和通知包含有關檢測最可能的原因和特定解決方法的資訊。

如需其他資訊，請參閱：

- 有關Internet威脅的100個問題解答

- 思科產品安全建議與通知

- 思科威脅控制

- 確保全部  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的級別不會影響路由器效能。

在Cisco 7600系列路由器上啟用NetFlow NDE時高CPU

如果為版本7配置了NetFlow，則路由處理器將執行流，這會導致CPU使用率高。

要排除由於NetFlow版本7而導致的CPU使用率較高的問題，請配置mls和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  指令。

- 為了能夠更好地讀取和理解調試，必須啟用datetime和毫秒時間戳。有關詳細資訊，請參閱 service timestamps global configuration  指令。

疑難排解IP輸入過程中的CPU使用率過高中提供了IP資料包的調試會話示例。

要排查特定進程中的高CPU使用率問題，請參閱：

- ARP輸入 — 文檔排除由於進程導致的CPU使用率過高故障中的ARP輸入部分。

- BGP路由器 — 文檔疑難解答由BGP掃描器或BGP路由器進程引起的高CPU過程中，由於BGP路由器進程而導致的高CPU。

- BGP Scanner — 文檔「Troubleshooting High CPU caused by the BGP Scanner or BGP Router Process」中的「High CPU due to BGP Scanner」部分。

- EXEC - EXEC和虛擬EXEC進程中的CPU使用率高。

- HyBridge Input — 對具有ATM介面的路由器上的HyBridge輸入進程導致的CPU使用率過高進行故障排除。

- IP Input — 由於IP輸入過程而導致CPU使用率過高的故障排除。

- IP簡易網路管理通訊協定(SNMP)- IP簡易網路管理通訊協定(SNMP)導致CPU使用率高。

- LC ADJ Updater - Cisco 12000系列Internet路由器上LC鄰接更新程式進程中的CPU使用率高的原因是什麼？

- TCP計時器 — 文檔排除由於進程導致的CPU使用率高故障中的TCP計時器部分。

- TTY Background — 排除由於進程導致的CPU使用率高的故障文檔的TTY Background部分。

- 虛擬EXEC — 檢視EXEC連結。Exec和虛擬Exec進程中的CPU使用率高。

- Vtemplate Backgr -排除由於進程而導致的CPU使用率過高的文檔中的「虛擬模板背景」部分。

- SSH進程 — 如果捕獲到 show tech 或啟用調試。

- 其他進程 — 文檔的「其他進程」部分，對由於進程而導致的CPU使用率過高進行故障排除。

PCI和FAST記憶體池顯示非常高的利用率

PCI和快速記憶體池的可用記憶體不足是正常現象。PCI記憶體用於訪問連線到它的PCI匯流排的PRP主機板上的GT64260控制器的記憶體。此記憶體用於系統控制器和其他部件之間的內部通訊，因此其使用率似乎一直很高。

如果需要更多記憶體，它將回退到處理器池記憶體。快速記憶體是預留給硬體介面描述符塊(IDB)資料結構使用的少量記憶體。此記憶體會在整個開機過程中完全保留，因此由於記憶體已完全使用，因此它會一直顯示為高。因此，快速記憶體池的可用記憶體不足是正常現象。

%SNMP-4-HIGHCPU：進程超過[chars]（字元）的[dec]ms閾值（[dec]ms IOS量） — 結果[字元]

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消息類似，但HIGHCPU消息的容差閾值要低得多，其時間比CPUHOG消息的1/10（即，以毫秒為單位）。在2600上低於12.4(13)的版本中，這些程式執行的時間更長，但沒有產生訊息，因為Cisco IOS版本沒有此增強功能。

SNMP PDU處理（MIB對象查詢）應該以單個CPU時間週期執行，以確保像同時一樣檢索PDU中的每個對象。這是SNMP通訊協定標準所規定的要求。有些對象是系統中大量資料的集合，因此，即使它們是單個對象，由於它們被檢測的方式而涉及大量處理。如果它們沒有按照MIB指令插入規則的要求放棄CPU，則可能會出現此錯誤消息。此外，如果輪詢同一對象組/表中的多個不同對象並收到錯誤消息，則不會因為同一原因而出現異常。

此消息用於標識使用比預期多CPU時間（但仍不是CPUHOG）的對象。某些NMS/檢測工具在輪詢時表現不佳。此問題已記錄在Cisco錯誤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

運行時

進程已使用的CPU時間（毫秒）

已呼叫

已呼叫進程的次數

秒

每次呼叫的CPU時間微秒

5秒

過去五秒內按任務顯示的CPU使用率

1分鐘

前一分鐘按任務顯示的CPU使用率^2

5分鐘

過去五分鐘內任務的CPU使用率^2

TTY

控制進程的終端

流程

進程名稱

1進程級別的CPU利用率= X - Y

2值不是算術平均值，而是指數衰減平均值。因此，較新的值對計算的平均值有較大的影響。

有關詳細資訊，請參閱show commands reference guide。

註:CPU總使用率不得用於衡量路由器交換更多資料包的能力。在Cisco 7500路由器上，多功能介面處理器(VIP)和路由/交換處理器(RSP)不報告線性CPU使用率。接近一半的每秒交換資料包功率來自90%到95%的CPU利用率。

其 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

輸出列出了介面上配置的所有協定的交換路徑，因此您可以輕鬆檢視通過路由器的流量型別和數量。下表說明了輸出欄位。

欄位

定義

流程

已處理的資料包。這些封包可以是目的地為路由器的封包，或是快速交換快取中不存在專案的資料包。

快取未命中數

快速交換快取中沒有條目的資料包。此目的地的第一個封包（或流量 — 取決於已設定的快速交換型別）已處理。除非在傳出介面上明確禁用快速交換，否則所有後續資料包都會進行快速交換。

快速

快速交換資料包。預設情況下啟用快速交換。

奧頓/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閾值命令輸出的系統日誌消息觸發的。可以通過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閾值通知命令的組合可以觸發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地址和目標目錄。第二部分包含傳送到路由器的實際命令。第一個是使用者名稱，然後是密碼，依此類推。為了隻捕獲某些命令輸出的前幾行，該選項將包括在內。終端長度設定為短整型（本例中為15），而「q」字元僅通過提示傳送。

如果定期收集資料，  show version  顯示問題是否具有週期性，例如，它是否總是出現在一天中的某個時間或在一週中的某個特定日期。如果您需要收集更多命令的輸出，可以按照與示例中所示相同的方式將它們新增到指令碼中。如果需要截斷傳送到檔案的輸出，請首先增大休眠週期（括弧中為sleep命令）。

如果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使用率高

- 效能調整基礎知識

- 思科技術支援與下載