本產品的文件集力求使用無偏見用語。針對本文件集的目的,無偏見係定義為未根據年齡、身心障礙、性別、種族身分、民族身分、性別傾向、社會經濟地位及交織性表示歧視的用語。由於本產品軟體使用者介面中硬式編碼的語言、根據 RFP 文件使用的語言,或引用第三方產品的語言,因此本文件中可能會出現例外狀況。深入瞭解思科如何使用包容性用語。
思科已使用電腦和人工技術翻譯本文件,讓全世界的使用者能夠以自己的語言理解支援內容。請注意,即使是最佳機器翻譯,也不如專業譯者翻譯的內容準確。Cisco Systems, Inc. 對這些翻譯的準確度概不負責,並建議一律查看原始英文文件(提供連結)。
本文檔描述了Cisco路由器上CPU使用率較高的常見症狀和原因,並針對常見問題提供了指導原則和解決方案。
思科建議您瞭解以下主題:
有關Cisco IOS軟體交換路徑的資訊,請參閱效能調整基礎知識。
本文件所述內容不限於特定軟體和硬體版本。
本文中的資訊是根據特定實驗室環境內的裝置所建立。文中使用到的所有裝置皆從已清除(預設)的組態來啟動。如果您的網路運作中,請確保您瞭解任何指令可能造成的影響。
此清單介紹了CPU使用率較高的常見症狀。如果您注意到這些症狀中的任何一個,請使用本文檔中提供的步驟對問題進行故障排除。
高百分比的 show processes cpu
命令輸出。
如果您的Cisco裝置輸出了 show processes cpu命令,則可以使用Cisco CLI Analyzer顯示潛在問題和修復程式。
註:要使用Cisco CLI Analyzer,您必須是已註冊的Cisco使用者,必須登入並啟用JavaScript。
效能緩慢
路由器上的服務無法響應,例如:
Telnet響應緩慢或無法Telnet到路由器
控制檯響應緩慢
對ping的響應緩慢或無響應
路由器不向其它路由器傳送路由更新
高緩衝區故障
一旦您發現任何CPU使用率高的症狀中的症狀:
檢查是否有可能的安全問題。通常,高CPU利用率是由網路運行的安全問題(如蠕蟲或病毒)造成的。如果網路最近未發生更改,則這很可能是導致此問題的原因。通常,當您在存取清單中增加額外線路時,變更組態會減輕此問題的影響。 思科產品安全建議和通知包含有關檢測最可能的原因和特定解決方法的資訊。
如需其他資訊,請參閱:
debug
確保您的路由器中的所有命令都使用or命 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的級別由於可能由CEF交換資料包導致的中斷而提高,則CPU的級別不會影響路由器效能。
如果為版本7配置了NetFlow,則路由處理器將執行流,這會導致CPU使用率高。
要排除由於NetFlow版本7而導致的CPU使用率較高的故障,請配置 mls nde sender 版本5,因為NetFlow匯出由SP執行,這是版本5或版本9的預設設定。
檢查哪個進程載入了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
。
Troubleshoot High CPU Utilization due to Input Process中提供了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和快速記憶體池的可用記憶體不足是正常現象。PCI記憶體用於訪問連線到它的PCI匯流排的PRP主機板上的GT64260控制器的記憶體。此記憶體用於系統控制器和其他部件之間的內部通訊,因此其使用率似乎一直很高。
如果需要更多記憶體,它將回退到處理器池記憶體。快速記憶體是預留給硬體介面描述符塊(IDB)資料結構使用的少量記憶體。此記憶體會在整個開機過程中完全保留,因此由於記憶體已完全使用,因此它會一直顯示為高。因此,快速記憶體池的可用記憶體不足是正常現象。
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使用率較高的問題,請在介面上發出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參考指南。
註: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是通過監控進程利用率的SNMP OID或通過監控CPU閾值命令輸出的系統日誌消息觸發的。可以通過EEM指令碼執行各種show命令,並將輸出儲存到檔案系統。
當進程利用率增加大約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
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
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"
本附錄介紹一個用於定期從路由器捕獲資料的簡單指令碼。該指令碼的核心是以下行:
(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 &
修訂 | 發佈日期 | 意見 |
---|---|---|
2.0 |
30-Nov-2022 |
更新的格式。重新認證。 |
1.0 |
14-Dec-2001 |
初始版本 |