서비스 CPU 병목 현상, Perf와 Flame Graph로 시각화하기
서비스 운영 중 갑자기 CPU 사용량이 급증하거나 응답 시간이 느려지는 경우, 어디가 문제인지 파악하기가 쉽지 않습니다. 이때 Perf와 Flame Graph는 강력한 도구 조합이 되어 문제의 원인을 시각적으로 파악하고 해결하는 데 도움을 줄 수 있습니다. 이 글에서는 Perf를 사용하여 CPU 프로파일링 데이터를 수집하고, Flame Graph를 통해 이를 시각화하여 서비스의 CPU 병목 현상을 진단하는 방법을 자세히 알아보겠습니다.
Perf란 무엇인가
Perf는 Linux 성능 분석 도구입니다. CPU 사이클, 캐시 미스, 브랜치 예측 실패 등 다양한 하드웨어 및 소프트웨어 이벤트에 대한 데이터를 수집할 수 있습니다. Perf는 커널에 내장되어 있어 별도의 드라이버 설치 없이 사용할 수 있다는 장점이 있습니다. 또한, 낮은 오버헤드로 운영 환경에서도 안전하게 사용할 수 있습니다.
Flame Graph란 무엇인가
Flame Graph는 Brendan Gregg가 개발한 SVG 기반의 시각화 도구입니다. Perf와 같은 프로파일링 도구에서 수집한 데이터를 기반으로, 함수 호출 스택을 시각적으로 표현해줍니다. 각 프레임은 함수를 나타내며, 프레임의 너비는 해당 함수가 CPU를 사용한 시간을 나타냅니다. Flame Graph를 통해 어떤 함수가 CPU 시간을 가장 많이 소비하는지, 어떤 함수 호출 경로가 가장 많은 CPU 시간을 사용하는지 쉽게 파악할 수 있습니다.
Perf와 Flame Graph를 함께 사용하는 이유
Perf는 CPU 사용량 데이터를 수집하는 데 유용하지만, 수집된 데이터만으로는 어떤 함수가 문제인지 직관적으로 파악하기 어렵습니다. 반면, Flame Graph는 Perf에서 수집한 데이터를 시각적으로 표현하여 어떤 함수가 CPU 시간을 많이 사용하는지, 어떤 함수 호출 경로가 문제인지 쉽게 파악할 수 있도록 돕습니다. 따라서 Perf와 Flame Graph를 함께 사용하면 CPU 병목 현상을 효과적으로 진단하고 해결할 수 있습니다.
Perf와 Flame Graph 설치하기
Perf는 대부분의 Linux 배포판에 기본적으로 설치되어 있습니다. 설치되어 있지 않다면, 패키지 관리자를 사용하여 설치할 수 있습니다. 예를 들어, Ubuntu 또는 Debian에서는 다음과 같이 설치할 수 있습니다.
sudo apt-get update
sudo apt-get install linux-tools-common linux-tools-$(uname -r)
Flame Graph는 Perl 스크립트로 작성되어 있으며, GitHub에서 다운로드할 수 있습니다.
git clone https://github.com/brendangregg/FlameGraph.git
Flame Graph를 사용하려면 Perl이 설치되어 있어야 합니다. Perl이 설치되어 있지 않다면, 패키지 관리자를 사용하여 설치할 수 있습니다.
sudo apt-get install perl
Perf를 사용하여 CPU 프로파일링 데이터 수집하기
Perf를 사용하여 CPU 프로파일링 데이터를 수집하는 방법은 다음과 같습니다.
sudo perf record -F 99 -p [PID] -g -- sleep [시간]
-F 99: 초당 99번 샘플링을 수행합니다.
-p [PID]: 프로파일링할 프로세스의 PID를 지정합니다.-g: 함수 호출 스택 정보를 기록합니다.-- sleep [시간]: 지정된 시간 동안 프로파일링을 수행합니다.
예를 들어, PID가 1234인 프로세스를 10초 동안 프로파일링하려면 다음과 같이 실행합니다.
sudo perf record -F 99 -p 1234 -g -- sleep 10
프로파일링이 완료되면 perf.data 파일이 생성됩니다. 이 파일에는 수집된 CPU 프로파일링 데이터가 저장됩니다.
Flame Graph를 사용하여 CPU 프로파일링 데이터 시각화하기
Flame Graph를 사용하여 CPU 프로파일링 데이터를 시각화하는 방법은 다음과 같습니다.
sudo perf script -i perf.data | ./FlameGraph/stackcollapse-perf.pl | ./FlameGraph/flamegraph.pl > flamegraph.svg
perf script -i perf.data:perf.data파일에서 데이터를 읽어 사람이 읽을 수 있는 형식으로 변환합니다.
./FlameGraph/stackcollapse-perf.pl: Perf 스크립트의 출력을 Flame Graph가 이해할 수 있는 형식으로 변환합니다../FlameGraph/flamegraph.pl: 변환된 데이터를 기반으로 Flame Graph를 생성합니다.> flamegraph.svg: 생성된 Flame Graph를flamegraph.svg파일에 저장합니다.
위 명령을 실행하면 flamegraph.svg 파일이 생성됩니다. 이 파일을 웹 브라우저로 열면 CPU 사용량을 시각적으로 확인할 수 있습니다.
Flame Graph 해석하기
Flame Graph는 다음과 같은 방식으로 해석할 수 있습니다.
- X축: X축은 시간 경과에 따른 함수 호출 스택을 나타냅니다. 각 프레임의 너비는 해당 함수가 CPU를 사용한 시간을 나타냅니다.
- Y축: Y축은 함수 호출 스택의 깊이를 나타냅니다. 위쪽으로 갈수록 더 깊은 함수 호출 스택을 나타냅니다.
- 색상: 색상은 특별한 의미를 가지지 않습니다. 단지 프레임을 구분하기 위해 사용됩니다.
CPU 시간을 많이 소비하는 함수는 Flame Graph에서 넓은 프레임으로 표시됩니다. 따라서, 넓은 프레임을 찾아서 해당 함수가 CPU 시간을 많이 사용하는 이유를 분석해야 합니다. 또한, 넓은 프레임 위에 있는 함수들을 살펴보면 어떤 함수 호출 경로가 CPU 시간을 많이 사용하는지 파악할 수 있습니다.
실제 서비스에 적용하는 방법
실제 서비스에 Perf와 Flame Graph를 적용하는 방법은 다음과 같습니다.
- CPU 사용량이 높은 프로세스를 찾습니다.
top,htop등의 명령어를 사용하여 CPU 사용량이 높은 프로세스를 확인할 수 있습니다. - 해당 프로세스의 PID를 확인합니다.
- Perf를 사용하여 해당 프로세스의 CPU 프로파일링 데이터를 수집합니다.
- Flame Graph를 사용하여 수집된 데이터를 시각화합니다.
- Flame Graph를 분석하여 CPU 시간을 많이 소비하는 함수를 찾습니다.
- 해당 함수의 코드를 분석하여 CPU 사용량을 줄일 수 있는 방법을 찾습니다.
- 코드를 수정하고, 서비스를 재배포합니다.
- Perf와 Flame Graph를 다시 사용하여 CPU 사용량이 줄었는지 확인합니다.
유용한 팁과 조언
- 운영 환경에서의 오버헤드 최소화: Perf는 낮은 오버헤드로 운영 환경에서도 사용할 수 있지만, 샘플링 빈도를 너무 높게 설정하면 성능에 영향을 줄 수 있습니다. 따라서, 적절한 샘플링 빈도를 설정하는 것이 중요합니다.
- 필터링을 통한 집중 분석: Perf는 다양한 이벤트를 수집할 수 있지만, 모든 이벤트를 수집하면 데이터가 너무 많아져 분석하기 어려울 수 있습니다. 따라서, 필요한 이벤트만 선택하여 수집하는 것이 좋습니다. 예를 들어, CPU 사이클만 수집하거나, 특정 함수만 프로파일링할 수 있습니다.
- 지속적인 모니터링: CPU 사용량은 시간에 따라 변할 수 있습니다. 따라서, Perf와 Flame Graph를 사용하여 지속적으로 CPU 사용량을 모니터링하는 것이 좋습니다.
- symbolicate: 컴파일된 바이너리는 함수 이름을 포함하지 않을 수 있습니다. 이 경우, Flame Graph는 메모리 주소만 표시합니다. 함수 이름을 확인하려면 symbolicate 과정을 거쳐야 합니다. 컴파일 시 디버깅 정보를 포함하도록 설정하면 symbolicate 과정을 생략할 수 있습니다.
흔한 오해와 사실 관계
- Perf는 운영 환경에서 사용하면 안 된다?: Perf는 낮은 오버헤드로 운영 환경에서도 안전하게 사용할 수 있습니다. 하지만, 샘플링 빈도를 너무 높게 설정하면 성능에 영향을 줄 수 있으므로 주의해야 합니다.
- Flame Graph는 복잡해서 이해하기 어렵다?: Flame Graph는 처음에는 복잡해 보일 수 있지만, 기본적인 원리를 이해하면 쉽게 분석할 수 있습니다. Flame Graph를 해석하는 방법을 배우고, 꾸준히 사용하다 보면 익숙해질 것입니다.
- Flame Graph는 모든 성능 문제를 해결해 준다?: Flame Graph는 CPU 병목 현상을 진단하는 데 유용한 도구이지만, 모든 성능 문제를 해결해 주지는 않습니다. 메모리 누수, I/O 병목 현상 등 다른 종류의 성능 문제는 다른 도구를 사용하여 진단해야 합니다.
자주 묻는 질문과 답변
- Q: Perf를 사용하려면 root 권한이 필요한가요?
- A: 네, Perf는 커널에 접근해야 하므로 root 권한이 필요합니다. 하지만,
/proc/sys/kernel/perf_event_paranoid설정을 변경하면 일반 사용자도 Perf를 사용할 수 있도록 할 수 있습니다. - Q: Flame Graph를 생성하는 데 시간이 너무 오래 걸립니다. 어떻게 해야 하나요?
- A: Perf로 수집한 데이터가 너무 많으면 Flame Graph를 생성하는 데 시간이 오래 걸릴 수 있습니다. 샘플링 시간을 줄이거나, 필터링을 사용하여 데이터 양을 줄여보세요.
- Q: Flame Graph에서 함수 이름이 제대로 표시되지 않습니다. 어떻게 해야 하나요?
- A: 컴파일 시 디버깅 정보를 포함하도록 설정했는지 확인하세요. 디버깅 정보가 포함되어 있지 않으면 symbolicate 과정을 거쳐야 합니다.
비용 효율적인 활용 방법
Perf와 Flame Graph는 오픈 소스 도구이므로 무료로 사용할 수 있습니다. 클라우드 환경에서는 AWS X-Ray, Google Cloud Profiler 등과 같은 매니지드 서비스를 사용하여 Perf와 Flame Graph를 더 쉽게 사용할 수 있습니다. 이러한 서비스는 추가 비용이 발생하지만, 설정 및 관리가 간편하고, 다양한 기능을 제공하므로 생산성을 향상시킬 수 있습니다.
전문가의 조언이나 의견
Brendan Gregg는 성능 분석 분야의 전문가이며, Flame Graph를 개발했습니다. 그는 “성능 문제는 숨겨져 있지만, Flame Graph는 숨겨진 문제를 시각적으로 드러내줍니다.”라고 말했습니다. 그는 또한 “Flame Graph는 단순히 CPU 사용량을 보여주는 것이 아니라, 시스템의 동작 방식을 이해하는 데 도움을 줍니다.”라고 강조했습니다. Perf와 Flame Graph를 사용하여 시스템의 동작 방식을 이해하고, 성능 문제를 해결하는 데 활용해 보세요.