どのプロセスがどのファイルを開いているか、パケットがどこでドロップされたか、あるいはカーネルのどの関数が処理が遅いかを知りたい場合、以前はカーネルにパッチを当てて再起動する必要がありました。eBPF によって、そのような手間は不要になりました。
中核となるアイデア
eBPF を使用すると、ごく小さなプログラムをカーネルにロードし、システムコール、ネットワークイベント、カーネルの内部関数といったフックポイントに紐付けることができます。 プログラムは制御された仮想マシン内で実行され、ロード前に検証ツールによってチェックが行われます。無限ループがないこと、メモリへの恣意的なアクセスがないこと、命令数の制限があることが確認されます。
このチェックのおかげで、不具合のあるeBPFプログラムは拒否され、システムをクラッシュさせることはありません。これは、従来のカーネルモジュールとは大きく異なります。
現在最も多く利用されている3つの分野
- 監視:システム呼び出しごとの遅延を測定、フレイムグラフを作成、サブプロセスの進捗を追跡 — アプリケーションの修正は不要
- ネットワーク:ドライバ層でパケットのフィルタリングとルーティングを行い、ネットワークスタック全体を経由するよりもはるかに高速
- セキュリティ:ポリシーに基づいてシステムコールをブロックし、カーネルレベルで不審な動作をログに記録
今すぐ端末で試す
sudo apt install bpfcc-tools
sudo execsnoop-bpfcc # mọi tiến trình mới sinh ra
sudo opensnoop-bpfcc # mọi tệp được mở
sudo biolatency-bpfcc # phân bố độ trễ ổ đĩa知っておくべき制限事項
Verifierはかなり厳格です。複雑なプログラムは、意味不明なメッセージとともに拒否されることがよくあります。カーネルの内部関数へのフックポイントも、バージョン間で安定していません。カーネルが関数の名前を変更しただけで、プログラムが動作しなくなってしまいます。長期的に実行する必要があるコードについては、内部関数ではなく、安定したフックポイントを利用することをお勧めします。
Thảo luận