目录

简介

先决条件

使用的组件

背景信息

什么是Callsite?

差异呼叫和差异字节

内存消耗或泄漏问题的症状

故障排除情况

设备因内存不足而崩溃

设备尚未崩溃，但出现内存使用警告

确定Callsite

模块、数据库和消息传送中的进程内存消耗

调试Callsite

相关文章和文档

简介

本文档介绍如何对基于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可以与开发团队一起进一步调试和调查情况。

相关文章和文档

- ASR 1000系列路由器内存故障排除指南

- 检查IOS-XE内存使用情况

- 通过EEM报告内存使用问题

- Cisco 4000系列ISR内存故障排除指南