2021년 State of DevOps 설문조사에 참여하여 소프트웨어 작업의 미래를 설계하고 의견을 들려주세요.

Flame 그래프 포커스 지정

포커스 필터를 사용할 때 함수 하나를 선택하면 Flame 그래프에는 특정 함수를 드나드는 코드 경로가 표시됩니다. 포커스가 지정된 그래프를 사용하면 다음 두 가지의 일반적인 태스크를 수행할 수 있습니다.

  1. 여러 곳에서 호출되는 특정 함수의 총 리소스 소비 분석
  2. 특정 함수에서 여러 호출자에 소비되는 시간의 비율 분석

예를 들어 표준 Flame 그래프를 사용하여 Sort 함수와 관련된 리소스 소비량을 분석하려면 어떻게 해야 할까요?

Flame 그래프의 Sort 함수

다음 섹션에서는 이 질문에 대한 답을 알아보기 위해 Sort 그래프를 집중적으로 살펴봅니다. 이 페이지의 Flame 그래프는 색상 모드비교 대상으로 구성되며 각각 이름없음의 기본값으로 설정되어 있습니다.

포커스가 지정된 그래프 설명

포커스 필터로 작성된 그래프는 지정된 함수의 Flame 그래프 두 개를 만들어서 하나로 합칩니다.

sort 함수에 포커스가 지정된 Flame 그래프

위 그래프에서 Sort 함수에 해당하는 프레임은 전체 너비이며 강조표시되어 있습니다. 프레임 텍스트에는 함수 이름, 백분율, 분석에 사용된 프로필 수가 포함됩니다. 이 경우 측정항목을 통해 Sort 함수가 CPU 시간의 8.85%를 소비한 것을 알 수 있습니다.

위 그래프의 하단부 절반은 Sort 함수를 표준 Flame 그래프의 시작점으로 간주하고 모든 피호출자를 표시합니다. 프레임에서 표시 필터를 사용하면 이 부분을 표준 Flame 그래프로 만들 수 있습니다.

sort 피호출자를 보여주는 Flame 그래프 하단부

그래프의 상단부 절반은 피호출자가 숨겨진 Sort의 호출자를 표시합니다. 일련의 필터를 사용하면 상단부 절반에 대한 근사치를 구할 수 있습니다. 먼저 Sort스택 표시 필터를 추가합니다. 그런 다음 Sort로 호출된 함수마다 스택 숨기기 또는 프레임 숨기기를 추가합니다. 이 예시에서는 quickSort스택 숨기기를 추가하여 이 함수와 하위 요소를 삭제한 후 LenmaxDepth프레임 숨기기를 추가합니다.

sort 호출자를 보여주는 Flame 그래프 상단부

이러한 필터를 사용하면 포커스가 지정된 그래프의 상단부 절반에 대한 근사치를 구할 수 있으므로 서로 다른 호출 스택을 통해 Sort 함수에 도달한다는 점을 알 수 있습니다. 그러나 측정항목은 집계되지 않으므로 그래프에 Sort의 전체 측정항목 소비량은 나타나지 않습니다.

포커스가 지정된 그래프는 근사치 값 두 개를 단순히 결합하는 그래프와는 조금 다릅니다.

  • 포커스 함수 Sort에 사용할 수 있는 프레임이 한 개 있습니다.
  • 포커스 함수 프레임은 강조표시된 전체 너비 프레임이며 모든 호출 스택 집계인 측정항목을 표시합니다.
  • 각 호출 스택은 root 프레임으로 시작하므로 전체 호출 스택을 볼 수 있습니다.

프레임 선택

포커스가 지정된 그래프에서 프레임을 클릭하면 Flame 그래프가 다시 그려지고 프레임의 호출 스택이 좀 더 자세하게 표시됩니다. 여러 호출 스택을 통해 프레임이 연결되면 각 호출 스택이 표시되며 프레임을 포함하지 않는 호출 스택은 표시되지 않습니다. 그래프를 원래 상태로 복원하려면 포커스 함수에 해당하는 프레임을 선택합니다.

앞의 예시에서 Sort(*byFreq).sort(*byLiteral).sort에 의해 호출됩니다. (*byLiteral).sort의 호출 스택을 자세히 보려면 해당 프레임을 선택합니다. 다른 프레임을 선택하고 표시되는 호출 스택을 더욱 세분화할 수 있습니다.

sort와 관련하여 확장된 Flame 그래프

