簡介
本文檔介紹如何對基於Cisco IOS® XE的裝置(如路由器和交換機)中的記憶體問題進行故障排除,以便找到洩漏的callsite。
必要條件
基於Cisco IOS XE軟體的裝置中的記憶體管理知識。
採用元件
本文件所述內容不限於特定軟體和硬體版本。它適用於基於路由和交換Cisco IOS XE軟體的平台。
本文中的資訊是根據特定實驗室環境內的裝置所建立。文中使用到的所有裝置皆從已清除(預設)的組態來啟動。如果您的網路運作中,請確保您瞭解任何指令可能造成的影響。
背景資訊
監控裝置的生產記憶體使用率以增量遞增並確認是否期望它是非常耗時的。本檔案將說明callsite是什麼,以及它如何幫助快速排除記憶體問題。
註:本文檔主要介紹路由處理器動態隨機訪問記憶體(DRAM)記憶體使用故障排除。
什麼是Callsite?
callsite是一個標籤,由Cisco技術援助中心(TAC)用於驗證和跟蹤在Cisco IOS-XE相關進程進行記憶體分配期間正在呼叫的原始碼功能。
客戶可以在開啟TAC案例之前提供此標籤,以便更快地解決問題,並且客戶還可以通過本文稍後部分介紹的命令幫助調試它。
差異呼叫和差異位元組
Diff呼叫監視記憶體分配呼叫數和deallocations呼叫數之間的差異。通常,大量的diff呼叫可能表示與記憶體相關的問題。當存在過多的差異時,即表明系統未釋放記憶體並且分配正在累積,會發生這種情況。
使用commandshow processes memory platform accounting命令可以看到both、diff呼叫和diff位元組:
test1#show processes memory platform accounting
Hourly Stats
process callsite_ID(bytes) max_diff_bytes callsite_ID(calls) max_diff_calls tracekey timestamp(UTC)
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
sessmgrd_rp_0 F8E78C86E08C8003 1579683 E6A19D3ED0064000 12269 1#90e06c15b54d23761b2b3b480e5fd704 2025-05-28 05:30
cli_agent_rp_0 A5E99693AA3B8004 1268440 5D11C89CA87A8003 3197 1#3afb1165961ee7daf4af986e47f2f32c 2025-05-28 05:40
smand_rp_0 3DFF8F3C424F400A 918144 C34A609190E3C001 420 1#51a1581a8ac23e847e66fe8f268c66d1 2025-05-29 06:31
系統具有觸發記憶體警告和嚴重級別系統日誌的內部記憶體使用閾值。基於這些閾值的記憶體使用率百分比可使用命令show platform resources檢視。
test1#show platform resources
**State Acronym: H - Healthy, W - Warning, C - Critical
Resource Usage Max Warning Critical State
----------------------------------------------------------------------------------------------------
RP0 (ok, active) H
Control Processor 1.17% 100% 80% 90% H
DRAM 2639MB(34%) 7753MB 88% 93% H
bootflash 856MB(13%) 6338MB 88% 93% H
harddisk 0MB(0%) 0MB 88% 93% H
ESP0(ok, active) H
QFP H
TCAM 10cells(0%) 131072cells 65% 85% H
DRAM 89761KB(2%) 3670016KB 85% 95% H
IRAM 13525KB(10%) 131072KB 85% 95% H
CPU Utilization 1.00% 100% 90% 95% H
Crypto Utilization 3.00% 100% 90% 95% H
Pkt Buf Mem (0) 67KB(0%) 524288KB 85% 95% H
test1#
附註:提交TAC案例以確定差異呼叫或差異位元組是否與特定進程有關。通常,如果使用show processes memory platform sorted命令時可見的可用系統記憶體不足,則值得進一步檢查。
記憶體消耗或洩漏問題的症狀
當Cisco IOS XE端存在記憶體消耗或洩漏問題時,通常會生成警告或嚴重警報,例如:
Nov 22 11:37:16.770: %PLATFORM-4-ELEMENT_WARNING: R0/0: smand: RP/0: Used Memory value 89% exceeds warning level 88%. Top memory allocators are: Process: iomd_cc_0. Tracekey: 1#7eed26e49896115921b704a6d9780e72 Callsite ID: 4163698691 (diff_call: 395435). Process: iomd_cc_0. Tracekey: 1#7eed26e49896115921b704a6d9780e72 Callsite ID: 4163698691 (diff_call: 29). Process: btman_rp_0. Tracekey: 1#e7e4075661e7b1cbf867dc220f1b120c Callsite ID: 407738370 (diff_call: 23).
此類警報突出顯示了作為故障排除起點的重要資訊:
- 收到警報的日期和時間
- 使用百分比
- 元件受到影響
- 根據差異呼叫,系統檢測到作為頂級使用者的Top Cisco IOS XE進程。
附註:%PLATFORM-4-ELEMENT_WARNING警報未必是獲取記憶體消耗問題的根本原因分析(RCA)的最終資料點。
附註:還有其它型別的症狀和記憶體使用警報與不同的元件相關聯,例如臨時檔案系統(TMPFS)、量子流處理器(QFP)和Cisco IOS守護程式(IOSd),但是這些都不在本文檔的範圍之內。
附註:本文檔不介紹在Cisco IOS守護程式(IOSd)下指示記憶體問題的SYS-2-MALLOCFAIL系統日誌消息的故障排除。
疑難排解案例
裝置因記憶體不足而崩潰
當裝置因記憶體資源不足而崩潰時,必須在崩潰之前驗證最後日誌,以確認並檢視系統日誌消息%PLATFORM-4-ELEMENT_WARNING:R0/0:smand:RP/0:已用記憶體值X%超過警告級別Y%。
附註:請注意,由於記憶體不足,發生故障後,本地DRAM緩衝區中的系統日誌將被清除,因此需要在發生故障事件之前檢查系統日誌伺服器的歸檔日誌。如果尚未設定系統日誌伺服器,請參閱如何在Cisco IOS中配置日誌記錄。
附註:%PLATFORM-4-ELEMENT_WARNING:R0/0:smand:RP/0:崩潰事件後,已用記憶體值X%超過警告級別Y%警報。在解碼的Cisco IOS跟蹤日誌中也可以看到此事件。有關詳細資訊,請參閱使用統一日誌記錄增強功能收集和管理跟蹤日誌。
由於記憶體不足,系統發生崩潰。因此,將生成系統報告。此報告是一個.tar.gz檔案,包含可用來調查記憶體問題的相關資料。有關詳細資訊,請參閱使用系統報告進行故障排除。
解壓縮時,系統報告在tmp目錄中包含一個名為maroon stats的目錄。maroon stats是一種在代碼中實施的可維護性工具,用於跟蹤不同Cisco IOS XE進程的差異呼叫和位元組中的記憶體分配和解除位置。
系統報告中包含的maroon統計快照有助於識別潛在的責任人呼叫站點,以確定記憶體消耗或洩漏問題RCA或進一步調試它,並更好地理解它。
附註:從系統報告中解碼maroon stats目錄只能由TAC完成,因為它包含代碼的內部和機密功能,可幫助TAC工程師瞭解哪些代碼功能正在分配記憶體。請提交TAC案例並提供系統報告。
附註:請記住,系統報告提供大量資料,有助於瞭解記憶體不足導致的記憶體崩潰。但是,在某些情況下,還需要進行進一步的記憶體跟蹤、監控、調試和故障排除。
裝置尚未崩潰,但出現記憶體使用警告
命令show platform resources顯示警告和嚴重記憶體使用率閾值。
註:最佳實踐是收集與記憶體相關的輸出命令以進行進一步調試,因為根據記憶體消耗或洩漏發生的速度,裝置可能會因記憶體資源不足而崩潰。
附註:當出現記憶體使用警告時,您可以歸檔TAC案例並提供命令show tech-support和
show tech-support memory,協助TAC工程師初步診斷問題,並可能迅速找到RCA。
當裝置尚未崩潰並且正在本地系統日誌緩衝區中生成記憶體警報或通過監控工具從系統日誌伺服器接收到記憶體警報時,收集show processes memory platform的輸出,按順序排列以確定違規進程使用的位元組(如有)。
Router#show processes memory platform sorted
System memory: 4027884K total, 2580612K used, 1447272K free,
Lowest: 1447272K
Pid Text Data Stack Dynamic RSS Total Name
--------------------------------------------------------------------------------
21240 263436 858000 136 308 858000 3632460 linux_iosd-imag
27232 12877 195460 136 23592 195460 2231316 fman_fp_image
26797 90 157260 136 22308 157260 1741996 cpp_cp_svr
19194 7325 102756 136 2376 102756 1318608 fman_rp
27179 18745 242708 136 448 242708 1160248 qfp-ucode-utah
在此輸出中,檢視駐留集大小(RSS)列。這是一個指示每個Cisco IOS XE進程消耗多少千位元組的指標。
確定Callsite
接下來,收集show processes memory platform accounting的輸出,該輸出顯示了不同進程的diff呼叫和位元組值。通常,我們關注的是更大的價值。
diff呼叫位元組是確定是否存在潛在記憶體洩漏的良好指示器,因為它顯示系統在不釋放回系統的情況下仍保留著多少位元組的記憶體。
根據此資料,您可以確定來自違規進程的callsite標籤哪個具有更大的diff呼叫和位元組值。
show process memory platform accounting跟蹤這些隨時間變化的差異呼叫和位元組。在某些情況下,此命令輸出的底部會包括回溯。這對TAC工程師非常重要,因為這樣的回溯是使用內部工具解碼的,並有助於確定哪些代碼功能可能會導致潛在的記憶體洩漏。
附註:如果命令show process memory platform accounting 不能提供足夠的資訊來排除記憶體洩漏問題,則經常需要針對進程進行進一步調試。
另請參閱從本文檔調試Callsite,以獲取用於標識Callsite的輔助方法。
模組、資料庫和消息傳遞中的進程記憶體消耗
要進一步調試Cisco IOS XE進程記憶體洩漏,可能需要為特定Cisco IOS XE進程收集這些命令:
# Allocations and frees per module
show platform software memory
show platform software memory bri
# Database diff and entries statistics
show platform software memory database | ex diff:0
show platform software memory database bri | ex _0_
# Messaging diff and entries statistics
show platform software memory messaging | ex diff:0
show platform software memory messaging brief | ex _0_
這些命令輸出補充了對進程引起的記憶體洩漏的調查,並且如果初始基本分類命令不能提供足夠的資訊,則通常需要這些命令輸出。
調試Callsite
標識callsite的輔助方法是對其進行調試。需要以下命令:
debug platform software memory alloc callsite start
show platform software memory alloc callsite brief
debug platform software memory alloc backtrace start depth 10
show platform software memory alloc backtrace
第一個命令允許調試進程的呼叫站點的分配。在較新版本中,此命令預設啟用,不會對服務產生影響。
show platform software memory <process> <location> alloc callsite brief 命令提供了一個表,該表顯示該進程的呼叫站點以及每個呼叫站點的比較呼叫和位元組。例如,此處我們顯示了Cisco IOS進程的輸出,但是它可以收集用於任何其他進程:
test1# show platform software memory ios r0 alloc callsite brief
The current tracekey is : 1#b1ba773f123f8d990fd84c82c1d0e1d3
callsite thread diff_byte diff_call
----------------------------------------------------------------
3DFF8F3C424F4004 4115 57384 1
ABB2D8F932038000 4115 57360 1
3869885745FC8000 4115 16960 1
DF884D58A8EF0004 4115 8208 1
DF884D58A8EF0008 4115 8208 1
FAE69298A17B8000 4115 4243 165
FAE69298A17B8001 4115 2640 165
FAE69298A17B8002 4115 1958 12
附註:show platt soft memory <process> <location> alloc callsite bri命令必須在一段時間內執行多次,直到找到diff call或bytes column increasing,因為這將指示系統在不釋放記憶體的情況下保留此類記憶體。
識別出正在洩漏的callsite後,必須為該callsite執行debug platform software memory <process> <location> alloc backtrace start <callsite> depth 10命令。此命令可以保留原位,不影響服務。
啟用已識別的callsite的調試後,仍需要再次執行show platt soft memory <process> <location> alloc callsite bri命令,直到看到diff呼叫/位元組增加,這樣可以跟蹤代碼為該callsite分配記憶體的功能。稍後,可以使用show platform software memory <process> <location> alloc backtrace來收集回溯,例如:
show platform software memory install-manager switch active R0 alloc back
backtrace: 1#83e58872a4792de086bf7191551098d7 maroon:7FCBACB87000+4642 maroon:7FCBACB87000+579C repm_core:7FCBB1F29000+1E146 avl:7FCBB4005000+2989 repm_core:7FCBB1F29000+1DAF6 repm_core:7FCBB1F29000+1BADF repm_core:7FCBB1F29000+37BA6 repm_core:7FCBB1F29000+2A341 tdldb_assist_no_dbdm:7FCBB5EDE000+416E
callsite: 7BD5593C00E30000, thread_id: 15556
allocs: 70, frees: 0, call_diff: 70
附註:將此輸出提供給TAC以解碼回溯,然後TAC工程師可驗證代碼中的行為、判斷是否存在現有缺陷或更好地瞭解行為。如果需要,TAC可以聯絡開發團隊。
註:確保軟體是最新的。若發現新軟體缺陷,TAC可與開發者團隊合作進一步偵錯和調查情況。
相關文章和文檔