서비스 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 [시간]

예를 들어, 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

위 명령을 실행하면 flamegraph.svg 파일이 생성됩니다. 이 파일을 웹 브라우저로 열면 CPU 사용량을 시각적으로 확인할 수 있습니다.

Flame Graph 해석하기

Flame Graph는 다음과 같은 방식으로 해석할 수 있습니다.

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와 Flame Graph는 오픈 소스 도구이므로 무료로 사용할 수 있습니다. 클라우드 환경에서는 AWS X-Ray, Google Cloud Profiler 등과 같은 매니지드 서비스를 사용하여 Perf와 Flame Graph를 더 쉽게 사용할 수 있습니다. 이러한 서비스는 추가 비용이 발생하지만, 설정 및 관리가 간편하고, 다양한 기능을 제공하므로 생산성을 향상시킬 수 있습니다.

전문가의 조언이나 의견

Brendan Gregg는 성능 분석 분야의 전문가이며, Flame Graph를 개발했습니다. 그는 “성능 문제는 숨겨져 있지만, Flame Graph는 숨겨진 문제를 시각적으로 드러내줍니다.”라고 말했습니다. 그는 또한 “Flame Graph는 단순히 CPU 사용량을 보여주는 것이 아니라, 시스템의 동작 방식을 이해하는 데 도움을 줍니다.”라고 강조했습니다. Perf와 Flame Graph를 사용하여 시스템의 동작 방식을 이해하고, 성능 문제를 해결하는 데 활용해 보세요.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다