의심했던 범인은 알리바이가 있었다.
백엔드
의심했던 범인은 알리바이가 있었다.
두줄요약
Jenkins 배치의 5분~12분 Hang 원인을 JFR로 추적해, 의심했던 로그 appender가 아니라 N+1 쿼리와 Aurora 읽기 지연이 범인임을 밝혀냈습니다. 운영 코드 변경 없이 JVM 옵션 한 줄로 진단하고 쿼리 통합으로 문제를 해결했습니다.
문제 상황
- Spring Batch를 Jenkins로 트리거하는 배치에서 기동 후 첫 Step 시작 전 공백이 5분~12분까지 늘어나는 간헐적 Hang 발생
- Thread dump, heap dump, APM만으로는 재현 시점의 JVM 내부 흐름과 시간 축을 함께 보기 어려운 한계 존재
- 운영 코드를 건드리지 않고 항상 켜둘 수 있는 진단 수단 필요
해결 방법
- JVM 옵션
-XX:StartFlightRecording로 JFR을 코드 변경 없이 운영에 적용 - JMC의 Threads, Socket I/O, Method Profiling으로 main 스레드의 대기 구간과 코드 경로를 추적
- 의심했던 AwsLogsAppender를 배제하고, Aurora 읽기 지연을 유발한 partition 단위 N+1 쿼리를 확인
- 쿼리 통합으로 read 횟수와 대기 시간을 줄여 Hang 원인 제거