Coolbpfの最新機能分析：OpenAnolisコミュニティにおけるeNetSTLのオープンソース化

> 本記事は[こちらのブログ](https://www.alibabacloud.com/blog/analysis-of-coolbpf-latest-features-open-sourcing-of-enetstl-in-the-openanolis-community_601889?spm=a2c65.11461433.0.0.4ee35355MlSWeA)を参考にしています。
> 翻訳にはアリババクラウドの[ModelStudio](https://www.alibabacloud.com/en/product/modelstudio)([Qwen](https://www.alibabacloud.com/en/solutions/generative-ai/qwen))を使用しております。

<div class="wrap-main-left-article markdown-body">
![1](https://yqintl.alicdn.com/69da85e6bd18295151d835295e34ea01ba6eaa4a.png)

OpenAnolis System Operation & Maintenance Alliance(SOMA) による

## 背景
SOMA は主に中国情報通信技術研究院 (CAICT)、大学、プラットフォーム、および運用管理 (O&M) メーカーなどの機関と協力して、OS ビジネスシステムと O&M システムの評価基準とシステムを確立することに焦点を当てています。Coolbpf は、SOMA の評価システムのデータ収集の基本コンポーネントであり、SysOM 運用システムのノードエンドでの eBPF データ収集プラットフォームでもあります。SOMA の仕事とビジネス開発のニーズに対応するために、Coolbpf は最近多くのアップデートを受け、複数のオープンソース機能と新しく開発された機能が導入されました。具体的には、eNetSTL ネットワーク機能、ユーザースペースプローブ (ユーザースペースとカーネルスペース間の切り替えを必要としない bpftime)、eBPF パケットキャプチャ (rdump)、およびマルチ言語連続プロファイリングをサポートしています。eBPF 技術が生産環境で普及し、広く使用されるにつれて、コンパイル環境の設定もかなり成熟しています。さらに、3.10 などの低いカーネルバージョンが 4.19 または 5.10 に徐々に移行するため、Coolbpf はリモートコンパイルと低バージョンドライバー機能を削除する計画です。将来、Coolbpf はユーザースペースプローブ、ソフトウェアネットワーキング、プロファイリングなどの特定の機能に焦点を当てます。これらの機能は、より高いレベルの特定のアプリケーションに対してライブラリの形で提供され、開発者はシステムレベルの粒度の細かいメトリクス収集よりも、自分たちのビジネスアプリケーション開発に集中することができます。彼らは直接 Coolbpf ライブラリ関数を呼び出して要求を満たすことができます。以下に Coolbpf の機能を示します：

![2](https://yqintl.alicdn.com/8022fa4c213cc2655537157816a4c4ce4c20cd03.png)

しかし、頻繁に利用されている BTF ダウンロードサービスは継続されます。これにより、ユーザーは 4.19 および一部の 5.10 カーネルバージョンで BTF ファイルをデフォルトで公開していない場合でも、自分で BTF ファイルを生成せずに eBPF を利用することができます。リリース以来、BTF ダウンロードサイトは 2 億回以上呼ばれています。BTF ダウンロードサイト: <a href="https://mirrors.openanolis.cn/coolbpf/btf/" target="_blank">https://mirrors.openanolis.cn/coolbpf/btf/</a>

Coolbpf の最近の更新に応じて、一連の記事を通じて各機能と使用方法を紹介します。まずは、東南大学の沈典教授チームによって寄稿された eNetSTL ソフトウェアネットワーク機能加速ライブラリを見てみましょう (著者: 沈典、楊斌、楊漢林、趙倫琪)。コードは <a href="https://gitee.com/anolis/coolbpf" target="_blank">https://gitee.com/anolis/coolbpf</a> にマージされています。

### eNetSTL ソフトウェアネットワーク機能ライブラリ
eNetSTL は、eBPF の kfunc と kptr 技術に基づく eBPF ネットワーク機能加速ライブラリです。eBPF インフラストラクチャ (命令セットなど) を変更せずに、実装不可能または性能基準を満たしていない特定の共通機能を eNetSTL に抽象化することで、eBPF 基盤のネットワーク機能を加速します。eNetSTL は上記の共通パターンを抽象化し、高性能で低オーバーヘッドの API として実装します。問題を解決しながら、過度なコード拡張を避けることができます。eNetSTL は eBPF のカーネル関数 (kfunc) とカーネルポインタ (kptr) 技術に基づいて実装されており、カーネルモジュール内でその API を実装することで、カーネルの変更を必要としません。現在、eNetSTL は kfunc と kptr インターフェースを除いて自己完結しており、さまざまなカーネルバージョン間で良好な互換性を維持できます。eNetSTL に含まれる内容は以下の図に示されています：

![3](https://yqintl.alicdn.com/0e368170bf026f9452706ecccbf691b62c5f986a.png)

具体的には、eNetSTL には以下の内容が含まれています：

1. メモリラッパー: eBPF のセキュリティ保証を破ることなく、非連続メモリを使用できるようにします。
2. アルゴリズム: ビット演算、SIMD に基づく並列ハッシュ計算、並列比較アルゴリズム。
3. データ構造: リストバケットデータ構造、GEO (幾何学的ランダム数) 分布を持つ乱数プールをサポート。

メモリラッパーの実装は kfunc と kptr 技術を十分に活用しています。その主な設計には以下が含まれます：

- 新しく割り当てられたすべてのノード kptr をプロキシ kptr で管理し、BPF MAP が静的な数の kptr のみを格納できるという制限を回避します。
- eNetSTL はすべての下位ポインタを管理し、kfunc を通じてノード間のポインタルーティングを実装し、kfunc に KF_ACQUIRE タグを追加することで次のノードのポインタを安全に取得し、eBPF で直接ポインタにアクセスします (例: a->b)。

以下はメモリラッパーの API の一部です：

![4](https://yqintl.alicdn.com/beb6fc147b82af8e46464d3dbba215d855787ac8.png)

現在、Coolbpf における eNetSTL には、ビット演算、SIMD に基づく並列ハッシュ計算、並列比較アルゴリズムなど、eBPF 基盤のネットワーク機能のパフォーマンスを向上させる一連のアルゴリズムが含まれています。他のコンポーネントはエンジニアリング適応中であり、Coolbpf における eNetSTL の機能は今後も継続的に更新されます。

### eNetSTL の使い方
#### ドライバーのコンパイル
eNetSTL ドライバーをコンパイルするには以下のツールが必要です：
- GCC コンパイラのインストール
- kernel-devel と kernel-headers のインストール
- pahole (BTF 情報を生成するために使用) のインストール

上記のコンパイル環境をインストールした後、`cd bpf_kernel_modules/eNetSTL && make` コマンドを使用してドライバーをコンパイルします。コンパイル後に生成されるドライバーファイルは `bpf_kernel_modules/eNetSTL/eNetSTL.ko` です。`insmod eNetSTL.ko` コマンドを使用してドライバーをインストールします。

#### サンプルプログラムのコンパイル
eNetSTL サンプルプログラムをコンパイルするには以下のツールが必要です：
- Clang/LLVM のインストール
- Rust コンパイルツールチェーンのインストール (Coolbpf は Rust 環境を