はじめに
この実験では、Linux でカーネルトレースポイントがアクティブかどうかを確認する方法を探ります。トレースポイントはカーネルイベントを観察するために不可欠であり、デバッグやパフォーマンス分析に非常に役立ちます。まず、/sys/kernel/debug/tracing ファイルシステムを使用して、システムで利用可能なトレースポイントを一覧表示します。
最初の調査の後、trace-cmd ユーティリティを使用して特定のトレースポイントの状態を確認する方法を学び、最後に /proc/kallsyms ファイルを調べることでトレースポイントを検証します。
ls /sys/kernel/debug/tracing でトレースポイントを一覧表示する
このステップでは、Linux のトレースポイントの調査を始めます。トレースポイントは、カーネルソースコード内に配置されたフックで、カーネル内で発生する特定のイベントを観察することができます。これらはデバッグやパフォーマンス分析に非常に役立ちます。
Linux カーネルはトレーシングフレームワークを提供しており、多くの場合 /sys/kernel/debug/tracing ディレクトリを通じてアクセスされます。このディレクトリには、トレーシングを制御し、その情報を提供する様々なファイルが含まれています。
システムで利用可能なトレースポイントを表示するには、トレーシングファイルシステム内の events ディレクトリの内容を一覧表示することができます。
ターミナルが開いていない場合は開きましょう。デスクトップの左側にある Xfce Terminal アイコンから開くことができます。
次に、以下のコマンドを入力して 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/
この出力は、トレースできるさまざまなイベントのカテゴリを示しています。次のステップでは、これらのトレースポイントの状態を確認する方法を学びます。
Continue をクリックして次に進みましょう。
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 ファイルシステムを手動で操作することなく、トレースポイントの完全なリストとその現在の状態を簡単に確認できます。
Continue をクリックして次のステップに進みましょう。
/proc/kallsyms 内のトレースポイントを確認する
前のステップでは、トレーシングファイルシステムと trace-cmd ユーティリティを使ってトレースポイントを一覧表示する方法を学びました。今度は、トレースポイントの情報を確認する別の方法、つまり /proc/kallsyms ファイルを調べてみましょう。
/proc/kallsyms ファイルには、関数や変数を含むすべてのエクスポートされたカーネルシンボルのアドレスと名前が含まれています。トレースポイントもこのファイル内でシンボルとして表されます。
cat や grep などのコマンドを使って、/proc/kallsyms 内のトレースポイントシンボルを検索することができます。トレースポイントシンボルは通常、命名規則に従っており、多くの場合 tracepoint または _tracepoint が含まれています。
/proc/kallsyms 内でトレースポイントに関連するシンボルを探してみましょう。cat を使ってファイルを読み取り、その出力を grep にパイプして、「tracepoint」という単語を含む行を検索します。
次のコマンドを入力して Enter キーを押します。
cat /proc/kallsyms | grep tracepoint
このコマンドは、/proc/kallsyms から「tracepoint」という文字列を含む行を表示します。次のような出力が表示されます。
...
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/tracing や trace-cmd はトレースポイントの管理と表示により使いやすいインターフェースを提供しますが、トレースポイントがカーネルシンボルとして存在することを理解することは、高度なカーネルトレーシングの概念を理解する上で基本的です。
これで、Linux システム上のトレースポイントを識別して調査する 3 つの異なる方法を学びました。
Continue をクリックしてこの実験を完了しましょう。
まとめ
この実験では、カーネルのデバッグとパフォーマンス分析に重要な Linux のトレースポイントを調査することから始めました。/sys/kernel/debug/tracing ディレクトリを通じてカーネルのトレーシングフレームワークにアクセスできることを学びました。具体的には、ls /sys/kernel/debug/tracing/events コマンドを使って利用可能なトレースポイントを一覧表示しました。これらのトレースポイントは events ディレクトリ内でカーネルのサブシステムごとに整理されています。この最初のステップで、システム上でトレース可能な様々なカーネルイベントを識別する方法を示しました。



