리눅스 시스템 관리자, 커널 개발자, 그리고 성능 엔지니어에게 있어 시스템의 내부 동작을 꿰뚫어 보는 능력은 매우 중요합니다. 바로 그 역할을 수행하는 핵심 도구가 바로 perf
입니다. perf
는 리눅스 커널에 내장된 성능 분석 도구로, CPU 사용률, 메모리 접근, 디스크 I/O 등 시스템 전반에 걸친 다양한 성능 지표를 측정하고 분석할 수 있도록 설계되었습니다. 이 리뷰에서는 perf
의 핵심 기능 중 하나인 커널 함수 호출 추적 기능을 집중적으로 살펴보고, 실제 사용 경험을 바탕으로 장단점을 분석하며, 유사 도구들과의 차별점을 논의하고자 합니다.
perf란 무엇인가? 간단한 소개
perf
는 원래 Performance Counters for Linux의 약자로, 하드웨어 성능 카운터를 활용하여 시스템의 성능을 프로파일링하는 도구였습니다. 하지만 시간이 지나면서 기능이 확장되어, 단순히 하드웨어 카운터를 읽는 것을 넘어 소프트웨어 이벤트, 트레이스포인트, 심지어 사용자 정의 프로브까지 활용할 수 있게 되었습니다. perf
는 커널 소스 코드와 밀접하게 통합되어 있으며, 시스템의 낮은 수준까지 접근하여 상세한 정보를 수집할 수 있다는 장점을 가지고 있습니다.
커널 함수 호출 추적 기능 집중 분석
perf
의 커널 함수 호출 추적 기능은 특정 커널 함수가 언제, 얼마나 자주 호출되는지, 그리고 호출에 걸리는 시간은 얼마나 되는지 등을 파악하는 데 사용됩니다. 이를 통해 성능 병목 지점을 찾거나, 특정 시스템 콜의 동작 방식을 이해하거나, 드라이버의 성능을 개선하는 데 도움을 받을 수 있습니다. 이 기능은 특히 다음과 같은 상황에서 유용합니다.
- 특정 시스템 콜의 성능 분석: 예를 들어,
read()
시스템 콜이 느리게 동작하는 원인을 분석할 때,perf
를 사용하여read()
내부에서 호출되는 커널 함수들의 호출 빈도와 실행 시간을 측정할 수 있습니다.
- 드라이버 성능 문제 진단: 디바이스 드라이버의 성능이 예상보다 낮을 때,
perf
를 사용하여 드라이버 내부의 특정 함수가 과도하게 호출되거나, 예상치 못한 지연이 발생하는 부분을 찾아낼 수 있습니다. - 커널 내부 동작 이해: 커널의 특정 기능이 어떻게 구현되어 있는지 궁금할 때,
perf
를 사용하여 해당 기능과 관련된 커널 함수들의 호출 흐름을 추적하고, 동작 방식을 파악할 수 있습니다.
주요 기능과 사용 방법
perf
를 사용하여 커널 함수 호출을 추적하는 방법은 크게 두 가지로 나눌 수 있습니다. 첫 번째는 perf record
명령어를 사용하여 시스템 전체 또는 특정 프로세스의 함수 호출 정보를 기록하는 방법입니다. 두 번째는 perf probe
명령어를 사용하여 특정 함수에 동적으로 프로브를 삽입하고, 해당 함수가 호출될 때마다 정보를 기록하는 방법입니다.
perf record를 사용한 함수 호출 추적
perf record
명령어는 시스템 전체 또는 특정 프로세스의 함수 호출 정보를 기록하는 데 사용됩니다. 예를 들어, read()
시스템 콜과 관련된 함수 호출 정보를 기록하려면 다음과 같은 명령어를 사용할 수 있습니다.
perf record -e syscalls:sys_enter_read -g -- sleep 1
위 명령어는 read()
시스템 콜이 호출될 때마다 해당 함수의 호출 스택을 기록합니다. -e syscalls:sys_enter_read
옵션은 read()
시스템 콜이 호출될 때 발생하는 이벤트를 추적하도록 지정하며, -g
옵션은 호출 스택을 기록하도록 지정합니다. sleep 1
명령어는 1초 동안만 기록하도록 지정합니다.
기록된 데이터는 perf report
명령어를 사용하여 분석할 수 있습니다. perf report
명령어는 기록된 함수 호출 정보를 기반으로, 어떤 함수가 가장 많이 호출되었는지, 어떤 함수의 실행 시간이 가장 긴지 등을 보여줍니다. perf report -g
옵션을 사용하면 호출 스택을 시각적으로 확인할 수 있으며, 이를 통해 성능 병목 지점을 쉽게 파악할 수 있습니다.
perf probe를 사용한 동적 프로브 삽입
perf probe
명령어는 특정 함수에 동적으로 프로브를 삽입하고, 해당 함수가 호출될 때마다 정보를 기록하는 데 사용됩니다. 예를 들어, tcp_recvmsg()
함수가 호출될 때마다 정보를 기록하려면 다음과 같은 명령어를 사용할 수 있습니다.
perf probe -x /lib/modules/$(uname -r)/kernel/net/ipv4/tcp.ko tcp_recvmsg
위 명령어는 tcp_recvmsg()
함수에 프로브를 삽입하고, 해당 함수가 호출될 때마다 정보를 기록합니다. -x
옵션은 프로브를 삽입할 대상 모듈을 지정하며, tcp_recvmsg
는 프로브를 삽입할 함수 이름을 지정합니다.
프로브가 삽입된 후에는 perf record
명령어를 사용하여 함수 호출 정보를 기록할 수 있습니다. perf record
명령어는 프로브가 삽입된 함수가 호출될 때마다 해당 함수의 정보를 기록합니다. 기록된 데이터는 perf report
명령어를 사용하여 분석할 수 있습니다. perf report
명령어는 기록된 함수 호출 정보를 기반으로, 어떤 함수가 가장 많이 호출되었는지, 어떤 함수의 실행 시간이 가장 긴지 등을 보여줍니다.
장점과 단점
perf
는 강력한 성능 분석 도구이지만, 장점과 단점이 명확합니다.
장점
- 커널 통합:
perf
는 커널에 내장되어 있기 때문에 별도의 설치 과정 없이 바로 사용할 수 있습니다. 또한 커널 소스 코드와 밀접하게 통합되어 있어 시스템의 낮은 수준까지 접근하여 상세한 정보를 수집할 수 있습니다.
- 다양한 기능:
perf
는 단순히 함수 호출을 추적하는 것 외에도 CPU 사용률, 메모리 접근, 디스크 I/O 등 시스템 전반에 걸친 다양한 성능 지표를 측정하고 분석할 수 있습니다. - 유연성:
perf
는 다양한 옵션을 제공하여 사용자가 원하는 방식으로 성능을 분석할 수 있도록 지원합니다. 예를 들어, 특정 프로세스만 추적하거나, 특정 이벤트만 추적하거나, 특정 함수에만 프로브를 삽입하는 등 다양한 방식으로 성능을 분석할 수 있습니다. - 낮은 오버헤드:
perf
는 성능 분석 시 발생하는 오버헤드를 최소화하도록 설계되었습니다. 따라서 시스템 성능에 미치는 영향이 적으면서도 정확한 정보를 수집할 수 있습니다.
단점
- 복잡한 사용법:
perf
는 다양한 기능을 제공하는 만큼 사용법이 복잡합니다. 특히 처음 사용하는 사용자는 명령어 옵션이나 분석 결과 해석에 어려움을 느낄 수 있습니다.
- 커널 의존성:
perf
는 커널 버전에 따라 지원하는 기능이나 명령어 옵션이 다를 수 있습니다. 따라서 특정 커널 버전에 맞춰perf
를 사용해야 하며, 커널 버전을 업데이트할 때마다perf
사용법을 다시 익혀야 할 수도 있습니다. - root 권한 필요:
perf
는 시스템의 낮은 수준까지 접근하여 정보를 수집하기 때문에 root 권한이 필요합니다. 따라서 일반 사용자는perf
를 사용할 수 없습니다. - 정보 과다:
perf
는 시스템의 모든 정보를 수집할 수 있기 때문에 분석 결과가 너무 많아 어떤 정보를 봐야 할지 혼란스러울 수 있습니다. 따라서 분석 목적에 맞는 정보만 필터링하여 보는 것이 중요합니다.
사용 경험 및 성능 분석
실제로 perf
를 사용하여 커널 함수 호출을 추적해 본 결과, 시스템의 성능 병목 지점을 찾는 데 매우 유용하다는 것을 확인할 수 있었습니다. 예를 들어, 특정 시스템 콜이 느리게 동작하는 원인을 분석할 때, perf
를 사용하여 해당 시스템 콜 내부에서 호출되는 커널 함수들의 호출 빈도와 실행 시간을 측정함으로써, 어떤 함수가 성능 병목 지점인지 쉽게 파악할 수 있었습니다.
또한 perf
는 시스템 성능에 미치는 영향이 적으면서도 정확한 정보를 수집할 수 있다는 장점이 있습니다. 하지만 perf
의 사용법이 복잡하고, 분석 결과가 너무 많아 어떤 정보를 봐야 할지 혼란스러울 수 있다는 단점도 있습니다. 따라서 perf
를 사용하기 전에 사용법을 충분히 익히고, 분석 목적에 맞는 정보만 필터링하여 보는 것이 중요합니다.
유사 제품/서비스와의 비교
리눅스 시스템의 성능을 분석하는 데 사용할 수 있는 도구는 perf
외에도 여러 가지가 있습니다. 대표적인 도구로는 SystemTap
, ftrace
, eBPF
등이 있습니다.
SystemTap
:SystemTap
은 스크립트 언어를 사용하여 시스템의 동작을 동적으로 추적하고 분석하는 도구입니다.perf
보다 더 높은 수준의 추적 기능을 제공하지만, 사용법이 더 복잡하고, 시스템 성능에 미치는 영향이 더 클 수 있습니다.
ftrace
:ftrace
는 커널 내부의 함수 호출을 추적하고 분석하는 데 특화된 도구입니다.perf
보다 더 낮은 수준의 추적 기능을 제공하지만, 사용법이 더 간단하고, 시스템 성능에 미치는 영향이 더 적습니다.eBPF
:eBPF
는 커널에서 실행되는 사용자 정의 프로그램을 작성하고 실행할 수 있도록 하는 기술입니다.perf
,SystemTap
,ftrace
등 다양한 도구의 기반 기술로 사용되며, 시스템의 동작을 매우 유연하게 추적하고 분석할 수 있도록 지원합니다.
각 도구는 장단점이 다르므로, 분석 목적과 상황에 맞춰 적절한 도구를 선택하는 것이 중요합니다. 일반적으로 시스템 전체의 성능을 분석하거나, 특정 시스템 콜의 동작 방식을 이해하고 싶을 때는 perf
를 사용하는 것이 좋습니다. 더 높은 수준의 추적 기능이 필요하거나, 사용자 정의 로직을 사용하여 시스템을 분석하고 싶을 때는 SystemTap
이나 eBPF
를 사용하는 것이 좋습니다. 커널 내부의 함수 호출을 추적하고 분석하는 데 집중하고 싶을 때는 ftrace
를 사용하는 것이 좋습니다.