BPFを使ったLinuxにおけるトレーシングの基礎知識Berkeley Packet Filter(BPF)入門(8)

Linuxにおける利用が急速に増えている「Berkeley Packet Filter(BPF)」について、基礎から応用まで幅広く紹介する連載。今回は、BPFを使ったLinuxにおけるトレーシングの基礎について。

» 2020年04月14日 05時00分 公開
[味曽野雅史OSSセキュリティ技術の会]

この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。

 Linuxにおける利用が急速に増えている「Berkeley Packet Filter(BPF)」について、基礎から応用まで幅広く紹介する連載「Berkeley Packet Filter(BPF)入門」。今回から数回にわたり、BPFの代表的な応用先の一つであるトレーシングに焦点を当て、その動作と利用方法を解説していこうと思います。今回はLinuxにおけるトレーシングの基礎を説明します。

トレーシングとは

 まず、そもそも「トレーシング」とは何でしょうか。字義的には「跡を追う」という意味ですが、転じて一般には「イベント発生の記録」を意味します。例えばHTTPサーバを考えると、イベントとしてはコネクションの接続や切断、あるいはクライアントからのデータの受信などがあります。ソフトウェアのバグの調査やパフォーマンス改善には、こうしたイベントの発生情報の取得が必要不可欠です。

 Linuxカーネルにはシステムやアプリケーションをトレーシングするための機構が複数備わっており、それらをBPFから利用できるようになっています。

BPFを利用したトレーシングの概要

 これまでの連載で説明してきたように、BPFプログラムは特定のイベントに応じて呼び出され、処理を行います。そこで、トレースしたいイベントにBPFプログラムをひも付け、イベント発生時にそのBPFプログラムから記録を取ればトレーシングができることになります。イベントの記録はBPFマップを利用するか、あるいはヘルパー関数経由から追記専用のバッファーにデータを書き込むことで行います。ユーザーは記録したデータにシステムコール経由でアクセスすることができます。

 以下にBPFによるトレーシングの概略図を示します。

BPFによるトレーシングの概略図

 この方法には以下のような特徴・利点があります。

  • イベントの記録がカーネル内で完結する
  • 記録するイベントデータのフィルタリング処理や整形処理がBPFプログラムから可能
  • BPFプログラムを変更することで、トレース処理が容易に変更可能

 BPFにひも付けられるイベント(を提供する機能)としては、主に以下のものがあります。

  • Tracepoints
  • kprobe、kretprobe
  • uprobe、uretprobe
  • perf event

 BPFでトレースを行う場合、BPFのプログラム作成方法に加え、どのようなイベントが利用可能であるかも知る必要があります。以下で、それぞれのイベントの概要を説明します。

 なお、これらの機能はいずれも(e)BPF登場前からLinuxで開発されてきた機能であり、BPF固有のものではありません。BPF以外にも例えば自分でカーネルモジュールを書いてそこからこれらの機能を利用することができます。

Tracepoints

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。