简介
本文档介绍如何对基于Cisco IOS® XE的设备(如路由器和交换机)中的内存问题进行故障排除,以便找到泄漏呼叫点。
先决条件
在基于Cisco IOS XE软件的设备中具备内存管理知识。
使用的组件
本文档不限于特定的软件和硬件版本。它适用于基于路由和交换思科IOS XE软件的平台。
本文档中的信息都是基于特定实验室环境中的设备编写的。本文档中使用的所有设备最初均采用原始(默认)配置。如果您的网络处于活动状态,请确保您了解所有命令的潜在影响。
背景信息
监控设备的生产内存使用率以增量递增并确认是否预期会耗时。本文档介绍什么是callsite,以及它如何帮助快速排除内存问题。
注意:本文档主要介绍路由处理器动态随机访问内存(DRAM)内存使用率故障排除。
什么是Callsite?
Callsite是思科技术支持中心(TAC)使用的标记,用于验证和跟踪在Cisco IOS-XE相关进程进行内存分配期间调用源代码的哪些功能。
客户可以在打开TAC案例之前提供此标记,以便更快地解决问题,并且客户还可以通过本文稍后部分介绍的命令帮助调试它。
差异呼叫和差异字节
Diff调用监控内存分配调用数和deallocations调用数之间的差异。通常,大量diff调用可能表示与内存相关的问题。当存在过量的差异时,会发生这种情况,表明系统未释放内存且分配正在累积。
使用show processes memory platform accounting命令可同时查看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).
此类警报会突出显示重要的信息,作为故障排除的起点:
- 收到警报的日期和时间
- 使用百分比
- 组件受到影响
- 根据不同的呼叫,系统检测到的排名靠前的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 tracelogs中看到。有关详细信息,请参阅使用统一日志记录增强功能收集和管理跟踪日志。
由于内存不足,系统发生崩溃。因此,将生成系统报告。此报告是一个.tar.gz文件,其中包含可用于调查内存问题的相关数据。有关详细信息,请参阅使用系统报告进行故障排除。
解压缩时,系统报告在tmp目录中包含一个名为maroon stats的目录。maroon stats是一种在代码中实施的适用性工具,可跟踪不同调用和字节中不同思科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 call bytes是确定是否存在潜在内存泄漏的良好指示符,因为它显示系统仍保留多少字节的内存的进程而没有释放回系统。
根据此数据,您可以确定哪个是来自违规进程的callsite标记,该标记具有更大的diff调用和字节值。
show process memory platform accounting跟踪这些随时间变化的差异调用和字节。在某些情况下,此命令输出的底部会包含回溯。这对TAC工程师非常重要,因为这样回溯是使用内部工具解码的,并且有助于确定代码哪些功能可能导致潜在的内存泄漏。
注意:如果命令show process memory platform accounting未提供足够的信息来排除内存泄漏问题,则经常需要对进程进行进一步调试。
另请参阅本文档中的Debug the 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
识别呼叫站点的辅助方法是对其进行调试。需要以下命令:
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 plat soft memory <process> <location> alloc callsite bri必须随着时间多次执行,直到找到diff call或bytes列增加,因为这将指示系统保留此类内存而不释放它。
一旦识别出正在泄漏的callsite,就必须为该呼叫站点执行debug platform software memory <process> <location> alloc backtrace start <callsite> depth 10命令。此命令可以保留原位,不会影响服务。
在启用已标识callsite的调试后,仍然需要再次执行show plat soft memory <process> <location> alloc callsite bri命令,直到看到diff calls/bytes increases,这样才能跟踪代码为该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可以与开发团队一起进一步调试和调查情况。
相关文章和文档