SVG 플레임 그래프로 애플리케이션의 성능을 시각화하는 방법

게시 됨: 2023-02-21

SVG 플레임 그래프는 애플리케이션의 성능을 시각화하는 좋은 방법입니다. 각 기능에 소요된 시간을 표시하여 너무 많은 시간을 차지하는 코드 영역을 신속하게 식별할 수 있습니다. SVG 플레임 그래프를 표시하려면 생성할 수 있는 도구를 사용해야 합니다. Flamegraph.io와 같은 많은 오픈 소스 도구를 사용할 수 있습니다. 플레임 그래프를 생성한 후에는 태그를 사용하여 웹사이트나 블로그에 임베드할 수 있습니다. Google 스프레드시트와 같은 도구를 사용하여 Flame 그래프를 표시할 수도 있습니다. 새 스프레드시트를 만들고 "삽입 > 이미지"를 선택한 다음 Flame 그래프의 URL을 붙여넣기만 하면 됩니다.

Flame 그래프를 어떻게 실행합니까?

Flame 그래프를 어떻게 실행합니까?
이미지 제공: badawi.io

플레임 그래프를 실행하려면 컴퓨터에 몇 가지를 설치해야 합니다. 가장 먼저 필요한 것은 Google Chrome 브라우저입니다. 다음으로 Flame Graph 확장 프로그램을 설치해야 합니다. 이 두 가지를 모두 설치했으면 Google Chrome 브라우저를 열고 Flame Graph 확장 프로그램 페이지 로 이동해야 합니다. 거기에서 "Create a new Flame Graph" 버튼을 클릭해야 합니다. 그러면 플레임 그래프를 만들려는 웹사이트의 URL을 입력해야 하는 새 탭이 나타납니다. URL을 입력했으면 "Flame Graph 만들기" 버튼을 클릭해야 합니다. Flame 그래프를 생성하는 데 몇 분 정도 걸립니다. 완료되면 결과를 볼 수 있습니다.

Flame 그래프는 분산된 요청 추적과 요청 실행 중에 발생한 각 서비스 호출의 요약을 표시합니다. 분산 추적의 Flame 그래프는 개발자가 애플리케이션의 병목 현상을 식별하는 데 도움이 되는 대기 시간 및 오류 데이터를 보여줍니다. 이 문서에서는 플레임 그래프를 해석하는 방법과 예시, 분산 추적을 추적하는 다른 방법에 대한 설명을 제공합니다. Y축은 호출 스택의 깊이(호출 수)를 표시합니다. Flame 그래프에서 범위를 클릭하면 일반적으로 호출과 관련된 기간 및 오류에 대한 요약이 표시됩니다. Flame 그래프 아래의 탭을 클릭하여 메트릭, 로그, 네트워크 성능 데이터, 코드 핫스팟 및 기타 상황별 정보를 찾을 수 있습니다. 나선형 다이어그램은 일련의 고리로 둘러싸인 원으로 구성됩니다. Flame 그래프는 코드 프로파일러의 요청을 이행하는 데 사용되는 메서드 및 코드 경로를 시각화하는 데 사용할 수 있습니다. Datadog 애플리케이션 성능 모니터링 및 배포 추적 도구를 사용하면 모든 서비스에서 모든 요청의 경로를 추적할 수 있습니다.

Flame 그래프는 개발자에게 성능 문제를 볼 수 있는 빠르고 쉬운 방법을 제공합니다.

개발자는 Flame 그래프를 사용하여 몇 초 만에 분산 애플리케이션의 성능을 시각화할 수 있습니다. Flame 그래프는 요청 추적을 그래픽으로 표시하고 애플리케이션에 문제가 발생한 위치를 강조 표시하여 개발자가 성능 문제를 식별하고 수정하는 데 도움을 줄 수 있습니다.

Flamegraph에서 어떻게 검색합니까?

