플레임 그래프

플레임 그래프 (Flame Graphs)

Flame Graphs 는 어떤 메서드가 CPU 리소스를 소비하고 있는지 등 성능 관련 질문에 효과적으로 답을 주는 시각화 도구입니다. 스택 트레이스를 여러 번 샘플링하여 구성합니다.

출처: 문서

본문

Flame Graphs 는 다음과 같은 질문에 효과적으로 답을 주는 시각화입니다:

  • 어떤 메서드가 현재 CPU 리소스를 소비하고 있는가?
  • 한 메서드의 소비량이 다른 메서드와 비교해 어떠한가?
  • 스택 상의 어떤 호출 계열이 특정 메서드를 실행하게 했는가?

Flame Graph 는 스택 트레이스를 여러 번 샘플링하여 구성됩니다. 각 메서드 호출은 막대로 표시되며, 막대의 길이는 샘플에 나타난 횟수에 비례합니다.

Flink 1.13 부터 Flame Graph 는 Flink 에서 기본적으로 지원됩니다. Flame Graph 를 생성하려면 실행 중인 작업의 job graph 로 이동해 관심 있는 operator 를 선택하고 오른쪽 메뉴에서 Flame Graph 탭을 클릭하세요.

측정 과정 자체는 필연적으로 측정 대상에 영향을 줍니다(이중 슬릿 실험 참고). CPU 스택 트레이스 샘플링도 예외는 아닙니다. 프로덕션 환경에 미치는 의도하지 않은 영향을 막기 위해 Flame Graph 는 현재 opt-in(선택적 활성화) 기능으로 제공됩니다. 활성화하려면 Flink 구성 파일 에서 rest.flamegraph.enabled: true 를 설정해야 합니다. 개발 및 사전 프로덕션 환경에서 활성화하는 것을 권장하지만, 프로덕션에서는 실험적 기능으로 취급해야 합니다.

On-CPU Flame Graph 외에도 Off-CPU 및 Mixed 시각화를 사용할 수 있으며, 창(pane) 상단의 선택기를 사용해 전환할 수 있습니다.

Off-CPU Flame Graph 는 샘플에서 발견된 blocking 호출을 시각화합니다. 다음과 같이 구분합니다:

  • On-CPU: Thread.State[RUNNABLE, NEW]
  • Off-CPU: Thread.State[TIMED_WAITING, WAITING, BLOCKED]

Mixed 모드 Flame Graph 는 모든 상태의 스레드 스택 트레이스로 구성됩니다.

샘플링 과정

스택 트레이스의 수집은 순수하게 JVM 내부에서 수행되므로, Java 런타임 내의 메서드 호출만 보입니다(시스템 호출은 제외).

Flame Graph 구성은 기본적으로 개별 operator 수준에서 수행됩니다. 즉 해당 operator 의 모든 task 스레드가 병렬로 샘플링되고 그 스택 트레이스가 결합됩니다. 병렬 task 중 하나가 리소스의 100%를 소비하고 나머지는 소비하지 않는 경우, 병목이 평균화로 인해 가려질 수 있습니다.

Flink 1.17 부터 Flame Graph 는 task 수준까지의 "drill down" 시각화를 제공합니다. 관심 있는 subtask 를 선택하면 해당 subtask 의 플레임 그래프를 볼 수 있습니다.

더 알아보기 (Learn more)