ホーム Topics eBPF eBPFとは
IBM Instana Observabilityの詳細はこちら
オペレーティング・システムのアクティビティを表す抽象的なデザイン
eBPFとは

Extended Berkeley Packet Filter (eBPF)は、開発者がLinuxオペレーティング・システム(OS)カーネル空間で直接実行される、効率的で安全かつ非侵入的なプログラムを作成できるようにするプログラミング・テクノロジーです。

eBPFは、OSカーネルなどの特権コンテキストでサンドボックス化されたプログラムを実行できるため、カーネル・ソースコードの変更、カーネル・モジュールのロード、プログラム全体の実行を中断することなく、実行時に既存のソフトウェアの機能を拡張できます。eBPFテクノロジーは、ユーザー空間プログラムでネットワーク・パケットを選択して分析する簡単な方法を提供した、オリジナルのBerkeley Packet Filter (BPF)の進化形です。しかし、パケットフィルタリング以外にも、BPFプログラムは、カーネル内でより複雑なタスクを処理する柔軟性が欠けていました。

より汎用性の高いテクノロジーの必要性を認識し、LinuxコミュニティはeBPFを開発しました。これは、BPFのバックエンド機能に基づいて構築され、カーネルのプログラマビリティを拡張しました。eBPFプログラムの高度な機能により、開発者は、オンサイトのデータセンターとクラウドネイティブ環境の両方で、高度なパケット・フィルタリング・プロセスの実装、ハイエンドのパフォーマンス分析の実施、ファイアウォールとデバッグプロトコルのインストールを行うことができます。

eBPFテクノロジーの進歩により、ソフトウェア開発者は、eBPFのアプリケーションをすべてのオペレーティング・システムに拡大することを余儀なくされ、Linuxベース以外のプラットフォームでもeBPFの洗練されたトレース、ネットワーキング、監視機能を利用できるようになりました。1 実際、eBPF Foundation(Google、Meta、Netflix、Microsoft、Intel、Isovalentなどが加盟するLinux Foundationの拡張組織)は、eBPFプログラムのOS互換性の拡大に多額の投資を行っており、最終的にはeBPFプログラミングの有用性を広げることを期待しています。2

Instanaデモのリクエスト

IBM Instana Observabilityのデモを入手して、Full Stack Observabilityと監視を数分で実現する方法をご覧ください。

関連コンテンツ

IBMニュースレターの購読

eBPFプログラムのコンポーネント

eBPFプログラムの主要なコンポーネントは次のとおりです。

eBPFバイトコード

eBPFプログラムは、最初は制限されたCサブセットで記述され、次にLLVMなどのツールを使用してeBPFバイトコードにコンパイルされ、Clangなどのフロントエンド・プログラミング言語のeBPFのバックエンド・アーキテクチャーとして機能します。 バイトコードは、本質的にeBPF命令セット・アーキテクチャーに準拠し、ランタイム・エラーを防ぐ制限された命令のセットです。

eBPFインタプリタ/JITコンパイラー

Linuxカーネル・テクノロジーは、eBPFバイトコードを実行可能なアクションに変換できますが、ジャスト・イン・タイム(JIT)コンパイラーは優れたパフォーマンスを提供します。JITコンパイラーは、バイトコードを特定のハードウェア・プラットフォームのネイティブ・マシン・コードに、その場で変換できます。 

ユーザー空間ローダー

ユーザー空間ローダーは、eBPFバイトコードをカーネルにロードし、それを適切なフックに接続し、関連するeBPFマップを管理するユーザー空間のプログラムです。ユーザー空間ローダーの例には、BPF Compiler Collection (BCC)やbpftraceなどのツールが含まれます。   

eBPFマップ

eBPFマップは、キーと値のペアと読み取り/書き込みアクセスを備えたデータ構造であり、共有ストレージ空間を提供し、eBPFカーネル・プログラムとユーザー空間アプリケーション間の対話を容易にします。システム・コールを使用して作成および管理されるeBPFマップは、eBPFプログラムの異なる反復間の状態を維持するために使用することもできます。