Flamegraph에서 검색할 수 있는 몇 가지 방법이 있습니다. 한 가지 방법은 화면 오른쪽 상단에 있는 검색창을 이용하는 것입니다. 이 검색 상자를 사용하면 플레임그래프를 검색하는 데 사용할 키워드를 입력할 수 있습니다. Flamegraph에서 검색하는 또 다른 방법은 찾아보기 기능을 사용하는 것입니다. 이 기능은 화면 왼쪽에서 찾을 수 있습니다. 이 기능을 사용하면 화염 그래프의 다양한 범주를 탐색할 수 있습니다.

플레임 그래프의 출현으로 이제 더 쉽게 검색할 수 있습니다. 오른쪽의 큰 TCP_send() 프레임 아래에 쓰기 코드 경로가 있습니다. 강조 표시된 프레임 중 하나를 클릭하면 이러한 현상이 발생하는 이유를 알 수 있습니다. Tcp_Send는 테스트된 샘플의 59.1%에 존재했습니다. 찾아봐야 할 다른 흥미로운 용어로는 re?cv, spin, copy 및 x가 있습니다.

Flame 그래프라고 하는 이유는 무엇입니까?

시각화를 만들 때 Neelakanth와 Roch는 완전히 임의의 색상을 사용했습니다. CPU가 뜨거워(바쁨) 먼저 따뜻한 색상만 선택한 이유를 설명했습니다. 화염을 닮았기 때문에 화염 그래프는 빠르게 대중화되었습니다.

화염의 위험

불 같은 행사는 좌절감을 풀어주고 활기찬 토론을 시작하는 재미있는 방법입니다. 그들은 또한 관계의 붕괴로 이어지고 사람들을 무너지게 할 수 있습니다.
화염을 다루는 가장 좋은 방법은 화염을 무시하는 것입니다. 누군가 불꽃을 게시할 수 있습니다. 당신은 그것을 무시하는 사람이어야합니다. 응답할 필요가 없습니다. 에너지 소비가 아깝지 않습니다.
Flame은 재미있는 의사소통 방법이 될 수 있지만 잘못 사용하면 경우에 따라 해로울 수도 있습니다. 화염을 두려워할 필요가 없습니다. 대신, 당신은 그들을 피하고 침착해야 합니다.

누가 Flamegraphs를 발명 했습니까?

Flame 그래프는 Netflix 및 기타 산업뿐만 아니라 여러 언어에서 성능 분석을 위한 중요한 도구가 되었습니다. 그들의 저자인 Brendan Gregg는 Communications of the ACM의 2016년 6월호에 게시된 Flame Graph를 만들었습니다.


Flame 그래프 뷰어

플레임 그래프 뷰어는 사용자가 데이터를 그래프 형태로 시각화할 수 있는 소프트웨어 유형입니다. 이 소프트웨어는 종종 컴퓨터 또는 기타 장치의 문제를 해결하는 데 사용됩니다.

Speedscope를 사용하여 웹 기반 방식으로 대규모 성능 프로필을 볼 수 있습니다. Brendan Gregg의 FlameGraphs는 Chrome 개발자 도구의 성능 패널에서 영감을 받았습니다. 시스템의 데이터는 서버로 전달되지 않으며 완전히 브라우저 내에서 실행됩니다. Chrome과 Firefox는 모든 플랫폼에서 작동해야 합니다(Mac만 테스트했지만). 왼쪽 헤비 뷰에서는 동일한 스택이 순차적으로 기록되었는지 여부에 관계없이 함께 그룹화됩니다. 각 부모의 스택은 가장 무거운 스택이 왼쪽에 있도록 정렬되므로 왼쪽 라벨이 됩니다. 상황에 대한 자세한 보기는 주어진 상황에서 얼마나 많은 함수 호출이 있는지와 관련하여 현재 위치를 이해하는 데 도움이 됩니다.

