本產品的文件集力求使用無偏見用語。針對本文件集的目的,無偏見係定義為未根據年齡、身心障礙、性別、種族身分、民族身分、性別傾向、社會經濟地位及交織性表示歧視的用語。由於本產品軟體使用者介面中硬式編碼的語言、根據 RFP 文件使用的語言,或引用第三方產品的語言,因此本文件中可能會出現例外狀況。深入瞭解思科如何使用包容性用語。
思科已使用電腦和人工技術翻譯本文件,讓全世界的使用者能夠以自己的語言理解支援內容。請注意,即使是最佳機器翻譯,也不如專業譯者翻譯的內容準確。Cisco Systems, Inc. 對這些翻譯的準確度概不負責,並建議一律查看原始英文文件(提供連結)。
本文描述記憶體分配故障(MALLOCFAIL)的症狀和可能的原因,以及如何解決這些問題的詳細資訊。
本文件沒有特定需求。
本文中的資訊係根據以下軟體和硬體版本:
所有Cisco IOS®軟體版本
所有思科路由器
註:本檔案不適用於使用CatOS或MGX平台的Cisco Catalyst交換器。
本文中的資訊是根據特定實驗室環境內的裝置所建立。文中使用到的所有裝置皆從已清除(預設)的組態來啟動。如果您的網路運作中,請確保您瞭解任何指令可能造成的影響。
如需文件慣例的詳細資訊,請參閱思科技術提示慣例。
記憶體分配失敗意味著:
路由器已使用所有可用記憶體(臨時或永久),或
記憶體已分割為很小的片段,路由器無法找到可用的可用塊。處理器記憶體(由Cisco Internet Operating System [Cisco IOS]使用)或資料包記憶體(由傳入和傳出資料包使用)可能會發生這種情況。
記憶體分配失敗的症狀包括(但不限於):
控制檯或日誌消息:「%SYS-2-MALLOCFAIL:從0x6015EC84,池處理器,對齊0」分配1028位元組的記憶體失敗
拒絕的Telnet會話
無論在控制檯上鍵入什麼命令,都會顯示show processor memory命令
某些show命令沒有輸出
「Low on memory(記憶體不足)」消息
控制檯消息「Unable to create EXEC - no memory or too many processes」(無法建立EXEC — 記憶體或進程過多)
路由器掛起,無控制檯響應。
當路由器的記憶體不足時,在某些情況下,無法通過Telnet連線到路由器。此時,訪問控制檯埠來收集用於故障排除的資料非常重要。但是連線到主控台連線埠時,可以看到以下內容:
%% Unable to create EXEC - no memory or too many processes
如果您看到上一條消息,甚至沒有足夠的可用記憶體來連線控制檯。您可以通過控制檯執行一些步驟來捕獲資料。如果您幫助路由器釋放一些記憶體,控制檯可以響應,然後您就可以從路由器捕獲必要的資料以進行故障排除。
注意:如果在路由器上配置了邊界網關協定(BGP),則可以參閱實現最佳路由和減少BGP記憶體消耗以減少與此過程相關的記憶體消耗。
當主控台連線埠處於極低記憶體條件時,為了擷取資料,需要嘗試以下步驟:
從路由器的介面拔下LAN和WAN電纜。這可能會使路由器停止傳遞封包。
重新檢查控制檯。您是否能夠獲得響應並執行命令?幾分鐘後,必須有足夠的可用記憶體以允許控制檯響應。
從特權EXEC模式(Router#)中收集所需資訊。至少要收集這些命令的完整輸出:show memory allocating-process totals(或show memory summary if show memory allocating-process totals not available)、show logging,如果可能,請show technical-support。
收集完必要的資料後,重新連線所有LAN和WAN鏈路,並繼續監控路由器的記憶體使用情況。
執行show logging 命令時,您必須看到類似以下內容:
%SYS-2-MALLOCFAIL: Memory allocation of [X] bytes failed from 0x6015EC84, pool [Pool], alignment 0 -Process= "[Process]" ipl= 6, pid=5
[X] =路由器嘗試分配但找不到足夠的可用記憶體的位元組數
[Pool]指示處理器記憶體(「池處理器」)或資料包記憶體(「池I/O」)是否受影響。高端路由器(7000、7500系列)的緩衝區位於主動態隨機存取記憶體(DRAM)中,因此缺少封包記憶體可被報告為「池處理器」。7200系列和多功能介面處理器(VIP)卡還可報告封包記憶體的池通訊協定控制資訊(「池PCI」)中的錯誤。
[進程]是受記憶體不足影響的進程。
已知的問題
從快閃記憶體或Netboot載入大型Cisco IOS軟體時的已知70x0問題
通常,MALLOCFAIL錯誤由安全問題引起,例如網路中運行的蠕蟲或病毒。如果網路最近未發生更改(例如路由器Cisco IOS升級),則尤其可能是導致此問題的原因。通常,配置更改(例如向訪問清單新增其他行)可以減輕此問題的影響。思科產品安全建議與通知頁面包含有關偵測最可能的原因和特定解決方法的資訊。
如需其他資訊,請參閱:
首先,檢查下載軟體區,瞭解您執行的功能集和版本的最小記憶體大小。確保它足夠了。Cisco.com上的記憶體要求是在大多數公司網路中路由器正確工作的最低建議大小。實際記憶體需求因協定、路由表和流量模式而異。
注意:只有註冊思科使用者才能訪問內部思科資訊和工具。
如果您的Cisco裝置輸出了 show memory allocating-process totals 命令、 show memory summary 命令或show technical-support 命令(在啟用模式下),則可以使用輸出直譯器顯示潛在問題和修複方法。
注意:只有註冊思科使用者才能訪問內部思科資訊和工具。
當一個進程請求或分配記憶體,然後忘記釋放(取消分配)該記憶體時,就會發生記憶體洩漏。因此,在重新載入路由器之前,會保留記憶體塊。隨著時間的推移,該進程分配越來越多的記憶體塊,直到沒有可用記憶體。根據此時記憶體不足情況的嚴重性,您唯一的選擇是重新載入路由器,使其恢復運行。
這是Cisco Internet Operating System(Cisco IOS)錯誤。若要消除此漏洞,請升級至版本系列中的最新版本,例如如果您執行Cisco IOS軟體版本11.2(14),請升級至最新11.2(x)映像。
如果這不能解決此問題,或者您不想升級路由器,請在一段時間內定期輸入 show processes memory命令(例如,每隔幾小時或幾天輸入一次,具體取決於您的洩漏是快是慢)。檢查空閒記憶體是否繼續減少並且永遠不會返回。可用記憶體消失的速率取決於導致洩露的事件的發生頻率。由於記憶體從未被釋放,因此,如果在一段時間內獲取記憶體快照,您可以跟蹤使用記憶體的進程。請記住,不同的進程會根據需要分配和取消分配記憶體,因此您可以看到差異,但隨著洩露的繼續,您必須看到一個不斷消耗更多記憶體的進程。
註:對於邊界網關協定(BGP)或開放最短路徑優先(OSPF)路由器等某些進程而言,使用超過1 MB的記憶體是正常的;這並不意味著它們正在洩漏。
要確定佔用更多記憶體的進程,請比較時間間隔內show processes memory命令的「保持」列。有時你可以非常清楚地看到一個進程佔用了數百萬位元組的記憶體。有時需要多張快照才能找到兇手。當大量記憶體丟失時,請收集show memory allocating-process totals 命令或show memory summary 命令以進行進一步的故障排除。然後與思科技術協助中心(TAC)聯絡,並提供您收集的資訊,以及路由器的show technical-support 摘要。
使用「輸出直譯器」工具可以接收show memory allocating-process totals命令或show memory summary輸出的分析。
注意:只有註冊思科使用者才能訪問內部思科資訊和工具。
下表提供了show memory summary命令輸出的前三行:
Router>show memory summary Head Total (b) Used (b) Free (b) Lowest (b) Largest (b) Processor 60AB4ED0 5550384 2082996 3467388 3464996 3454608 I/O 40000000 16777216 1937280 14839936 14839936 14838908
總計=系統映像載入並構建其資料結構後可用的記憶體總量。
Used =當前分配的記憶體量。
Free =當前可用的記憶體量。
Lowest =自上次引導以來路由器記錄的最低可用記憶體量。
最大=當前可用的最大可用記憶體塊。
show memory allocating-process totals 命令包含的資訊與show memory summary 命令的前三行相同。
以下是您可以從show processes memory命令輸出中學到的:
Router>show processes memory Total: 3149760, Used: 2334300, Free: 815460 PID TTY Allocated Freed Holding Getbufs Retbufs Process 0 0 226548 1252 1804376 0 0 *Initialization* 0 0 320 5422288 320 0 0 *Scheduler* 0 0 5663692 2173356 0 1856100 0 *Dead* 1 0 264 264 3784 0 0 Load Meter 2 2 5700 5372 13124 0 0 Virtual Exec 3 0 0 0 6784 0 0 Check heaps 4 0 96 0 6880 0 0 Pool Manager 5 0 264 264 6784 0 0 Timers 6 0 2028 672 8812 0 0 ARP Input 7 0 96 0 6880 0 0 SERIAL A' detect 8 0 504 264 7024 0 0 ATM ILMI Input 9 0 0 0 6784 0 0 ILMI Process 10 0 136 0 6920 0 0 M32_runts pring 11 0 136 0 6920 0 0 Call drop procs 12 0 340 340 12784 0 0 ATMSIG Timer 13 0 445664 442936 13904 0 0 IP Input 14 0 2365804 2357152 17992 0 0 CDP Protocol 15 0 528 264 7048 0 0 MOP Protocols 16 0 188 0 9972 0 0 IP Background 17 0 0 1608 6784 0 0 TCP Timer 18 0 5852116 0 14236 0 0 TCP Protocols
Allocated =自路由器啟動以來進程已分配的總位元組數。
Freed =此進程已釋放的總位元組數。
暫掛=此進程當前暫掛的位元組總數。這是進行故障排除時最重要的列,因為它顯示了歸屬於此過程的實際記憶體量。保持不一定會等於Allocated減去Freed,因為某些進程分配一個記憶體塊,該記憶體塊稍後由另一個進程返回到空閒池。
*dead*進程不是真正的進程。它是用來計算在已終止的另一個進程的上下文中分配的記憶體的。分配給此進程的記憶體由核心回收,並在需要時由路由器本身返回記憶體池。這是Cisco IOS處理記憶體的方式。如果建立記憶體塊的進程退出(不再運行),則該記憶體塊被視為已死。每個塊都會跟蹤建立它的進程的地址和pid。在定期記憶體計數期間,如果排程程式從塊pid中發現的進程與塊記憶的進程不匹配,則該塊將被標籤為已死。
因此,標籤為屬於進程*Dead*的記憶體是在不再運行的進程控制下分配的。在這種狀態下擁有大量記憶體是正常的。以下是範例:
當在Telnet會話中配置網路地址轉換(NAT)時,會分配記憶體。該內存在Telnet進程(「虛擬Exec」)中記帳。終止此過程後,NAT配置的記憶體仍然在使用中。這通過*dead*進程顯示。
您可以看到記憶體分配到的環境 show memory dead
命令,在「What」列下:
Router#show memory dead Head Total(b) Used(b) Free(b) Lowest(b) Largest(b) I/O 600000 2097152 461024 1636128 1635224 1635960 Processor memory Address Bytes Prev. Next Ref PrevF NextF Alloc PC What 1D8310 60 1D82C8 1D8378 1 3281FFE Router Init 2CA964 36 2CA914 2CA9B4 1 3281FFE Router Init 2CAA04 112 2CA9B4 2CAAA0 1 3A42144 OSPF Stub LSA RBTree 2CAAA0 68 2CAA04 2CAB10 1 3A420D4 Router Init 2ED714 52 2ED668 2ED774 1 3381C84 Router Init 2F12AC 44 2F124C 2F1304 1 3A50234 Router Init 2F1304 24 2F12AC 2F1348 1 3A420D4 Router Init 2F1348 68 2F1304 2F13B8 1 3381C84 Router Init 300C28 340 300A14 300DA8 1 3381B42 Router Init
如果檢測到記憶體洩漏,而*Dead*進程似乎是消耗記憶體的進程,包括 show memory dead
在提供給思科TAC的資訊中。
這是驗證的最困難的原因之一。此問題的特徵是大量可用記憶體,但「最低」列中的值很小。在這種情況下,正常或異常事件(例如,較大的路由不穩定性)會導致路由器在短時間內使用異常大量的處理器記憶體,在此期間記憶體將耗盡。在此期間,路由器報告MALLOCFAIL。可能會發生以下情況:稍後,記憶體釋放,問題消失(例如,網路穩定)。記憶體不足也可能是由多種因素造成的,例如:
記憶體洩漏消耗了大量記憶體,然後網路不穩定將可用記憶體推為零
路由器的記憶體不足,一開始無法解決問題,但僅在發生罕見的網路事件時才會發現問題。
如果路由器未重新啟動,請輸入 show memory allocating-process totals
命令(或 show memory summary
如果 show memory allocating-process totals
不可用)並檢視前三行。日誌消息可以提供有關哪個進程佔用大量記憶體的線索:
如果記憶體使用量大是由於:
正常情況下,解決方案是安裝更多記憶體。
罕見或異常事件,請解決相關問題。然後,您可以決定為未來的「保險」購買額外的記憶體。
這種情況意味著一個進程佔用了大量的處理器記憶體,然後釋放了大部分或全部記憶體,並且記憶體片段仍然由這個進程分配,或由其他進程分配,在整個問題期間分配記憶體。如果相同事件出現多次,記憶體可以分段為非常小的塊,以至於所有需要更大記憶體塊的進程都不能獲得它們需要的記憶體量。這可能會影響路由器的操作,因為您無法連線到路由器並在記憶體碎片嚴重時得到提示。
此問題的特徵在於ACL的「最大」列(小於20,000位元組)中的值較低 show memory
命令,但「釋放」列中的值已足夠(1MB或更多),或者這兩列之間存在其他差異。由於Cisco IOS中沒有分段常式,因此當路由器的記憶體非常低時,就可能會發生這種情況。
如果懷疑記憶體分段,請關閉一些介面。這樣可以釋放分段的資料塊。如果正常工作,記憶體將正常工作,您只需新增更多記憶體即可。如果關閉介面沒有幫助,則可能是bug。最佳的行動方案是聯絡您的思科支援代表,提供您收集的資訊。
此情況可以通過錯誤消息中的過程來識別。如果進程列為<中斷級別>(如下一個示例所示),則記憶體分配失敗是由軟體問題導致的。
"%SYS-2-MALLOCFAIL: Memory allocation of 68 bytes failed from 0x604CEF48, pool Processor, alignment 0-Process=, ipl= 3"
這是Cisco Internet Operating System(Cisco IOS)錯誤。您可以使用Bug工具組搜尋與此問題相符的軟體錯誤ID。識別出軟體錯誤後,請升級至包含修正程式的Cisco IOS軟體版本,以解決問題。
注意:只有註冊思科使用者才能訪問內部思科資訊和工具。
訪問清單在按使用者使用時會消耗大量記憶體。存取清單過大,無法分類為迷你存取控制清單(ACL),現在已編譯為增強型ACL。每次發生這種情況時,TACL進程都必須啟動並處理新的ACL。這可能會導致流量根據編譯時間和可用處理時間被允許或拒絕。
已編譯的ACL必須傳送到XCM。當可用空間有限時,一旦運行記憶體,就會看到控制檯消息並啟動記憶體碎片整理程式。
解決方法如下:
使用簡明的ACL,減少可編譯為微型ACL的應用控制引擎(ACE)數量,同時降低編譯所需的記憶體消耗和進程功率。
在路由器上使用透過radius屬性filterID引用的預定義ACL。
7000路由處理器(RP)從快閃記憶體啟動映像時,它會先載入ROM映像,然後將快閃記憶體映像載入到記憶體中。舊RP只有16 MB的記憶體,而未壓縮時,版本11.0以上的Cisco IOS軟體版本的企業版大於8 MB。因此,當您從ROM載入映像,然後進行快閃記憶體載入時,7000 RP可能會耗盡記憶體,或者記憶體會在啟動過程中分段,從而使路由器出現與記憶體相關的錯誤消息。
解決方案是從配置暫存器啟用快速啟動,以便RP僅載入ROM中Cisco IOS軟體映像的最小子集,然後從快閃記憶體載入完整的Cisco IOS軟體。要啟用快速啟動,請將配置暫存器設定為0x2112。這也會加速開機程式。
使用CiscoWorks的UT Discovery功能,可能導致某些路由器的可用記憶體量變得非常小。show proc memory指令可指示「IP輸入」程式保留的大量記憶體。這是「IP輸入」進程用於正常或異常進程的大量記憶體問題的特殊情況,如果記憶體不足情況導致記憶體分段,這也會導致記憶體分段問題。
UT發現功能使網路管理站為每個已發現的子網中的所有IP傳送ping掃描。記憶體問題是由路由器上IP快速交換快取的增大引起的,因為會為每個新目標建立新的快取條目。由於用於快取中條目的掩碼取決於如何對其進行子網劃分,主網路中存在32位掩碼的地址(例如環回地址)會導致該網路的所有條目使用32位掩碼。這會導致建立大量快取條目和使用大量記憶體。
最佳解決方案是禁用UT發現。您可以通過以下步驟執行此操作:
請訪問C:\Program Files\CSCOpx\etc\cwsi\ANIServer.properties。
新增「UTPingSweep=0」。
重新啟動ANI。
這可能會導致「使用者跟蹤」表遺漏某些終端伺服器或過時(這可能是另一個名為「使用者註冊工具」的思科應用程式的問題,該應用程式依賴於UT),但是它不會影響僅使用SNMP流量的園區發現。CEF交換也可以改善這種情況(使用CEF時,IP快取是在啟動時根據路由表建立的)。如需CEF和其他可用交換路徑的詳細資訊,請參閱如何為您的網路選擇最佳路由器交換路徑。
許多其他應用程式也可能造成類似的低記憶體情況。在大多數情況下,問題的根本原因不是路由器,而是應用程式本身。通常,您必須通過檢查應用程式的配置來防止這些資料包風暴。
某些路由器(例如2600、3600和4000系列)需要最少的I/O記憶體來支援某些介面處理器。
如果路由器的共用記憶體不足,即使重新載入後也是如此,您也可以在物理上移除介面以解決此問題。
在3600系列路由器上,全域性配置命令 memory-size iomem i/o-memory-percentage
可用於重新分配用於I/O記憶體和處理器記憶體的DRAM百分比。i/o-memory-percentage允許的值為10、15、20、25(預設值)、30、40和50。I/O記憶體至少需要4 MB記憶體。
若要解決此問題,請參閱:
4000/4500/4700路由器的共用記憶體要求。
如果您有 show buffers
命令或 show technical-support
命令(在啟用模式下),您可以使用輸出直譯器顯示潛在的問題和解決方法。
注意:只有註冊思科使用者才能訪問內部思科資訊和工具。
當進程用緩衝區完成時,該進程必須釋放該緩衝區。當代碼忘記處理緩衝區,或在對資料包完成處理後忘記釋放緩衝區時,就會發生緩衝區洩漏。因此,隨著越來越多的資料包被滯留在緩衝區中,緩衝池會繼續增大。您可以通過 show buffers
指令。某些公共緩衝池必須異常大,並且可用緩衝區較少。重新載入後,您可以看到可用緩衝區的數量永遠不會接近總緩衝區的數量。
Output Interpreter工具允許您接收 show buffers
輸出。
在下面的示例中,中間緩衝區會受到影響。其 show buffers
命令指示使用了近8094個緩衝區,但沒有釋放這些緩衝區(8122總計減去28個可用緩衝區):
Public buffer pools: Small buffers, 104 bytes (total 50, permanent 50): 50 in free list (20 min, 150 max allowed) 403134 hits, 0 misses, 0 trims, 0 created 0 failures (0 no memory) Middle buffers, 600 bytes (total 8122, permanent 200): 28 in free list (10 min, 300 max allowed) 154459 hits, 41422 misses, 574 trims, 8496 created Big buffers, 1524 bytes (total 50, permanent 50): 50 in free list (5 min, 150 max allowed) 58471 hits, 0 misses, 0 trims, 0 created 0 failures (0 no memory) VeryBig buffers, 4520 bytes (total 10, permanent 10): 10 in free list (0 min, 100 max allowed) 0 hits, 0 misses, 0 trims, 0 created 0 failures (0 no memory) Large buffers, 5024 bytes (total 0, permanent 0) 0 in free list (0 min, 10 max allowed) 0 hits, 0 misses, 0 trims, 0 created 0 failures (0 no memory) Huge buffers, 18024 bytes (total 0, permanent 0): 0 in free list (0 min, 4 max allowed) 0 hits, 0 misses, 0 trims, 0 created 0 failures (0 no memory)
這是Cisco IOS軟體錯誤。升級至版本系列中的最新版本以修正已知的緩衝區洩漏錯誤(例如,如果您正在運行Cisco IOS軟體版本11.2(14),請升級至最新11.2(x)映像。如果這不起作用,或者如果無法升級路由器,請在路由器記憶體不足時針對問題池發出以下命令。這些命令可以顯示有關緩衝區內容的其他資訊:
show buffer old
顯示已分配緩衝區已超過一分鐘
show buffer pool
(small - middle - big - verybig - large - huge)
顯示指定池的緩衝區的摘要
show buffer pool
(small - middle - big - verybig - large - huge) dump
顯示使用給定池的所有緩衝區的十六進位制/ASCII轉儲。
有關其他詳細資訊,請參閱排除緩衝區洩漏故障。
此問題特定於7500系列。如果路由器的「快速」記憶體耗盡,它可以改用其主動態RAM(DRAM)。不需要執行任何操作。
trying
要刪除字首條目[IP_address]/[dec](應為[hex],實際為[hex]),請執行以下操作:IPFAST-4-RADIXDELETE:嘗試刪除字首條目[IP_address]/[dec]時出錯(應為[hex], got [hex])。錯誤消息表示路由器快速交換快取表在記憶體中已損壞。當路由器嘗試清除正常進程下的快取表或 clear ip cache
如果輸入了命令,則由於記憶體損壞,系統無法刪除條目。如果路由器無法刪除此類條目,則會報告IPFAST-4-RADIXDELETE 消息。
為了解決快取表記憶體損壞問題,需要硬重新啟動路由器。重新引導可以再次切割系統記憶體結構,並允許快速快取無損壞地重建。
%SYS-2-CHUNKEXPANDFAIL的原因:無法為TACL點陣圖擴展區塊池。No memory available錯誤消息是處理器記憶體不足,無法增加指定的區塊池。它可能是由某個進程行為異常引起的。
因應措施是定期擷取(根據問題出現的頻率)這些指令的輸出,以便監控路由器的記憶體使用情況:
show processes memory sorted
show memory statistics
show memory allocating-process totals
使用以下步驟:
檢查Cisco IOS軟體版本或功能集的記憶體要求。
如有可能,請升級至版本系列中最新的Cisco IOS軟體版本版本。
檢查用於正常或異常進程的大量記憶體。如果需要,新增更多記憶體。
檢查這是洩漏還是分段(高端路由器上的緩衝區洩漏)。
收集相關資訊並聯絡TAC。
使用以下步驟:
檢查共用記憶體要求(請參閱介面上的共用記憶體不足)。
如有可能,請升級至版本系列中最新的Cisco IOS軟體版本版本。
確定哪個緩衝區池受到影響,收集相關資訊,然後與Cisco TAC聯絡。
修訂 | 發佈日期 | 意見 |
---|---|---|
2.0 |
19-Jan-2023 |
已更新格式,已修正CCW警報。重新認證。 |
1.0 |
02-Nov-2001 |
初始版本 |