1. 과도한 SQL Fetch의 의한 OOME 발생 사례
원인
•
대량의 SQL Fetch를 수행해 가용 Heap 메모리를 소진하여, 그에 따라 Full GC가 발생해 어플리케이션 수행이 지연된 경우
어플리케이션 수행 → 대량의 SQL Fetch 수행 → 힙메모리 소진 → Full GC/OOME 발생 → 어플리케이션 수행 지연
모니터링 확인
•
모니터링 툴에서 액티브 트랜잭션의 건수가 매우 높고, 힙메모리가 부족한 현상을 확인할 수 있음
•
힙 메모리 여유량이 지속적으로 줄어드는 시점의 애플리케이션 내용을 확인
해결 방안
•
튜닝되지 않은 쿼리의 튜닝
•
장기간의 데이터 조회쿼리 튜닝
2. Full GC 수행에 따른 애플리케이션 슈행 지연 발생
원인
•
특정 애플리케이션이 SQL 호출 시에 대량의 결과 Row를 Fetch하여 JVM 힙 메모리를 소진시킨 사례
•
Full GC 수행시에 STW(Stop The World)에 의한 애플리케이션 수행 중단과 수행시간 지연
어플리케이션 수행 → 대량의 SQL Fetch 수행 → 힙메모리 소진 → Full GC 발생 → 어플리케이션 수행 지연
모니터링 확인
•
응답지연 모니터링
•
응답지연 구간의 성능 모니터링을 통해서 메모리 점유 원인 확인
해결 방안
•
수행중인 SQL 텍스트 및 바인드값을 추출해 담당자에게 전달
주의점
•
패치 회수가 과도하게 높다으면 항상 힙 메모리를 많이 점유한다고 생각할 수 있지만 이는 아님
◦
ResultSet의 컬럼 개수가 적고 컬럼의 크기가 작다면 메모리 점유가 크지 않을 수 있기 때문
•
보다 정확한 원인 분석을 위해서는 APM에서 제공하는 메모리 누수 추적 기능이나 힙 덤프 분석 등을 활용하는 것도 한 방법
3. 특정 오브젝트의 메모리 과다 사용으로 인한 OOME 발생
원인
•
특정 오브젝트의 메모리 과다 보유로 OOME가 발생
어플리케이션 수행 → 특정 Object 메모리 점유 → 힙메모리 소진 → Full GC 발생 → 어플리케이션 수행 지연
모니터링 확인
•
성능 추이 분석에서 Full GC가 발생했음에도 old영역 메모리 해제가 되지 않으며 서비스 지연 발생을 확인
•
old영역의 사용량이 급격하게 증가하며 Full GC가 지속적으로 발생
•
메모리 누수의 원인이되는 오브젝트가 GC대상이 되지 않는 경우를 의심
•
트랜잭션 상세 화면을 통해서 콜스택을 분석
해결
•
로직 수행 중 에러가 발생한 경우에 사용한 오브젝트 정리 로직 구현
•
사용이 끝난 Object가 GC 대상에서 누락되지 않도록 정리하는 로직 구현
4. 소켓 타임아웃에 의한 서비스 지연발생 사례
원인
•
외부 환경의 영향을 받아 애플리케이션 수행이 지연된 경우로 네트워크 구간에서 발생된 이슈에 의한 성능 지연
어플리케이션 수행 → UI 프레임워크 통신지연 → 어플리케이션 수행 지연 → Socket Timeout Exception 발생
모니터링 확인
•
트랜잭션 조회 화면에서 Exception이 발생한 어플리케이션만 필터링해 확인
•
스택 트레이스로 Exception의 명확한 원인 분석
•
발생한 Exception의 Root Cause 내용을 살펴보면 Socket Read Timeout을 확인
해결
•
UI 전송지연이 판별되었으니 방어코드를 추가하여 문제를 사전에 예방하고 성능지연이나 장애를 즉각 파악하도록 노력
5. Exception이 발생하며 서비스 수행에 실패
원인
•
SQL수행 관련 메소드에서 이셉션이 발생하여 애플리케이션의 수행이 실패
어플리케이션 수행 → SQL 수행 메소드에서 NPE 에러 발생 → 어플리케이션 정상 수행 실패
모니터링 확인
•
트랜잭션 조회 화면에서 Exception이 발생한 어플리케이션만 필터링해 확인
•
스택 트레이스로 Exception의 명확한 원인 분석
•
발생한 Exception의 Root Cause 내용을 살펴보면 NPE을 확인
해결
•
객체가 제대로 생성되지 않은 상태에서 참조하려고 한건지 확인
•
객체의 초기화가 잘못되었는지 확인