eBPFベリファイア

eBPFシステムの重要なコンポーネントであるベリファイアは、カーネルにロードされる前にバイトコードを確認し、プログラムに無限ループや不正な命令、境界外のメモリ・アクセスなどの有害な操作が含まれていないことを確認します。また、プログラムのすべてのデータ・パスが正常に終了することも確認します。

eBPFフック

フックは、eBPFプログラムを接続できるカーネル・コードのポイントです。カーネルがフックに到達すると、接続されたeBPFプログラムが実行されます。

tracepoint、kprobe、ネットワーク・パケット受信キューなどのさまざまなタイプのフックにより、eBPFプログラムに広範なデータ・アクセスが提供され、さまざまな操作を実行できるようになります。たとえば、tracepointを使用すると、プログラムはカーネルやその他のプロセスに関するデータを検査および収集でき、トラフィック制御フックを使用してネットワーク・パケットを検査および変更できます。

ヘルパー関数

eBPFは任意の関数を生成できず、すべてのカーネルバージョンとの互換性を維持する必要があるため、基本的なeBPF命令セットでは高度な操作を実行するにはわずかな差異が十分ではない場合があります。ヘルパー関数はこのギャップを埋めます。

ヘルパー関数(eBPFがシステム内から呼び出すことができる、定義済みのAPIベースのカーネル関数のセット)は、eBPFプログラムが、命令セットでは直接サポートされていない、より複雑な操作(現在時刻や日付の取得、乱数の生成など)を実行する方法を提供します。  

eBPFの仕組み

一般に、eBPFはLinuxカーネル内でvirtual machines (VM)として動作し、低レベルの命令セット・アーキテクチャーで動作し、eBPFバイトコードを実行します。ただし、eBPFプログラムを実行する複雑なプロセスは、特定の主要な手順に従う傾向があります。

開発者は、まずeBPFプログラムを書き、バイトコードをコンパイルします。プログラムの目的によって、適切なコードの種類が決まります。たとえば、チームがCPU使用率を監視したい場合は、使用率メトリクスを取り込む機能を含むコードを書きます。

eBPFコンパイラーが高レベルのCコードを低レベルのバイトコードに変換すると、ユーザー空間ローダーは BPFシステム・コールを生成して、プログラムをカーネルにロードします。また、ローダーはエラーに対処し、プログラムに必要なeBPFマップをセットアップする責任もあります。

プログラムのバイトコードとマップが配置されると、eBPFは検証プロセスを実行して、プログラムがカーネルで安全に実行できることを確認します。安全でないと判断された場合、プログラムをロードするシステム・コールは失敗し、ローダー・プログラムはエラー・メッセージを受け取ります。プログラムが検証に合格すると、実行が許可されます。

eBPFは、インタプリタまたはJITコンパイラーを使用して、バイトコードを実行可能なマシン・コードに変換します。ただし、eBPFはイベント駆動型テクノロジーであるため、カーネル内の特定のフック・ポイントまたはイベント(システム・コール、ネットワーク・イベント、プロセスの開始、CPUアイドリングなど)に応答してのみ実行されます。イベントが発生すると、eBPFは対応するバイトコード・プログラムを実行し、開発者がシステムのさまざまなコンポーネントを検査および操作できるようにします。

eBPFプログラムが実行されると、開発者はeBPFマップを使用してユーザー空間からeBPFプログラムと対話できるようになります。たとえば、アプリケーションは定期的にマップを確認してeBPFプログラムからデータを収集したり、マップを更新してプログラムの動作を変更したりする場合があります。

プログラムのアンロードは、ほとんどのeBPF実行プロセスの最終ステップです。eBPFがそのジョブを完了すると、ローダーはBPFシステム・コールを再度使用して、eBPFをカーネルからアンロードできます。その時点で、eBPFは実行を停止し、関連するリソースを解放します。また、アンロード・プロセスには、チームが不要になったeBPFマップを反復処理して有用な個々の要素を解放し、マップ自体を削除する(「delete」システムコールを使用)ことも含まれる場合があります。