Rudro Samanta는 Speedscope를 사용하여 Xcode를 사용하여 캡처한 iOS 애플리케이션 프로필을 시각화했습니다. Jest는 테스트 케이스를 작성하는 데 사용되며 Travis CI는 코드를 지속적으로 통합하는 데 사용되며 Coveralls는 테스트 커버리지 보고에 사용되며 Parcel은 소스 코드를 변환하는 데 사용되며 prettier는 자동으로 코드 형식을 지정하는 데 사용됩니다. 이를 달성하는 한 가지 방법은 speedscope가 가져올 수 있는 형식의 수를 늘리고 통합을 더 긴밀하게 만드는 것입니다. 저는 이제 9개월 동안 스피드 스코프 작업을 해왔고, 저에게서 멀어지게 한 것 같은 느낌이 듭니다. 엔지니어로서 저는 전 세계 사람들이 복잡한 문제를 해결하는 데 도움이 되도록 유지 관리가 가능하고 이해하기 쉬우며 유용한 시스템 및 도구 세트를 만들기 위해 노력할 것입니다. 올해는 창의적이고 협력적인 프로젝트에 더 많은 시간을 할애할 것이라고 믿습니다.

플레임 그래프 온라인

플레임 그래프는 일반적으로 소프트웨어 프로그램의 성능 특성을 표시하는 데 사용되는 프로파일링 데이터의 그래픽 표현입니다. 각 섹션의 높이는 특정 코드 섹션에서 소요된 시간을 나타냅니다. 섹션은 호출된 시점에 따라 왼쪽에서 오른쪽으로 정렬됩니다.

트리, 그래프와 달리 플레임 그래프는 많은 양의 정보를 작은 포맷으로 표현하여 화면 공간을 효과적으로 활용합니다. 여기를 클릭하면 트리를 Flame 그래프로 변환하는 방법과 Flame 그래프의 주요 기능이 무엇인지 알 수 있습니다. Flame 그래프는 Google Cloud Profiler에서 프로파일링 데이터를 표시하는 데 사용됩니다. 호출 스택을 따를 때 호출 수신자의 총 CPU 시간이 다른 호출 수신자의 CPU 시간을 초과할 수 없기 때문에 프레임 너비가 줄어듭니다. 화염 모양은 이 동작으로 인해 발생합니다. 이제 Flame 그래프는 과도한 공백을 제거하고 자체 CPU 시간을 사용하여 프레임을 색칠한 후 다음과 같이 나타납니다. foo1 및 foo2에 대한 호출 스택이 보존되더라도 foo2로 시작하여 foo1로 끝나는 스택은 이제 프레임 옆에 있습니다.

플레임 그래프는 어떻게 만드나요?

Flame 그래프를 생성하려면 먼저 스택 추적을 샘플링해야 합니다. 이것은 전통적으로 두 가지 유형으로 나뉘었습니다. 시스템 코드 경로(예: JVM GC, syscalls, TCP)를 표시하지만 Java 프로파일은 표시하지 않는 Linux perf와 같은 시스템 프로파일입니다. hprof, lJP 및 상업용 프로파일러와 같은 JVM 프로파일러를 사용할 수 있습니다.

플레임 차트와 플레임 그래프 비교

플레임 차트 와 플레임 그래프 사이에는 몇 가지 중요한 차이점이 있습니다. Flame 차트는 일반적으로 이벤트의 타임라인을 표시하고 Flame 그래프는 스택 추적을 표시합니다. Flame 차트는 종종 성능 문제를 디버깅하는 데 사용되는 반면 Flame 그래프는 성능 데이터를 시각화하는 데 더 일반적으로 사용됩니다. Flame 차트는 프로그램이 시간을 어떻게 사용하는지 확인할 수 있는 좋은 방법입니다. 병목 현상이 있는 위치와 프로그램이 리소스를 사용하는 방식을 보여줄 수 있습니다. Flame 그래프는 프로그램이 리소스를 어떻게 사용하고 있는지 확인할 수 있는 좋은 방법입니다.

