본 문서는 장애 발생 시 신속하고 정확한 원인 분석을 위해 필요한 증적 수집 절차를 담고 있습니다.
내용 중 보완이 필요하거나 추가적인 의견이 있으시면 언제든 제안해 주시기 바랍니다.
개요
-
본 문서는 시스템 장애 발생 시, 서비스 재기동에 앞서 정확한 원인 분석을 위한 진단 데이터(증적)를 수집하고자 작성되었습니다.
-
원활한 장애 대응 및 재발 방지를 위해 아래 가이드에 따라 증적 파일을 생성하신 후, 로그프레소로 전달해 주시기 바랍니다.
-
jcmd명령어를 활용한 증적 생성은 root 권한이 필요합니다.
-
java경로는 /opt/logpresso/jre로 가정하였습니다.
이슈 별 반출 필요한 증적 파일
용량이슈로 인해 Heapdump 파일의 반출이 불가하면, heapdump와 heap histogram(Jmap) 둘 다 증적 생성 후, 우선적으로 heap histogram(Jmap) 파일 반출요청드립니다.
heap histogram(Jmap)은 경량 보고서로 상세한 누수 원인 분석에는 한계가 존재하는 점 참고 부탁드립니다.
-
공통 : araqne_log, hs_err, 성능모니터 파일 반출
-
araqne_log : 로그프레소 엔진 및 서비스 운영 과정에서 발생하는 모든 이벤트와 시스템 메시지가 기록되는 기본 운영 로그 파일
-
hs_err : 치명적인 오류로 인해 서비스가 비정상적으로 종료될 때 시스템이 자동으로 생성하는 오류 보고서, 장애 발생 시의 상황(메모리 부족, 시그널 오류 등)에 따라 생성되지 않을 수 있으며, 파일이 존재하지 않는 경우 반출할 필요 없음
-
성능 모니터 : [SNR UI] → [성능 모니터]의 문제가 되는 노드 클릭 시 나타나는 화면 전달 필요
-
-
메모리 장애 발생 : Jstack + Heapdump 반출 필요
-
로그 수집 지연 : Jstack + Heapdump 반출 필요
-
웹 페이지 접속 지연 : Jstack + Heapdump 반출 필요
-
Cpu 부하 발생 : araqne_query_logs + Jstack + jfr 반출 필요
Jstack
-
개요
-
JVM(Java Virtual Machine)의 스레드 덤프를 생성하여, 현재 실행 중인 모든 스레드의 상태와 스택 트레이스(Stack Trace) 정보를 기록
-
로그 수집 지연이나 쿼리 실행 불가와 같은 장애 발생 시, 내부 스레드의 교착 상태(Deadlock)나 무한 루프 등 근본 원인을 분석하기 위해 jstack 필요
-
-
주요 활용 사례
-
CPU 점유율 급증: 특정 스레드의 과도한 리소스 사용 및 로직 폭주 확인
-
응답 속도 저하: 특정 코드 구간에서의 스레드 점유 및 병목 현상 진단
-
시스템 정지: 스레드 간 데드락(Deadlock) 발생 여부 판별
-
-
증적 생성
-
case1) 로그프레소 셸을 통한 증적 생성
logpresso> jstack -
case2) CLI에서 직접 증적 생성
1) logpresso pid 확인 # ps -ef | grep araqne root 960172 1 68 Mar23 ? 20-16:59:39 /opt/logpresso/jre/bin/java (..중략..) 2) 증적 생성 # /opt/logpresso/jre/bin/jcmd 960172 Thread.print > /opt/logpresso/jstack_yyMMdd.txt
-
heapdump
heapdump 생성 시, 로그프레소의 적용한 heap메모리의 최대 1.5배의 증적 파일이 생성됩니다.
증적 생성 시, 디스크 용량 확보 후 진행하여야 합니다.
-
개요
-
특정 시점의 Java 가용 메모리(Heap) 상태를 전체적으로 기록한 메모리 스냅샷
-
메모리 내에 존재하는 객체 정보와 참조 관계를 포함하고 있어, 메모리 효율성을 정밀 분석하는 데 사용
-
참고: Heap Dump는 정적인 메모리 상태를 기록하므로 CPU 점유율, 스레드 상태, 시간에 따른 GC(Garbage Collection) 흐름은 포함하지 않음
-
-
주요 활용 사례
-
OutOfMemoryError(OOM) 발생: 메모리 부족으로 인해 서비스가 중단되었을 때 근본 원인을 파악하기 위함
-
메모리 누수(Memory Leak) 의심: 시간이 지남에 따라 메모리 사용량이 계속 증가하고 GC 이후에도 회수되지 않는 경우
-
객체 점유율 분석: 어떤 객체가 메모리를 과도하게 점유하고 있는지 확인하여 최적화 포인트를 찾고자 할 때 사용
-
소켓(Socket) 누수 진단: 통신 후 소켓이 정상적으로 닫히지(close) 않으면 OS 포트가 고갈되어 통신 장애가 발생
-
-
증적 생성
-
case1) 로그프레소 셸을 통한 증적 생성
logpresso> sunperf.dumpHeap [경로명]/[파일명] true logpresso> sunperf.dumpHeap /opt/logpresso/heapdump_yyyyMMdd.hprof true -
case2) CLI에서 직접 증적 생성
1) logpresso pid 확인 # ps -ef | grep araqne root 960172 1 68 Mar23 ? 20-16:59:39 /opt/logpresso/jre/bin/java (..중략..) 2) 증적 생성 # /opt/logpresso/jre/bin/jcmd 960172 GC.heap_dump -all=true /opt/logpresso/heapdump_yyyyMMdd.hprof
-
heap histogram(Jmap)
-
개요
-
힙 히스토그램은 JVM 힙 메모리 내에 존재하는 객체별 개수와 총 사용 용량을 요약하여 보여주는 경량 보고서
-
장점
-
힙 덤프(Heap Dump)에 비해 생성 속도가 매우 빠르고 용량이 작아 시스템 부하가 적음
-
메모리 점유 현황을 즉각적으로 파악하기에 최적화
-
-
한계
- 객체 간의 참조 관계를 보여주지 않으므로, 특정 객체가 메모리에서 해제되지 않는 이유(참조 체인)에 대한 상세한 누수 원인 분석에는 한계가 있을 수 있음
-
-
주요 활용 사례
-
메모리 점유 현황의 신속한 파악: 현재 메모리를 가장 많이 점유하고 있는 객체 타입과 개수를 실시간으로 확인하여 이상 징후를 진단할 때 사용
-
힙 덤프 생성 및 반출이 불가한 환경: 보안 정책이나 서버 자원 제약으로 인해 대용량의 힙 덤프 파일을 생성하거나 외부로 반출하기 어려운 경우, 텍스트 형태의 히스토그램을 통해 1차 원인 분석을 수행
-
간이 메모리 누수 점검: 특정 작업 전후로 히스토그램을 비교하여, 급격하게 숫자가 늘어나거나 줄어들지 않는 객체군을 식별하는 용도로 활용
-
-
증적 생성
-
case1) CLI에서 직접 증적 생성
1) logpresso pid 확인 # ps -ef | grep araqne root 960172 1 68 Mar23 ? 20-16:59:39 /opt/logpresso/jre/bin/java (..중략..) 2) 증적 생성 # /opt/logpresso/jre/bin/jcmd 960172 GC.class_histogram > /home/logpresso/histogram_yyMMdd.txt
-
JFR
-
개요
-
JVM 내부에서 발생하는 모든 활동(성능, 메모리, GC, 스레드, I/O 등)을 매우 낮은 오버헤드(약 1% 미만)로 지속적으로 기록하는 프로파일링 및 진단 도구
-
서비스 성능에 거의 영향을 주지 않으면서도 시스템 내부의 상세한 기록을 남기는 것이 특징
-
주요 기록 이벤트
-
메모리 및 GC: GC 발생 시점 및 소요 시간, 객체 생성률(Allocation Rate)
-
스레드 및 런타임: 스레드 상태 변화(Runnable/Blocked/Waiting), Lock 경합 현황, Safepoint 이벤트
-
시스템 자원: CPU 사용량 추이, I/O 지연(Latency), 네트워크 트래픽 정보
-
코드 실행: 특정 메서드의 호출 빈도 및 응답 시간(Method Profiling)
-
-
-
주요 활용 사례
-
복합적인 성능 문제 진단: CPU 사용량 급증, 스레드 락(Lock), GC 병목 등 다양한 성능 저하의 원인을 통합 분석할 때 사용
-
시간 축 기반의 상관관계 분석: 특정 시점에 트래픽이 몰렸을 때 메서드 호출 빈도와 응답 시간이 어떻게 변화했는지 시계열로 추적 가능
-
I/O 및 네트워크 병목 확인: 디스크 읽기/쓰기나 네트워크 통신 과정에서 발생하는 미세한 지연 시간(Latency)을 정밀하게 확인하기 위함
-
운영 환경의 상시 모니터링: 시스템 부하가 거의 없으므로, 장애 발생 시 사후 분석을 위해 실시간 기록 데이터를 확보해 두는 용도로 활용
-
-
증적 생성
-
case1) CLI에서 직접 증적 생성
1) logpresso pid 확인 # ps -ef | grep araqne root 960172 1 68 Mar23 ? 20-16:59:39 /opt/logpresso/jre/bin/java (..중략..) 2) 증적 생성(하기 예시는 60초로 설정) /opt/logpresso/jre/bin/jcmd 960172 JFR.start duration=60s settings=profile filename=/opt/logpresso/jfr_yyMMdd.jfr
-
araqne_query_logs
-
개요
- 로그프레소에서 실행한 쿼리의 이력을 확인할 수 있는 전용 테이블
-
주요 활용 사례
- 오래 동작한 쿼리나 시스템에 부하를 주는 쿼리를 확인하기 위한 목적으로 사용
-
증적 생성
-
로그프레소 UI에서 하기 쿼리 입력 후, 결과 값 저장
-
이슈가 발생한 지점에 맞춰 from, to 시간 값 변경 필요
table from=20260422 to=20260423 araqne_query_logs
-