eBPFのユースケースとメリット

eBPFテクノロジーは、すでに最新のLinuxシステムの基礎となっており、Linuxカーネルのきめ細かい制御を可能にし、企業がLinuxエコシステム内でより革新的なソリューションを構築できるようにします。

eBPFは、以下の進歩を促進しました。 

ネットワーキング

eBPFを使用すると、開発者は、より高速で、よりカスタマイズされたパケット処理機能、負荷分散プロセス、アプリケーション・プロファイリング・スクリプト、およびネットワーク監視プラクティスをインストールできます。Ciliumのようなオープンソースのプラットフォームは、eBPFを活用して、 Kubernetes クラスターやワークロード、その他のコンテナ化された マイクロサービスに安全でスケーラブルなネットワーキングを提供しています。さらに、カーネルレベルのパッケージ転送ロジックを活用することで、eBPFはルーティング・プロセスを合理化し、ネットワーク全体の応答を高速化できます。

可観測性

eBPFを使用すると、開発者はカーネルおよびユーザー空間アプリケーションを測定して、システムのパフォーマンスに大きな影響を与えることなく詳細なパフォーマンス・データとメトリクスを収集できます。これらの機能は、組織が常に先を行くのに役立ち、リアルタイムの監視と 可観測性を実現します。

セキュリティー

eBPFは、システム・コール、ネットワーク・トラフィック、システム動作を監視して、潜在的なセキュリティ脅威をリアルタイムで検知して対応できます。たとえば、FalcoのようなITソリューションは、eBPFを使用してランタイム・セキュリティ監査とインシデント対応を実装し、システム全体のセキュリティを強化します。

パフォーマンス・チューニング

eBPFは、システム・コールの追跡、CPU使用率の監視、リソース使用率(ディスクI/Oなど)の追跡により、開発者がシステム・パフォーマンスのボトルネックをより簡単に調査し、最適化の機会を特定するのに役立ちます。

関連ソリューション
IBM Instana Observability

IBM Instanaにより、DevOps、SRE、プラットフォーム、ITOps、開発など、誰もが必要なデータを必要なコンテキストで取得できるソリューションを提供することで、オブザーバビリティーを民主化できます。クラウドネイティブ向けに構築されながら、テクノロジーにとらわれないこのプラットフォームは、モバイル、ウェブ、アプリケーション、インフラストラクチャー全体での論理的および物理的な依存関係のコンテキストを持つ、忠実度の高いデータ(1秒単位の粒度とエンド・ツー・エンドのトレース)を自動的かつ継続的に提供します。

詳細はこちら Instanaデモのリクエスト

IBM Turbonomic

IBM Turbonomic ハイブリッドクラウド・コスト最適化プラットフォームを使用すると、重要なアクションをリアルタイムで継続的に自動化し、スタックの各レイヤーでコンピューティング、ストレージ、ネットワークのリソースを最も効率的な形でアプリに事前に割り振ることができます。 

Turbonomicの詳細はこちら 無料評価版を試す
次のステップ

IBM Instanaは、あらゆるユーザーの利用に適したリアルタイムの可観測性を提供します。可観測性戦略が現在および将来の環境の動的な複雑さに対応できることを検証しながら、価値実現までの時間を短縮します。 モバイルからメインフレームまで、Instanaは250以上のテクノロジーをサポートしており、その数は増え続けています。

IBM Instanaについて詳しく見る デモを予約
脚注

Foundationが複数のOSでeBPFの導入を進めることを提案、(ibm.com外部へのリンク)DevOps.com、2021 年 8 月 21 日

最新のeBPFの進歩は、ITへの大きな変化の兆しです (ibm.com外部へのリンク)、2023年9月13日 DevOps.com