어떤 코드 경로가 핫(CPU에서 바쁘기 때문에)인지 결정하기 위한 거칠지만 유용한 기술로서 고정 속도로 프로파일링하면 좋은 결과를 얻을 수 있습니다. Flame 그래프를 사용하면 스택 추적을 샘플링하여 핫 코드 경로를 빠르게 식별할 수 있습니다. My Linux perf(perf_events) 및 DTrace 예제는 둘 다 설치할 수 있는 소프트웨어의 예입니다. FlameGraph는 대화형 SVG를 생성하고 이미지 위로 드래그 앤 드롭하여 세부 정보를 볼 수 있는 Perl 도구입니다. 시각화는 프로파일러의 다른 시각화와 유사하게 보일 수 있지만 몇 가지 점에서 다릅니다. 이것은 처음에 CPU에서 무엇이 뜨거운지 시각화하는 데 사용되었기 때문에 플레임 그래프라고 합니다. 최신 Linux 커널에서 실행하는 낮은 오버헤드 방법에 대해서는 eBPF profile(8) 섹션을 확인하십시오(eBPF profile(8)은 권장되지 않음).

perf에 대한 자세한 내용은 내 perf_events 페이지의 Flame Graphs 섹션을 참조하십시오. stackcollapse-perf.pl을 사용해야만 액세스할 수 있는 접힌 모드를 포함하여 Linux 4.5 성능 보고서에서 접힌 출력을 직접 출력할 수 있습니다. 이 샘플에서는 사용자 및 커널 스택(-f)으로 구분된 커널(-a) 및 사용자(-d)의 린트가 99Hz(-F 99)로 제공되며 샘플에 대한 시간 제한은 60초입니다. Flame 그래프는 Fedora 16에서 SystemTap v1.7을 사용하여 생성할 수 있습니다. 타이머를 사용하여 스택 추적을 샘플링할 수도 있습니다. 이 프로필 프로브는 시스템 클럭 속도(CONFIG_HZ)에서 실행됩니다. SystemTap은 systemTap 집계 기능을 사용하여 커널 내부를 집계하고 사용자에게 (덜 자세한) 보고서를 전달할 수 있습니다.

그래프는 Fedora 16 게스트(가상 CPU 1개 포함)에서 KVM(Ubuntu 호스트)(32비트)을 사용하여 생성되었습니다. 베어 메탈에서는 일부 코드 경로와 샘플 비율이 매우 다릅니다. 프로파일링 데이터의 요소를 클릭하여 백분율을 볼 수 있지만(단, 새 버전이므로 클릭하여 확대할 수 없음) 확대할 수는 없습니다. 그래프는 Linux 내부에 대해 자세히 알아볼 수 있는 훌륭한 도구입니다. illumos 커널 하이퍼바이저 호스트에서 이 예제에서는 사용자 및 커널 스택을 모두 볼 수 있습니다. 독립 실행형 SVG 및 PNG 버전도 사용할 수 있습니다. 수명이 짧은 프로세스를 생성하는 데 커널 시간이 어떻게 할당되는지 관찰하기 위해 이 Flame 그래프의 워크로드를 수행했습니다.

플레임 그래프는 일반적으로 머리카락을 표시하여 커널 인터럽트 로드를 식별하는 데 사용됩니다. Ubuntu 릴리스 1716의 NUMA 균형 조정은 노드 간 메모리 균형을 맞추기 위해 CPU 주기의 절반 이상을 사용하므로 성능이 저하됩니다. Flame 그래프를 재생성하지 않고도 병합 순서를 일정하게 유지하려면 D3에서 Flame 그래프를 다시 작성해야 합니다. JavaOne 2016 토크에서 Flame Graph를 사용한 Linux의 Java 성능 분석에서 Linux 성능을 사용하여 혼합 모드 Flame 그래프를 생성하는 최신 기술을 다룹니다. JDK8u60에는 성능 및 Flame 그래프를 생성할 수 있는 /PreservePointerFrame이라는 기능이 포함되어 있습니다. JDK-8068945가 스택 프로파일링(프레임 포인터)을 위한 핫 패치로 JDK 라이브러리에 추가되었습니다. x64용으로 컴파일된 코드에서 프레임 포인터로 RBP 레지스터를 사용할 때 적절한 프레임 포인터로 간주됩니다.

