티스토리 뷰
Flame Graph ?
show the CPU time spent in Java methods, system libraries, and the kernel, all in one visualization.
해석하기
- 각 사각형은 stack frame을 나타낸다(즉, 함수).
- 사각형의 가로(width)는 현재 프로파일에 얼마나 존재하는지(실행되는지)를 나타낸다.
- Graph
- x축
- 왼쪽과 오른쪽 순서는 중요하지 않다. stack은 단순히 알파벳 순서대로 정렬된 것이다.
- y축
- stack depth. 함수들간의 호출 depth.
- x축
- Stack의 색상들은 code type에 따라 설정된다.
- 보통 Java code는 초록색, C++ code는 노란색, System은 빨간색으로 설정된다.
- 하지만 다른 color scheme이 적용될수도 있으니 참고하자.
- 맨 위에 해당하는 stack들의 edge은 CPU 사용 중인 것을 나타낸다(위 사진참조).
- 맨 위의 stack의 edge가 길면 길수록 CPU를 많이 사용하고 있다고 보면 된다.
- Flame graph를 아래에서부터 위(bottom-up)로 읽을 수 있는데, 이는 Parent function부터 child function 흐름으로 읽는다고 보면 된다.
- 위에서부터 아래(top-down)로 읽을 수도 있다. 맨 위의 stack들은 CPU를 사용 중인 것이기에 이를 확인하면서 읽을 수 있다. 위의 stack들로부터 아래로 내려가면 현재 CPU를 사용하는 함수가 어떻게 실행되어왔는지 확인할 수 있다.
아래 주소의 Slideshare 자료가 Flame graph를 해석하는 Example들을 제공하고 있는데, 간단해서 처음에 이해하기 좋은 것 같다.
Java CPU profiling 방법
유명하게 3가지 방법이 있는데, async-profiler 가 Java에서는 가장 실용적인듯 (IntelliJ에서도 쉽게 사용하도록 제공됨)
1. perf + perf-map-agent + FlameGraph
- Linux perf tool + Gregg’s FlameGraph를 사용하는 방법
- 하지만 perf는 Java stack을 direct하게 가져오지 못함. 그렇기에 perf-map-agent 사용이 필요함. (JIT compiled methods에 대해 JVM에서 바로 노출시키지 않기 때문에)
- JVM에서 XX:+PreserveFramePointer 옵션을 사용하여야 한다.
2. eBPF + perf-map-agent + FlameGraph
- perf tool 대신 eBPF를 사용하는 방법. 이론상 훨씬 비용 오버헤드가 적다고 함.
- perf는 user space로 많은 data를 file 형태를 통해 push해서 진행하기 때문에 이게 오버헤드가 크다고 함. 반면 eBPF는 map을 사용해서 더 가벼움.
3. async-profiler
- Java를 위한 low overhead sampling profiler open-source.
- CPU profiling 시에 perf의 AsyncGetCallTrace를 사용해 진행.
- AsyncGetCallTrace는 lightweight profiling을 지원하는 Internal API. safepoint를 기다리는 것 없이 single thread의 stack을 확인할 수 있음.
- container 내에서 실행 중에 profiling 가능
References
How to Use async-profiler to Profile Non-root Java Process in Contianer
320x100
반응형
'Development > Java, Kotlin, Frameworks' 카테고리의 다른 글
[IntelliJ IDEA] Java Stream Debugging (스트림 디버깅) (1) | 2022.05.04 |
---|---|
Java Memory 이해 & OOME 오류에 관하여 (0) | 2022.04.27 |
RestTemplate WebClient, 어느 경우에 성능차이가 날까? (0) | 2022.03.15 |
Reactor just, defer, fromCallable 에 대하여 (3) | 2022.03.15 |
JUnit5 Tag & Filtering (2) | 2022.02.17 |
댓글
반응형
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 쿠버네티스
- 비동기
- c++
- boj
- jasync
- Algorithm
- k8s
- MySQL
- docker
- Istio
- 클린 아키텍처
- 백준
- WebFlux
- Spring boot
- Clean Architecture
- java
- gradle
- Intellij
- 로그
- 일상
- hexagonal architecture
- HTTP
- container
- python
- Kubernetes
- Spring
- tag
- 알고리즘
- Log
- 하루
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
글 보관함