포커스가 지정된 Flame 그래프를 원래 상태로 복원하려면 포커스 필터 값이 표시되는 프레임을 선택합니다. 이 예시에서는 Sort 라벨이 있는 회색 프레임을 선택합니다. 표준 Flame 그래프를 원래 상태로 복원하려면 루트 프레임을 선택합니다.

그래프 분석

포커스가 지정된 Flame 그래프를 분석하려면 표준 Flame 그래프를 분석하는 데 사용된 컨트롤 및 필터와 동일한 컨트롤 및 필터를 사용합니다. 단, 그래프와 포인터의 상호작용 방식에는 차이가 있습니다.

  • 포인터를 프레임 위로 가져가면 도움말에 측정항목 데이터가 표시됩니다. 표준 Flame 그래프에서는 프레임의 전체 측정항목 데이터가 표시됩니다. 포커스가 지정된 Flame 그래프에서는 함수의 집계 측정항목 데이터가 표시됩니다.

  • 프레임을 선택하면 Flame 그래프가 다시 그려지고 프레임이 전체 너비로 표시됩니다. 표준 Flame 그래프를 원래 상태로 복원하려면 맨 위에 있는 프레임을 선택해야 합니다. 포커스가 지정된 Flame 그래프를 원래 상태로 복원하려면 포커스 필터 값이 표시된 프레임을 선택해야 합니다.

프로필을 비교할 때 포커스가 지정된 그래프에 대한 자세한 내용은 비교 포커스 지정을 참조하세요.

포커스 필터 설정

포커스 필터를 설정하는 데 사용할 수 있는 방법은 여러 가지가 있지만 모두 같은 그래프를 표시합니다.

그래프 사용

원하는 프레임 위에 마우스 포인터를 놓은 다음 프레임 도움말에서 포커스를 클릭합니다. 포커스 함수가 프레임에서 추출됩니다. 이 예시에서는 함수 (*huffmanBitWriter).write 주위로 펼쳐진 Flame 그래프에 다음 세 가지 호출 스택이 표시됩니다.

작은 프레임에 포커스가 지정된 Flame 그래프

포커스 목록 사용

Flame 그래프에 특정 함수의 포커스를 지정하려면 다음을 수행합니다.

  1. 목록 을 클릭하여 포커스 함수 선택 테이블을 엽니다.
  2. 테이블에서 함수 이름을 선택하거나 특정 함수의 경우 작업 을 클릭한 다음 포커스를 선택합니다.

포커스 함수 테이블 선택

선택한 함수가 여러 호출 스택을 통해 호출될 수 있으면 각 호출 스택이 Flame 그래프에 표시됩니다.

테이블 헤더 요소를 선택하여 테이블 행을 오름차순 또는 내림차순 으로 정렬할 수 있습니다. 표의 각 행에는 함수 이름과 함수의 실행과 관련된 통계가 표시됩니다. 이 테이블에서는 (*compressor).deflate 함수를 실행하는 데 2.78초가 소요된다는 점을 보여줍니다. 함수 자체를 실행하는 데 1.8초가 걸리고 호출 스택을 실행하는 데 나머지 시간이 소요됩니다. 첫 번째 백분율 열은 (*compressor).deflate 함수가 총 실행 시간의 57%를 사용하고 있음을 보여줍니다. 두 번째 열은 (*compressor).deflate 또는 관련 호출 스택의 함수가 실행되는 데 총 실행 시간의 89%를 사용하고 있음을 보여줍니다. 마지막으로 개수 열에는 (*compressor).deflate 함수를 호출하는 시퀀스가 3개 있다고 나와 있습니다.

프로필을 비교할 때 포커스 목록의 콘텐츠는 다릅니다. 자세한 내용은 비교 포커스 지정을 참조하세요.

필터 표시줄 사용

필터 표시줄에서 프로필 데이터 필터 추가라는 회색 텍스트를 클릭한 후 Focus:와 포커스를 지정할 함수를 식별하는 문자열을 입력합니다. 패키지 프리픽스 또는 전체 이름이 포함된 하위 문자열을 사용할 수 있습니다. 명확하지 않은 문자열을 제공하면 이 문자열과 가장 일치하는 함수가 선택됩니다.

원하는 경우 필터를 클릭하고 포커스를 선택한 후 식별 문자열을 입력할 수 있습니다.

선택한 함수가 여러 호출 스택을 통해 호출될 수 있으면 각 호출 스택이 Flame 그래프에 표시됩니다.

포커스 필터 삭제

포커스 필터를 삭제하려면 필터에서 닫기 를 클릭합니다.

다음 단계