소개
이 문서에서는 Cisco IOS® XE 기반 디바이스에서 라우터 및 스위치와 같은 누수 콜사이트의 메모리 문제를 해결하는 방법에 대해 설명합니다.
사전 요구 사항
Cisco IOS XE 소프트웨어 기반 장치의 메모리 관리에 대한 지식
사용되는 구성 요소
이 문서는 특정 소프트웨어 및 하드웨어 버전으로 한정되지 않습니다. 라우팅 및 스위칭 Cisco IOS XE 소프트웨어 기반 플랫폼에 적용됩니다.
이 문서의 정보는 특정 랩 환경의 디바이스를 토대로 작성되었습니다. 이 문서에 사용된 모든 디바이스는 초기화된(기본) 컨피그레이션으로 시작되었습니다. 현재 네트워크가 작동 중인 경우 모든 명령의 잠재적인 영향을 미리 숙지하시기 바랍니다.
배경 정보
델타 증가를 위해 디바이스의 프로덕션 메모리 사용을 모니터링하고 예상 여부를 확인하는 데 시간이 많이 걸립니다. 이 문서에서는 콜사이트의 정의 및 메모리 문제를 신속하게 해결하는 방법에 대해 설명합니다.
참고: 이 문서는 주로 라우팅 프로세서 DRAM(Dynamic Random-Access Memory) 메모리 사용량 문제 해결에 초점을 맞춥니다.
Callsite란?
Callsite는 Cisco TAC(Technical Assistance Center)에서 Cisco IOS-XE 관련 프로세스에서 메모리 할당을 수행하는 동안 어떤 소스 코드 기능이 호출되는지 확인하고 추적하는 데 사용하는 태그입니다.
고객은 더 신속한 해결을 위해 TAC 케이스를 열기 전에 이 태그를 제공할 수 있으며, 이 문서의 뒷부분에 나오는 명령을 통해 디버깅하는 데 도움을 받을 수도 있습니다.
차등 통화 및 차등 바이트
Diff 호출은 메모리 할당에 대한 호출 수와 deallocations 간의 차이를 모니터링합니다. 일반적으로 diff 통화의 양이 많으면 메모리 관련 문제가 발생할 수 있습니다. 이는 과도한 양의 div가 있을 때 발생합니다. 이는 시스템이 메모리를 해제하지 않고 할당이 누적되고 있음을 나타냅니다.
diff 호출과 diff 바이트는 모두 commandshow processes memory platform accounting으로 확인할 수 있습니다.
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
시스템에는 메모리 경고 및 위기 레벨 syslog를 트리거하는 내부 메모리 사용량 임계값이 있습니다. 이러한 임계값을 기반으로 한 메모리 사용의 백분율은 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 케이스를 제출하여 diff 호출 또는 diff 바이트가 특정 프로세스에 관한 것인지 확인합니다. 일반적으로 명령 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는 diff 호출을 기준으로 해당 시스템이 상위 소비자로 탐지한 프로세스를 처리합니다.
참고: %PLATFORM-4-ELEMENT_WARNING 경보는 메모리 소비 문제의 RCA(근본 원인 분석)를 얻기 위한 결정적인 데이터 요소가 아닙니다.
참고: TMPFS(Temporal File System), QFP(Quantum Flow Processor) 및 Cisco IOS 데몬(IOSd)과 같은 서로 다른 구성 요소와 관련된 다른 유형의 증상 및 메모리 사용량 경보는 있지만 이 문서의 범위에 포함되지 않습니다.
참고: 이 문서에서는 Cisco IOS 데몬(IOSd)에서 메모리 문제를 나타내는 SYS-2-MALLOCFAIL syslog 메시지의 트러블슈팅을 다루지 않습니다.
문제 해결 시나리오
메모리 부족으로 인해 디바이스가 충돌했습니다.
메모리 리소스가 부족하여 디바이스가 충돌하는 경우 syslog 메시지 %PLATFORM-4-ELEMENT_WARNING을(를) 확인하고 확인하려면 충돌 전에 마지막 로그를 확인해야 합니다. R0/0 smand: RP/0: 사용된 메모리 값 X%가 경고 수준 Y%를 초과합니다.
메모리가 부족하여 시스템에 충돌이 발생했습니다. 결과적으로 시스템 보고서가 생성됩니다. 이 보고서는 메모리 문제를 조사하는 데 사용할 수 있는 관련 데이터가 포함된 .tar.gz 파일입니다. 자세한 내용은 시스템 보고서를 사용하여 문제 해결을 참조하십시오.
압축을 풀면 시스템 보고서에 maroon stats라는 디렉토리가 tmp 디렉토리에 포함되어 있습니다. Maroon 통계는 서로 다른 Cisco IOS XE 프로세스에 대한 diff 통화 및 바이트에서 메모리 할당 및 거래 위치를 추적하는 코드로 구현된 서비스 기능 기능입니다.
시스템 보고서 내에 포함된 마룬 통계 스냅샷은 잠재적 범인 콜사이트를 식별하여 메모리 소비 또는 누출 문제 RCA를 확인하거나 더 디버깅하고 더 잘 이해할 수 있도록 합니다.
참고: 시스템 보고서에서 마룬 통계 디렉토리를 디코딩하는 것은 TAC 엔지니어가 어떤 코드 기능이 메모리를 할당하는지 파악하는 데 도움이 되는 내부 및 기밀 코드 기능을 포함하기 때문에 TAC에서만 수행할 수 있습니다. TAC 케이스를 접수하고 시스템 보고서를 제공하십시오.
참고: 시스템 보고서는 메모리 부족으로 인한 메모리 충돌을 이해하기 위해 충분한 양의 데이터를 제공하지만, 경우에 따라 추가 메모리 추적, 모니터링, 디버그 및 문제 해결이 필요합니다.
디바이스가 아직 충돌하지 않았지만 메모리 사용 경고가 있습니다.
이 명령은 플랫폼 리소스를 표시하고 경고 및 한계 메모리 사용량 임계값을 표시합니다.
참고: 메모리 소비 또는 누수가 발생할 수 있는 속도에 따라, 메모리 리소스가 부족하여 디바이스가 충돌할 위험이 있으므로, 메모리 관련 출력 명령을 수집하여 더 디버깅하는 것이 좋습니다.
참고: 메모리 사용 경고가 표시되면 TAC 케이스를 제출하고 show tech-support 명령을 제공할 수 있습니다.
TAC 엔지니어가 초기에 문제를 분류하고 RCA를 신속하게 찾을 수 있도록 도와주는 기술 지원 메모리를 보여 줍니다.
디바이스가 아직 crash하지 않았고 로컬 syslog 버퍼에 메모리 경보를 생성하거나 모니터링 툴을 통해 syslog 서버에서 수신하는 경우, 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(Resident Set Size) 열을 확인합니다. 각 Cisco IOS XE 프로세스에서 사용하는 킬로바이트 수를 나타냅니다.
Callsite 식별
그런 다음 show processes memory platform accounting의 출력을 수집합니다. 이는 서로 다른 프로세스의 diff 통화 및 바이트 값을 보여 줍니다. 보통 우리는 더 큰 가치에 초점을 맞춥니다.
diff call bytes는 시스템에서 다시 릴리스되지 않고 프로세스에 의해 시스템에 남아 있는 메모리 바이트 수를 표시하므로 잠재적인 메모리 누수가 있는지 여부를 확인하는 데 좋은 지표입니다.
이 데이터를 기반으로 diff 통화 및 바이트 값이 더 큰 문제의 프로세스에서 callsite 태그가 무엇인지 식별할 수 있습니다.
show process memory platform accounting은 이러한 차등 통화와 바이트를 시간에 따라 추적합니다. 이 명령 출력의 맨 아래에 백트레이스가 포함되는 경우도 있습니다. 이는 내부 툴을 사용하여 백트레이스를 디코딩하므로 TAC 엔지니어에게 중요하며, 어떤 코드 기능이 잠재적 메모리 누수를 일으킬 수 있는지 확인하는 데 도움이 됩니다.
참고: show process memory platform accounting 명령이 메모리 누수 문제를 해결하는 데 필요한 정보를 충분히 제공하지 않는 경우 프로세스에 대한 추가 디버깅이 필요한 경우가 많습니다.
또한 호출 사이트를 식별하기 위한 보조 메서드에 대해서는 이 문서의 호출 사이트 디버그를 참조하십시오.
모듈, 데이터베이스 및 메시징의 프로세스 메모리 소비
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 명령은 해당 프로세스에 대한 callsites와 각 callsite에 대한 diff 호출 및 바이트를 보여 주는 테이블을 제공합니다. 예를 들어, 여기서는 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가 있으면 해당 Callsite에 대해 debug 플랫폼 소프트웨어 메모리 <process> <location> alloc backtrace start <callsite> depth 10 명령을 실행해야 합니다. 이 명령은 그대로 둘 수 있으며 서비스에 영향을 주지 않습니다.
식별된 callsite의 디버그를 활성화한 후 diff 호출/바이트가 증가할 때까지 show plat soft memory <process> <location> alloc callsite bri 명령을 다시 실행하면 해당 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는 개발자 팀과 협력하여 상황을 더 디버깅하고 조사할 수 있습니다.
관련 문서 및 문서