리눅스 시스템 관리자, 커널 개발자, 그리고 성능 엔지니어에게 있어 시스템의 내부 동작을 꿰뚫어 보는 능력은 매우 중요합니다. 바로 그 역할을 수행하는 핵심 도구가 바로 perf입니다. perf는 리눅스 커널에 내장된 성능 분석 도구로, CPU 사용률, 메모리 접근, 디스크 I/O 등 시스템 전반에 걸친 다양한 성능 지표를 측정하고 분석할 수 있도록 설계되었습니다. 이 리뷰에서는 perf의 핵심 기능 중 하나인 커널 함수 호출 추적 기능을 집중적으로 살펴보고, 실제 사용 경험을 바탕으로 장단점을 분석하며, 유사 도구들과의 차별점을 논의하고자 합니다.

perf란 무엇인가? 간단한 소개

perf는 원래 Performance Counters for Linux의 약자로, 하드웨어 성능 카운터를 활용하여 시스템의 성능을 프로파일링하는 도구였습니다. 하지만 시간이 지나면서 기능이 확장되어, 단순히 하드웨어 카운터를 읽는 것을 넘어 소프트웨어 이벤트, 트레이스포인트, 심지어 사용자 정의 프로브까지 활용할 수 있게 되었습니다. 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를 사용하여 해당 시스템 콜 내부에서 호출되는 커널 함수들의 호출 빈도와 실행 시간을 측정함으로써, 어떤 함수가 성능 병목 지점인지 쉽게 파악할 수 있었습니다.

또한 perf는 시스템 성능에 미치는 영향이 적으면서도 정확한 정보를 수집할 수 있다는 장점이 있습니다. 하지만 perf의 사용법이 복잡하고, 분석 결과가 너무 많아 어떤 정보를 봐야 할지 혼란스러울 수 있다는 단점도 있습니다. 따라서 perf를 사용하기 전에 사용법을 충분히 익히고, 분석 목적에 맞는 정보만 필터링하여 보는 것이 중요합니다.

유사 제품/서비스와의 비교

리눅스 시스템의 성능을 분석하는 데 사용할 수 있는 도구는 perf 외에도 여러 가지가 있습니다. 대표적인 도구로는 SystemTap, ftrace, eBPF 등이 있습니다.

각 도구는 장단점이 다르므로, 분석 목적과 상황에 맞춰 적절한 도구를 선택하는 것이 중요합니다. 일반적으로 시스템 전체의 성능을 분석하거나, 특정 시스템 콜의 동작 방식을 이해하고 싶을 때는 perf를 사용하는 것이 좋습니다. 더 높은 수준의 추적 기능이 필요하거나, 사용자 정의 로직을 사용하여 시스템을 분석하고 싶을 때는 SystemTap이나 eBPF를 사용하는 것이 좋습니다. 커널 내부의 함수 호출을 추적하고 분석하는 데 집중하고 싶을 때는 ftrace를 사용하는 것이 좋습니다.

 

 

답글 남기기

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