Linux 에서 커널 트레이스포인트가 활성 상태인지 확인하는 방법

LinuxBeginner
지금 연습하기

소개

이 랩에서는 Linux 에서 커널 트레이스포인트가 활성화되어 있는지 확인하는 방법을 살펴봅니다. 트레이스포인트는 커널 이벤트를 관찰하는 데 필수적이며 디버깅 및 성능 분석에 매우 중요합니다. /sys/kernel/debug/tracing 파일 시스템을 사용하여 시스템에서 사용 가능한 트레이스포인트를 나열하는 것으로 시작합니다.

초기 탐색 후, trace-cmd 유틸리티를 사용하여 특정 트레이스포인트의 상태를 확인하는 방법을 배우고, 마지막으로 /proc/kallsyms 파일을 검사하여 트레이스포인트를 검증합니다.

ls /sys/kernel/debug/tracing 명령어로 트레이스포인트 목록 확인

이 단계에서는 Linux 트레이스포인트를 탐색하기 시작합니다. 트레이스포인트는 커널 소스 코드에 배치된 훅 (hook) 으로, 커널 내에서 발생하는 특정 이벤트를 관찰할 수 있게 해줍니다. 이는 디버깅 및 성능 분석에 매우 중요합니다.

Linux 커널은 종종 /sys/kernel/debug/tracing 디렉토리를 통해 접근할 수 있는 트레이싱 프레임워크를 제공합니다. 이 디렉토리에는 트레이싱을 제어하고 트레이싱에 대한 정보를 제공하는 다양한 파일이 포함되어 있습니다.

시스템에서 사용 가능한 트레이스포인트를 확인하려면 트레이싱 파일 시스템 내의 events 디렉토리의 내용을 나열할 수 있습니다.

터미널이 아직 열려 있지 않다면 엽니다. 데스크탑 왼쪽에서 Xfce 터미널 아이콘을 찾을 수 있습니다.

이제 다음 명령을 입력하고 Enter 키를 누르십시오.

ls /sys/kernel/debug/tracing/events

이 명령은 ls를 사용하여 /sys/kernel/debug/tracing/events 디렉토리의 내용을 나열합니다. events 디렉토리는 커널이 하위 시스템별로 구성된 사용 가능한 트레이스포인트를 노출하는 곳입니다.

각 커널 하위 시스템 (예: syscalls, sched, ext4 등) 을 나타내는 디렉토리 목록이 표시됩니다. 이러한 디렉토리 내에는 실제 트레이스포인트 이름이 있습니다.

예를 들어, 다음과 유사한 출력을 볼 수 있습니다 (정확한 출력은 커널 버전 및 구성에 따라 다릅니다).

block/      ext4/       kmem/       net/        pci/        random/     sock/       task/       workqueue/
bpf/        fib/        kvm/        nfs/        power/      raw_syscalls/ signal/     timer/      xfs/
compaction/ ftrace/     libata/     nipi/       printk/     regmap/     skb/        udp/        xen/
cpu-freq/   gpio/       mdio/       oom/        qdisc/      rpm/        snd/        vmscan/
cgroup/     header_event  header_page  irq/        migrate/    pagemap/    ras/        scsi/       spi/        writeback/
dma_fence/  i2c/        kcsan/      module/     perf_events/  rcu/        sfc/        syscalls/   xhci-hcd/
enable      iommu/      kprobe/     mpx/        powerpc/    regulator/  signal/     tcp/        xilinx-vsec/
exceptions/ iov/        kscan/      napi/       probe/      rpm/        skb/        timer/      xfs/

이 출력은 추적할 수 있는 다양한 범주의 이벤트를 보여줍니다. 다음 단계에서는 이러한 트레이스포인트의 상태를 확인하는 방법을 배웁니다.

계속을 클릭하여 진행하십시오.

trace-cmd 로 트레이스포인트 상태 확인

이전 단계에서는 /sys/kernel/debug/tracing/events 디렉토리를 탐색하여 사용 가능한 트레이스포인트를 나열했습니다. 이제 trace-cmd 유틸리티를 사용하여 트레이스포인트에 대한 자세한 정보, 특히 상태 (활성화 또는 비활성화 여부) 를 확인해 보겠습니다.

trace-cmd 명령은 Linux 트레이싱 프레임워크와 상호 작용하기 위한 강력한 도구입니다. trace-cmd가 아직 설치되지 않은 경우 apt를 사용하여 설치할 수 있습니다.

먼저 패키지 목록을 업데이트합니다.

sudo apt update

그런 다음 trace-cmd를 설치합니다.

sudo apt install trace-cmd

trace-cmd가 이미 설치되어 있다는 출력을 볼 수 있는데, 이는 괜찮습니다.

이제 사용 가능한 모든 트레이스포인트와 해당 상태를 나열하려면 trace-cmd list -e 명령을 사용합니다. -e 옵션은 trace-cmd에게 이벤트를 나열하도록 지시합니다 (트레이스포인트).

다음 명령을 입력하고 Enter 키를 누르십시오.

trace-cmd list -e

이 명령은 트레이스포인트의 하위 시스템과 이름을 표시하고, 그 뒤에 현재 상태를 대괄호 ([enabled] 또는 [disabled]) 로 표시하는 긴 목록을 출력합니다.

