カーネルが複数の CPU で同時に実行できる eBPF プログラムのインスタンスの数に制限はありますか (python GIL の問題と同様)。
特に、eBPF tc プログラムは複数の CPU で同時に動作できますか?
複数の CPU で同じコードを実行している場合、eBPF によってカーネル データ構造のロックはどのように行われますか?
カーネルが複数の CPU で同時に実行できる eBPF プログラムのインスタンスの数に制限はありますか (python GIL の問題と同様)。
特に、eBPF tc プログラムは複数の CPU で同時に動作できますか?
複数の CPU で同じコードを実行している場合、eBPF によってカーネル データ構造のロックはどのように行われますか?
特に、eBPF tc プログラムは複数の CPU で同時に動作できますか?
はい(以下の詳細を参照)。
複数の CPU で同じコードを実行している場合、eBPF によってカーネル データ構造のロックはどのように行われますか?
BPF のマップへの同時アクセスは、RCU メカニズムによって保護されます。ただし、現在、BPF プログラム自体で並行コードを保護する方法はありません。したがって、たとえば、最初のコアで実行されている BPF プログラムは、2 番目のコアで実行されている同じプログラムのルックアップ呼び出しと更新呼び出しの間に値を更新する可能性があります。
場合によっては、パフォーマンスを向上させるために、CPU ごとのマップ (CPU ごとの配列や CPU ごとのハッシュマップなど) を使用できます。その場合、ルックアップ、更新、および削除の API は同じままですが、実際には各コアにマップの値の独自のコピーがあります。これは、たとえば、マップ内のカウンターをインクリメントする場合、各コアは独自のカウンターを参照し、ユーザー空間でそれらの値を集計して合計カウンターを取得する必要があることを意味します。もちろん、これは常にユースケースに適合するとは限りません。