Simple explanation of eBPF
過去 1 年間で、Application Real-Time Monitoring Service (ARMS) は eBPF 技術に基づく Kubernetes モニタリングを構築し、多言語対応かつ非侵襲のアプリケーションパフォーマンス、システムパフォーマンス、ネットワークパフォーマンスの観測機能を提供してきました。また、Kubernetes の障害トラブルシューティング全景を公開し、eBPF 技術の有効性を検証しています。eBPF の技術とエコシステムは十分に発展しており、将来も大きな可能性を秘めています。この技術の実践者として、本記事では 7 つの核心的な質問に答える形で eBPF 技術そのものを紹介し、eBPF のベールを解き明かすことを目的としています。
[Alibaba Cloud Native] 公式アカウントをフォローし、バックグラウンドでキーワード [K8s panorama] に返信すると、全景図の高解像度ダウンロード先を取得できます。
eBPF とは
eBPF はカーネル内でサンドボックス化されたプログラムを実行できる技術であり、カーネルおよびユーザープログラムのイベント発生時に安全にコードを挿入する仕組みを提供し、カーネル開発者以外もカーネルを制御できるようにします。カーネルの発展に伴い、eBPF は初期のパケットフィルタリングからネットワーク、カーネル、セキュリティ、トレーシングなどの機能へと段階的に拡張されてきました。さらに、その機能特性は現在も急速に発展し続けています。初期の BPF は classic BPF、略して cBPF と呼ばれていました。この機能拡張により、現在の BPF は extended BPF、略して eBPF と呼ばれています。
eBPF のアプリケーションシナリオとは
ネットワーク最適化
eBPF は高性能とスケーラビリティを兼ね備えており、ネットワークソリューションにおけるネットワークパケット処理の最適な選択肢となっています。
・高性能
JIT コンパイラにより、カーネルネイティブコードに近い実行効率を実現します。
・高いスケーラビリティ
カーネルコンテキスト内で、プロトコル解析やルーティング戦略を迅速に追加できます。
障害診断
kprobe およびトレースポイントのトラッキングメカニズムを通じて、eBPF はカーネルとユーザーの両方のトラッキング機能を備えています。このエンドツーエンドのトラッキング機能により、迅速な障害診断が可能になります。同時に、eBPF は従来のシステムのように大量のサンプリングデータを開示することなく、より効率的な方法でプロファイリング統計をサポートし、継続的なリアルタイムプロファイリングを可能にします。
セキュリティ制御
eBPF はすべてのシステムコール、すべてのネットワークパケット、およびソケットネットワーク操作を把握できます。プロセスコンテキストのトラッキング、ネットワーク操作レベルのフィルタリング、およびシステムコールフィルタリングを統合することで、より優れたセキュリティ制御を提供します。
パフォーマンスモニタリング
静的なカウンターやゲージのみを提供する sar などの従来のシステム監視コンポーネントと比較して、eBPF はカスタマイズされた指標とイベントに対してプログラマブルな動的収集とエッジコンピューティング集約をサポートし、パフォーマンスモニタリングの効率と可能性を大幅に向上させます。
eBPF が登場した理由とは
eBPF の登場は、本質的にカーネルのイテレーション速度の遅さとシステム要件の急速な変化の矛盾を解決することを目的としています。eBPF 分野でよく用いられる例えとして、eBPF は Linux Kernel に対する JavaScript のような関係(HTML に対する JavaScript)に例えられ、プログラマビリティを強調しています。一般的に、プログラマビリティのサポートは何らかの新たな問題をもたらすことが多いものです。たとえば、カーネルモジュールもこの問題を解決するために設計されましたが、適切な境界が提供されていないため、カーネル自体の安定性に影響を与えたり、異なるカーネルバージョンでの適応が必要になったりするなどの課題があります。eBPF は以下の戦略を採用することで、安全かつ効率的なカーネルプログラマブル技術となっています。
・安全性
eBPF プログラムは実行前にベリファイアによる検証が必要で、到達不能な命令を含むことはできません。eBPF プログラムはカーネル関数を自由に呼び出すことはできず、API で定義された補助関数のみを呼び出せます。eBPF プログラムの最大スタック領域はわずか 512 バイトであり、より多くのデータを保存する場合はマップストレージを使用する必要があります。
・効率性
JIT コンパイラのサポートにより、eBPF 命令はカーネル内で実行されるため、データをユーザーモードにコピーする必要がなく、イベント処理の効率が大幅に向上します。
・標準化
BPF Helpers、BTF、および PERF MAP を通じて、開発者が利用できる標準インターフェースとデータモデルを提供しています。
・強力な機能
eBPF はレジスタ数の拡張と新しい BPF マップストレージの導入にとどまらず、4.x カーネルでは元々の単一パケットフィルタリングからカーネル状態関数、ユーザー状態関数、トレースポイント、パフォーマンスイベント、セキュリティ制御の領域へと段階的に拡張されています。
eBPF の使用方法
5 つのステップ
1. C 言語で eBPF プログラムを開発する
イベントがトリガーされた際に挿入ポイントで呼び出される eBPF サンドボックスプログラムを作成します。プログラムはカーネルモードで実行されます。
2. LLVM を使用して eBPF プログラムを BPF バイトコードにコンパイルする
eBPF プログラムを BPF バイトコードにコンパイルし、eBPF 仮想マシン内での後続の検証と実行に備えます。
3. bpf システムコールを通じて BPF バイトコードをカーネルに送信する
ユーザーモードから bpf システムコールを使用して BPF バイトコードをカーネルにロードします。
4. カーネルが BPF バイトコードを検証して実行し、対応する状態を BPF マップに保存する
カーネルが BPF バイトコードの安全性を検証し、対応するイベント発生時に正しい eBPF プログラムが呼び出されるようにします。保存が必要な状態があれば、モニタリングデータなど対応する BPF マップに書き込みます。
5. ユーザープログラムが BPF マップを通じて BPF バイトコードの実行状態をクエリする
ユーザーモードは BPF マップの内容をクエリしてバイトコードの実行状態を取得します。たとえば、キャプチャされたモニタリングデータを取得します。
完全な eBPF プログラムは通常、ユーザーモードとカーネルモードの 2 つの部分で構成されます。ユーザーモードプログラムは BPF システムコールを通じてカーネルと対話し、eBPF プログラムのロード、イベントのマウント、マップの作成と更新などのタスクを完了します。カーネルモードの eBPF プログラムはカーネル関数を自由に呼び出すことはできず、BPF 補助関数を通じて必要なタスクを完了する必要があります。特にメモリアドレスへのアクセス時は、bpf_probe_read 系列の関数を使用してメモリデータを読み取り、安全かつ効率的なメモリアクセスを確保する必要があります。eBPF プログラムに大容量のストレージが必要な場合は、アプリケーションシナリオに応じて適切なタイプの BPF マップを導入し、それを通じて実行状態データをユーザースペースプログラムに提供する必要があります。
5 つのモジュール
カーネル内では、eBPF は主に 5 つのモジュールで構成されています。
1. BPF Verifier
eBPF プログラムの安全性を確保します。ベリファイアは実行される命令を有向非循環グラフ (DAG) として作成し、プログラムに到達不能な命令が含まれていないことを確認します。次に、命令の実行プロセスをシミュレートし、無効な命令が実行されないことを保証します。なお、ここでのベリファイアは 100% の安全性を保証するものではないため、すべての BPF プログラムには厳格な監視とレビューが必要です。
2. BPF JIT
eBPF バイトコードをローカルマシン命令にコンパイルし、カーネル内でより効率的に実行します。
3. 複数の 64 ビットレジスタ、プログラムカウンタ、および 512 バイトスタックで構成されるストレージモジュール
eBPF プログラムの実行を制御し、スタックデータを保存し、入出力パラメータに関与します。
4. BPF Helpers
eBPF プログラムがカーネル内の他のモジュールと対話するための一連の関数を提供します。これらの関数は任意の eBPF プログラムから呼び出せるわけではなく、利用可能な関数の具体的なセットは BPF プログラムタイプによって決定されます。eBPF の入出力パラメータへの変更はすべて BPF 仕様に準拠する必要があり、ローカル変数の変更を除き、その他の変更は BPF Helpers を使用して完了する必要があります。BPF Helpers がサポートしていない場合は変更できません。
上記のコマンドから、異なるタイプの eBPF プログラムが実行できる BPF Helpers を確認できます。
5. BPF マップ & コンテキスト
ユーザースペースプログラムからアクセスできる大容量ストレージを提供し、eBPF プログラムの実行状態を制御するために使用されます。
まとめ
eBPF を使いこなすための前提条件はソフトウェアスタックの理解です
以上の紹介を通じて、eBPF について十分な理解が得られたと思います。eBPF が提供するのはあくまでフレームワークとメカニズムであり、核心はやはり eBPF を使用する人がソフトウェアスタックを理解し、適切な計装点を見つけ、アプリケーションの問題と関連付けられることにあります。
eBPF の真価は全面的なカバー範囲、非侵襲性、プログラマビリティにあります
1. 全面的なカバー範囲
カーネルおよびアプリケーションの計装点を全面的にカバーします。
2. 非侵襲
フックされたコードを変更する必要がありません。
3. プログラマブル
eBPF プログラムの動的配布、エッジでの命令の動的実行、動的な集約分析が可能です。
チーム情報
Alibaba Cloud のオブザーバビリティチームは、フロントエンドモニタリング、アプリケーションモニタリング、コンテナ監視、Managed Service for Prometheus、リンクトラッキング、インテリジェントアラート、運用可視化など、複数の技術分野とプロダクトをカバーし、さまざまな業界や技術シーンで活用できるオブザーバビリティソリューションとベストプラクティスを蓄積しています。
Alibaba Cloud Kubernetes モニタリングは、eBPF 技術に基づく Kubernetes クラスター向けに開発されたワンストップの非侵襲オブザーバビリティプロダクトです。Kubernetes クラスターの指標、アプリケーションリンク、ログ、イベントに基づき、IT 開発者および運用保守担当者に向けて包括的なオブザーバビリティプランの提供を目指しています。
[Alibaba Cloud Native] 公式アカウントをフォローし、バックグラウンドでキーワード [K8s panorama] に返信すると、全景図の高解像度ダウンロード先を取得できます。
eBPF とは
eBPF はカーネル内でサンドボックス化されたプログラムを実行できる技術であり、カーネルおよびユーザープログラムのイベント発生時に安全にコードを挿入する仕組みを提供し、カーネル開発者以外もカーネルを制御できるようにします。カーネルの発展に伴い、eBPF は初期のパケットフィルタリングからネットワーク、カーネル、セキュリティ、トレーシングなどの機能へと段階的に拡張されてきました。さらに、その機能特性は現在も急速に発展し続けています。初期の BPF は classic BPF、略して cBPF と呼ばれていました。この機能拡張により、現在の BPF は extended BPF、略して eBPF と呼ばれています。
eBPF のアプリケーションシナリオとは
ネットワーク最適化
eBPF は高性能とスケーラビリティを兼ね備えており、ネットワークソリューションにおけるネットワークパケット処理の最適な選択肢となっています。
・高性能
JIT コンパイラにより、カーネルネイティブコードに近い実行効率を実現します。
・高いスケーラビリティ
カーネルコンテキスト内で、プロトコル解析やルーティング戦略を迅速に追加できます。
障害診断
kprobe およびトレースポイントのトラッキングメカニズムを通じて、eBPF はカーネルとユーザーの両方のトラッキング機能を備えています。このエンドツーエンドのトラッキング機能により、迅速な障害診断が可能になります。同時に、eBPF は従来のシステムのように大量のサンプリングデータを開示することなく、より効率的な方法でプロファイリング統計をサポートし、継続的なリアルタイムプロファイリングを可能にします。
セキュリティ制御
eBPF はすべてのシステムコール、すべてのネットワークパケット、およびソケットネットワーク操作を把握できます。プロセスコンテキストのトラッキング、ネットワーク操作レベルのフィルタリング、およびシステムコールフィルタリングを統合することで、より優れたセキュリティ制御を提供します。
パフォーマンスモニタリング
静的なカウンターやゲージのみを提供する sar などの従来のシステム監視コンポーネントと比較して、eBPF はカスタマイズされた指標とイベントに対してプログラマブルな動的収集とエッジコンピューティング集約をサポートし、パフォーマンスモニタリングの効率と可能性を大幅に向上させます。
eBPF が登場した理由とは
eBPF の登場は、本質的にカーネルのイテレーション速度の遅さとシステム要件の急速な変化の矛盾を解決することを目的としています。eBPF 分野でよく用いられる例えとして、eBPF は Linux Kernel に対する JavaScript のような関係(HTML に対する JavaScript)に例えられ、プログラマビリティを強調しています。一般的に、プログラマビリティのサポートは何らかの新たな問題をもたらすことが多いものです。たとえば、カーネルモジュールもこの問題を解決するために設計されましたが、適切な境界が提供されていないため、カーネル自体の安定性に影響を与えたり、異なるカーネルバージョンでの適応が必要になったりするなどの課題があります。eBPF は以下の戦略を採用することで、安全かつ効率的なカーネルプログラマブル技術となっています。
・安全性
eBPF プログラムは実行前にベリファイアによる検証が必要で、到達不能な命令を含むことはできません。eBPF プログラムはカーネル関数を自由に呼び出すことはできず、API で定義された補助関数のみを呼び出せます。eBPF プログラムの最大スタック領域はわずか 512 バイトであり、より多くのデータを保存する場合はマップストレージを使用する必要があります。
・効率性
JIT コンパイラのサポートにより、eBPF 命令はカーネル内で実行されるため、データをユーザーモードにコピーする必要がなく、イベント処理の効率が大幅に向上します。
・標準化
BPF Helpers、BTF、および PERF MAP を通じて、開発者が利用できる標準インターフェースとデータモデルを提供しています。
・強力な機能
eBPF はレジスタ数の拡張と新しい BPF マップストレージの導入にとどまらず、4.x カーネルでは元々の単一パケットフィルタリングからカーネル状態関数、ユーザー状態関数、トレースポイント、パフォーマンスイベント、セキュリティ制御の領域へと段階的に拡張されています。
eBPF の使用方法
5 つのステップ
1. C 言語で eBPF プログラムを開発する
イベントがトリガーされた際に挿入ポイントで呼び出される eBPF サンドボックスプログラムを作成します。プログラムはカーネルモードで実行されます。
2. LLVM を使用して eBPF プログラムを BPF バイトコードにコンパイルする
eBPF プログラムを BPF バイトコードにコンパイルし、eBPF 仮想マシン内での後続の検証と実行に備えます。
3. bpf システムコールを通じて BPF バイトコードをカーネルに送信する
ユーザーモードから bpf システムコールを使用して BPF バイトコードをカーネルにロードします。
4. カーネルが BPF バイトコードを検証して実行し、対応する状態を BPF マップに保存する
カーネルが BPF バイトコードの安全性を検証し、対応するイベント発生時に正しい eBPF プログラムが呼び出されるようにします。保存が必要な状態があれば、モニタリングデータなど対応する BPF マップに書き込みます。
5. ユーザープログラムが BPF マップを通じて BPF バイトコードの実行状態をクエリする
ユーザーモードは BPF マップの内容をクエリしてバイトコードの実行状態を取得します。たとえば、キャプチャされたモニタリングデータを取得します。
完全な eBPF プログラムは通常、ユーザーモードとカーネルモードの 2 つの部分で構成されます。ユーザーモードプログラムは BPF システムコールを通じてカーネルと対話し、eBPF プログラムのロード、イベントのマウント、マップの作成と更新などのタスクを完了します。カーネルモードの eBPF プログラムはカーネル関数を自由に呼び出すことはできず、BPF 補助関数を通じて必要なタスクを完了する必要があります。特にメモリアドレスへのアクセス時は、bpf_probe_read 系列の関数を使用してメモリデータを読み取り、安全かつ効率的なメモリアクセスを確保する必要があります。eBPF プログラムに大容量のストレージが必要な場合は、アプリケーションシナリオに応じて適切なタイプの BPF マップを導入し、それを通じて実行状態データをユーザースペースプログラムに提供する必要があります。
5 つのモジュール
カーネル内では、eBPF は主に 5 つのモジュールで構成されています。
1. BPF Verifier
eBPF プログラムの安全性を確保します。ベリファイアは実行される命令を有向非循環グラフ (DAG) として作成し、プログラムに到達不能な命令が含まれていないことを確認します。次に、命令の実行プロセスをシミュレートし、無効な命令が実行されないことを保証します。なお、ここでのベリファイアは 100% の安全性を保証するものではないため、すべての BPF プログラムには厳格な監視とレビューが必要です。
2. BPF JIT
eBPF バイトコードをローカルマシン命令にコンパイルし、カーネル内でより効率的に実行します。
3. 複数の 64 ビットレジスタ、プログラムカウンタ、および 512 バイトスタックで構成されるストレージモジュール
eBPF プログラムの実行を制御し、スタックデータを保存し、入出力パラメータに関与します。
4. BPF Helpers
eBPF プログラムがカーネル内の他のモジュールと対話するための一連の関数を提供します。これらの関数は任意の eBPF プログラムから呼び出せるわけではなく、利用可能な関数の具体的なセットは BPF プログラムタイプによって決定されます。eBPF の入出力パラメータへの変更はすべて BPF 仕様に準拠する必要があり、ローカル変数の変更を除き、その他の変更は BPF Helpers を使用して完了する必要があります。BPF Helpers がサポートしていない場合は変更できません。
上記のコマンドから、異なるタイプの eBPF プログラムが実行できる BPF Helpers を確認できます。
5. BPF マップ & コンテキスト
ユーザースペースプログラムからアクセスできる大容量ストレージを提供し、eBPF プログラムの実行状態を制御するために使用されます。
まとめ
eBPF を使いこなすための前提条件はソフトウェアスタックの理解です
以上の紹介を通じて、eBPF について十分な理解が得られたと思います。eBPF が提供するのはあくまでフレームワークとメカニズムであり、核心はやはり eBPF を使用する人がソフトウェアスタックを理解し、適切な計装点を見つけ、アプリケーションの問題と関連付けられることにあります。
eBPF の真価は全面的なカバー範囲、非侵襲性、プログラマビリティにあります
1. 全面的なカバー範囲
カーネルおよびアプリケーションの計装点を全面的にカバーします。
2. 非侵襲
フックされたコードを変更する必要がありません。
3. プログラマブル
eBPF プログラムの動的配布、エッジでの命令の動的実行、動的な集約分析が可能です。
チーム情報
Alibaba Cloud のオブザーバビリティチームは、フロントエンドモニタリング、アプリケーションモニタリング、コンテナ監視、Managed Service for Prometheus、リンクトラッキング、インテリジェントアラート、運用可視化など、複数の技術分野とプロダクトをカバーし、さまざまな業界や技術シーンで活用できるオブザーバビリティソリューションとベストプラクティスを蓄積しています。
Alibaba Cloud Kubernetes モニタリングは、eBPF 技術に基づく Kubernetes クラスター向けに開発されたワンストップの非侵襲オブザーバビリティプロダクトです。Kubernetes クラスターの指標、アプリケーションリンク、ログ、イベントに基づき、IT 開発者および運用保守担当者に向けて包括的なオブザーバビリティプランの提供を目指しています。
Related Articles
-
A detailed explanation of Hadoop core architecture HDFS
Knowledge Base Team
-
What Does IOT Mean
Knowledge Base Team
-
6 Optional Technologies for Data Storage
Knowledge Base Team
-
What Is Blockchain Technology
Knowledge Base Team
Explore More Special Offers
-
Short Message Service(SMS) & Mail Service
50,000 email package starts as low as USD 1.99, 120 short messages start at only USD 1.00
