Linuxにおける利用が急速に増えている「Berkeley Packet Filter(BPF)」について、基礎から応用まで幅広く紹介する連載。今回は、BPFを使ったLinuxにおけるトレーシングの基礎について。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
Linuxにおける利用が急速に増えている「Berkeley Packet Filter(BPF)」について、基礎から応用まで幅広く紹介する連載「Berkeley Packet Filter(BPF)入門」。今回から数回にわたり、BPFの代表的な応用先の一つであるトレーシングに焦点を当て、その動作と利用方法を解説していこうと思います。今回はLinuxにおけるトレーシングの基礎を説明します。
まず、そもそも「トレーシング」とは何でしょうか。字義的には「跡を追う」という意味ですが、転じて一般には「イベント発生の記録」を意味します。例えばHTTPサーバを考えると、イベントとしてはコネクションの接続や切断、あるいはクライアントからのデータの受信などがあります。ソフトウェアのバグの調査やパフォーマンス改善には、こうしたイベントの発生情報の取得が必要不可欠です。
Linuxカーネルにはシステムやアプリケーションをトレーシングするための機構が複数備わっており、それらをBPFから利用できるようになっています。
これまでの連載で説明してきたように、BPFプログラムは特定のイベントに応じて呼び出され、処理を行います。そこで、トレースしたいイベントにBPFプログラムをひも付け、イベント発生時にそのBPFプログラムから記録を取ればトレーシングができることになります。イベントの記録はBPFマップを利用するか、あるいはヘルパー関数経由から追記専用のバッファーにデータを書き込むことで行います。ユーザーは記録したデータにシステムコール経由でアクセスすることができます。
以下にBPFによるトレーシングの概略図を示します。
この方法には以下のような特徴・利点があります。
BPFにひも付けられるイベント(を提供する機能)としては、主に以下のものがあります。
BPFでトレースを行う場合、BPFのプログラム作成方法に加え、どのようなイベントが利用可能であるかも知る必要があります。以下で、それぞれのイベントの概要を説明します。
なお、これらの機能はいずれも(e)BPF登場前からLinuxで開発されてきた機能であり、BPF固有のものではありません。BPF以外にも例えば自分でカーネルモジュールを書いてそこからこれらの機能を利用することができます。
Copyright © ITmedia, Inc. All Rights Reserved.