DTrace를 Jstack 메서드로 실행하면 사용자 수준 스택과 Java 메서드 및 클래스를 추적할 수 있습니다. Java 프로그램의 경우 Stackcollapse.pl 및 flamegraph.pl은 CPU 플레임 그래프를 생성하는 데 사용됩니다. 일부 JVM 버전은 많은 문제가 있는 ustack 헬퍼를 지원하지 않습니다. CPU 수를 사용한 스택 추적뿐만 아니라 모든 스택 추적과 값 조합에서 작동합니다. 첫 번째 문제는 JDK-6260864 버그로 인해 Jstack()이 스택을 제대로 탐색하지 못할 수 있다는 것입니다. 버그 JDK-6260864는 2005년에 제출되었으며 2014년 현재까지 수정되지 않았습니다. 이 버그로 인해 내 프로덕션 워크로드의 샘플 스택 대부분이 부서지다. 장치의 메모리 할당, 장치 IO, 시스템 호출 패턴, CPU 외부 이벤트 및 특정 함수 호출에 대한 통찰력을 얻을 수 있습니다. 이들 중 하나라도 사용되는 경우 카운트, 바이트 또는 대기 시간과 같은 관련 값으로 스택 추적을 얻을 수 있습니다. Flame 그래프는 Flame Graphs 페이지에서도 볼 수 있습니다.

Flame 그래프 자바

플레임 그래프는 소프트웨어 프로그램의 성능을 나타내는 데 사용되는 데이터 시각화 유형입니다. 프로그램이 각 기능에서 소비하는 시간을 나타내는 그래프입니다. 막대의 높이는 프로그램이 해당 함수에서 소비하는 시간을 나타냅니다. 막대의 너비는 프로그램이 다른 기능에 비해 해당 기능에서 소비하는 시간을 나타냅니다.

Flame 그래프는 최근 Java에서 CPU 사용량을 시각화하는 인기 있는 새로운 방법으로 등장했습니다. Google의 경량 Java 프로파일러(code.google.com)와 내 Flame 그래프 소프트웨어(github)를 사용하여 생성할 수 있습니다. 앞으로 Flame 그래프가 Java 프로파일러와 별개의 기능이 아닌 것은 다행 입니다. 이 블로그 게시물에서는 작동하는 동안 몇 가지 제한 사항이 있는 Java 전용 JVMTI 기반 메서드를 살펴보겠습니다. Jeremy Manson은 CPU를 샘플링하는 데 사용할 수 있는 경량 Java 프로파일러를 만들었습니다. 이 샘플 보고서는 Java가 시작될 때 종료될 때까지 생성되며 trace.txt 파일이 추가됩니다. 프로그램을 실행하려면 약간의 비용이 듭니다.

내 프로그램의 경우 미미했습니다(요청 비율이 1%만 증가하고 CPU 소비가 7% 증가). 샘플링 속도를 줄여야 하는 경우 다음 섹션을 참조하십시오. flamegraph.pl 프로그램 의 출력은 제목을 포함하여 다양한 옵션(list -h)으로 사용자 정의할 수 있습니다. 동일한 프로파일링 기술을 기반으로 하는 Richard Warburton의 정직한 프로파일러도 유용합니다. 장기간에 걸쳐 많은 양의 데이터를 수집하려는 경우 샘플 속도를 100Hz에서 50Hz 이하로 줄일 수 있습니다.