다음과 유사한 출력을 볼 수 있습니다 (다시 말하지만, 정확한 목록은 다를 수 있습니다).

  block:block_bio_backmerge [disabled]
  block:block_bio_bounce [disabled]
  block:block_bio_complete [disabled]
  block:block_bio_frontmerge [disabled]
  block:block_bio_queue [disabled]
  block:block_bio_remap [disabled]
  block:block_dirty_buffer [disabled]
  block:block_getrq [disabled]
  block:block_plug [disabled]
  block:block_rq_complete [disabled]
  block:block_rq_insert [disabled]
  block:block_rq_issue [disabled]
  block:block_rq_remap [disabled]
  block:block_rq_requeue [disabled]
  block:block_sync_buffer [disabled]
  block:block_touch_buffer [disabled]
  block:block_unplug [disabled]
  bpf:bpf_trace_printk [disabled]
  bpf:bpf_trace_vprintk [disabled]
  ... (many more tracepoints)

보시다시피, 대부분의 트레이스포인트는 성능 오버헤드를 방지하기 위해 기본적으로 비활성화되어 있습니다. 특정 커널 이벤트를 추적해야 할 때 일반적으로 특정 트레이스포인트를 활성화합니다.

trace-cmd list -e를 사용하면 /sys/kernel/debug/tracing 파일 시스템을 수동으로 탐색하지 않고도 트레이스포인트의 전체 목록과 현재 상태를 편리하게 확인할 수 있습니다.

다음 단계로 이동하려면 계속을 클릭하십시오.

/proc/kallsyms 에서 트레이스포인트 확인

이전 단계에서는 트레이싱 파일 시스템과 trace-cmd 유틸리티를 사용하여 트레이스포인트를 나열하는 방법을 배웠습니다. 이제 /proc/kallsyms 파일을 사용하여 트레이스포인트 정보를 확인하는 또 다른 방법을 살펴보겠습니다.

/proc/kallsyms 파일에는 함수 및 변수를 포함하여 내보낸 모든 커널 심볼의 주소와 이름이 포함되어 있습니다. 트레이스포인트도 이 파일에서 심볼로 표현됩니다.

catgrep과 같은 명령을 사용하여 /proc/kallsyms 내에서 트레이스포인트 심볼을 검색할 수 있습니다. 트레이스포인트 심볼은 일반적으로 tracepoint 또는 _tracepoint를 포함하는 명명 규칙을 따릅니다.

/proc/kallsyms에서 트레이스포인트와 관련된 심볼을 찾아보겠습니다. cat을 사용하여 파일을 읽고 출력을 grep으로 파이프하여 "tracepoint"라는 단어가 포함된 줄을 검색합니다.

다음 명령을 입력하고 Enter 키를 누르십시오.

cat /proc/kallsyms | grep tracepoint

이 명령은 문자열 "tracepoint"를 포함하는 /proc/kallsyms의 줄을 표시합니다. 다음과 유사한 출력을 볼 수 있습니다.

...
ffffffffXXXXXXXX R __tracepoint_module_load
ffffffffXXXXXXXX R __tracepoint_module_free
ffffffffXXXXXXXX R __tracepoint_module_get
ffffffffXXXXXXXX R __tracepoint_module_put
ffffffffXXXXXXXX R __tracepoint_module_request_module
ffffffffXXXXXXXX R __tracepoint_module_module_init
ffffffffXXXXXXXX R __tracepoint_module_module_exit
ffffffffXXXXXXXX R __tracepoint_module_module_request
ffffffffXXXXXXXX R __tracepoint_module_module_autoload
ffffffffXXXXXXXX R __tracepoint_module_module_kset_reg
ffffffffXXXXXXXX R __tracepoint_module_module_kset_unreg
...

XXXXXXXX는 16 진수 주소를 나타내며, 이는 시스템에 따라 다릅니다. 중요한 부분은 심볼 이름으로, 종종 __tracepoint_로 시작하고 그 뒤에 하위 시스템과 이벤트 이름이 옵니다.

이는 트레이스포인트가 실제로 /proc/kallsyms를 통해 접근할 수 있는 커널의 심볼 테이블 내에서 심볼로 표현됨을 확인합니다. /sys/kernel/debug/tracingtrace-cmd는 트레이스포인트를 관리하고 보기 위한 더 사용자 친화적인 인터페이스를 제공하지만, 트레이스포인트가 커널 심볼로 존재한다는 것을 이해하는 것은 고급 커널 트레이싱 개념의 기본입니다.

이제 Linux 시스템에서 트레이스포인트를 식별하고 검사하는 세 가지 다른 방법을 배웠습니다.

이 랩을 완료하려면 계속을 클릭하십시오.

요약

이 랩에서는 커널 디버깅 및 성능 분석에 중요한 Linux 트레이스포인트를 탐구하는 것으로 시작했습니다. /sys/kernel/debug/tracing 디렉토리가 커널의 트레이싱 프레임워크에 대한 접근을 제공한다는 것을 배웠습니다. 특히, ls /sys/kernel/debug/tracing/events 명령을 사용하여 사용 가능한 트레이스포인트를 나열했는데, 이는 events 디렉토리 내에서 커널 하위 시스템별로 구성되어 있습니다. 이 초기 단계는 시스템에서 추적할 수 있는 다양한 커널 이벤트를 식별하는 방법을 보여주었습니다.