Flame 그래프

Cloud Profiler는 Flame 그래프를 사용하여 프로파일링 데이터를 표시합니다. 트리 및 그래프와 달리 Flame 그래프는 많은 양의 정보를 작고 읽기 쉬운 형식으로 표시하여 화면 공간을 효율적으로 사용합니다.

Flame 그래프를 설명하기 위해 이 페이지에서는 트리를 Flame 그래프로 변환하는 방법을 보여주고 Flame 그래프의 주요 특징을 간략하게 설명합니다.

Flame 그래프 만들기

트리에서 Flame 그래프를 만들려면 다음 다이어그램에 설명된 단계를 완료합니다.

Flame 그래프 만들기

  1. 함수 호출을 나타내는 화살표를 트리에서 삭제합니다.

  2. 각 트리 노드를 프레임으로 바꿉니다.

    프레임 모양은 직사각형이며 모든 프레임의 높이는 동일합니다. 이 페이지의 예시에서는 프레임에 명명된 함수가 사용하는 총 CPU 시간에 따라 프레임 너비가 결정됩니다.

    다음 테이블에는 각 함수의 의사 코드가 설명되어 있습니다. 자체 CPU 시간은 함수 실행 중에 수행된 CPU를 많이 사용하는 작업으로 정의됩니다.

    함수 의사 코드 자체 CPU 시간
    (초)
    총 CPU 시간
    (초)
    
    func main():
         foo1()
         foo2()
         // CPU intensive work
         // for 2 seconds 
    2 4 + 3 + 2 = 9
    
    func foo1():
         bar()
         // CPU intensive work
         // for 1.5 seconds 
    1.5 2.5 + 1.5 = 4
    
    func foo2():
         bar()
         // CPU intensive work
         // for 0.5 seconds 
    0.5 2.5 + 0.5 = 3
    
    func bar():
         // CPU intensive work
         // for 2.5 seconds
    2.5 2.5

  3. 다음 단계로, 호출 시퀀스를 유지하면서 프레임과 왼쪽 맞춤 프레임 사이의 세로 공간을 없앱니다. 원하는 경우 색 구성표를 정의하고 이러한 정의에 따라 프레임 색상을 지정할 수 있습니다. 예를 들어 패키지, 총 CPU 시간, 자체 CPU 시간 또는 다른 측정항목을 기준으로 프레임 색상을 지정할 수 있습니다.

    과도한 공백을 없애고 자체 CPU 시간별로 프레임 색상을 지정한 Flame 그래프는 다음과 같습니다.

    Flame 그래프의 상세 이미지

    이제 foo2로 시작하는 호출 스택이 foo1 프레임 옆에 있더라도 foo1foo2의 호출 스택이 유지된다는 점에 주목하세요.

요약

위의 간단한 예시로 알 수 있는 사항은 다음과 같습니다.

  • Flame 그래프는 트리를 간결하게 표현한 그래프로, 위에서 아래로 프레임을 추적하여 호출 스택을 다시 만들 수 있습니다.
  • 프레임은 함수이고, 프레임 너비는 함수의 총 CPU 시간을 상대적으로 측정한 값입니다. 이 예시에서는 foo2의 총 CPU 시간이 main의 총 CPU 시간의 1/3이므로 foo2의 프레임은 main의 프레임 너비의 1/3입니다.
  • 프레임 아래의 빈 공간 너비는 프레임에서 명명된 함수의 자체 CPU 시간을 상대적으로 측정한 값입니다. 예를 들어 프레임 foo1 아래에서 1.5단위가 비어 있고 2.5단위는 bar에서 사용됩니다. 따라서 foo1의 자체 CPU 시간은 총 CPU 시간의 37.5%(1.5초)입니다.
  • 피호출자의 총 CPU 시간은 호출자의 총 CPU 시간을 초과할 수 없으므로 호출 스택을 따라갈수록 프레임 너비가 줄어듭니다. 이에 따라 프레임 모양이 형성됩니다.

    이 예시에서 foo1bar를 호출하고 foo1의 총 CPU 시간은 bar의 총 CPU 시간에 foo1의 자체 CPU 시간을 더한 값으로 정의됩니다. 따라서 bar의 총 CPU 시간은 foo1의 총 CPU 시간보다 길 수 없습니다.

다음 단계