애플리케이션 프로파일링 & 디버깅
애플리케이션 프로파일링 & 디버깅 (Application Profiling & Debugging)
Flink 애플리케이션의 로깅·프로파일링·메모리 문제 분석 방법을 설명해요. 커스텀 로깅, Java Flight Recorder, JITWatch, 힙 덤프, GC 로깅을 설정하는법을 다룹니다.
본문
Overview of Custom Logging with Apache Flink
각 독립형 JobManager, TaskManager, HistoryServer, ZooKeeper 데몬은 stdout과 stderr를 .out 파일 접미사가 붙은 파일로 리다이렉트하고, 내부 로깅은 .log 접미사가 붙은 파일에 기록해요. 사용자가 env.java.opts.all, env.java.opts.jobmanager, env.java.opts.taskmanager, env.java.opts.historyserver, env.java.opts.client에서 구성한 Java 옵션은 스크립트 변수 FLINK_LOG_PREFIX를 사용하고 나중 평가를 위해 옵션을 큰따옴표로 감싸서 로그 파일을 정의할 수도 있어요. FLINK_LOG_PREFIX를 사용하는 로그 파일은 기본 .out·.log 파일과 함께 로테이션돼요.
Profiling with Java Flight Recorder
Java Flight Recorder는 Oracle JDK에 내장된 프로파일링 및 이벤트 수집 프레임워크예요. Java Mission Control은 Java Flight Recorder가 수집한 방대한 데이터를 효율적으로 상세 분석할 수 있게 해주는 고급 도구 모음이에요. 구성 예:
env.java.opts.all: "-XX:+UnlockCommercialFeatures -XX:+UnlockDiagnosticVMOptions -XX:+FlightRecorder -XX:+DebugNonSafepoints -XX:FlightRecorderOptions=defaultrecording=true,dumponexit=true,dumponexitpath=${FLINK_LOG_PREFIX}.jfr"
Profiling with JITWatch
JITWatch는 Java HotSpot JIT 컴파일러용 로그 분석기이자 시각화 도구로, 인라이닝 결정, 핫 메서드, 바이트코드, 어셈블리를 검사하는 데 사용돼요. 구성 예:
env.java.opts.all: "-XX:+UnlockDiagnosticVMOptions -XX:+TraceClassLoading -XX:+LogCompilation -XX:LogFile=${FLINK_LOG_PREFIX}.jit -XX:+PrintAssembly"
Analyzing Out of Memory Problems
Flink 애플리케이션에서 OutOfMemoryExceptions를 만나면 out of memory 오류 시 힙 덤프를 활성화하는 것이 좋아요.
env.java.opts.all: "-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${FLINK_LOG_PREFIX}.hprof"
힙 덤프는 사용자 코드의 잠재적 메모리 누수를 분석할 수 있게 해줘요. 메모리 누수가 Flink에 의해 발생한 것이라면 dev 메일링 리스트로 문의하세요.
Analyzing Memory & Garbage Collection Behaviour
메모리 사용과 가비지 컬렉션은 애플리케이션에 깊은 영향을 줄 수 있어요. 영향은 약간의 성능 저하부터, GC 일시 중지가 너무 길면 완전한 클러스터 실패까지 다양해요. 애플리케이션의 메모리·GC 동작을 더 잘 이해하고 싶다면 TaskManagers에서 메모리 로깅을 활성화할 수 있어요.
taskmanager.debug.memory.log: true
taskmanager.debug.memory.log-interval: 10000 // 10s interval
더 상세한 GC 통계에 관심이 있다면 JVM의 GC 로깅을 다음으로 활성화할 수 있어요:
env.java.opts.all: "-Xloggc:${FLINK_LOG_PREFIX}.gc.log -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=10M -XX:+PrintPromotionFailure -XX:+PrintGCCause"