要素が eBPF LRU ハッシュマップから誤って削除される

PHPz
リリース: 2024-02-06 09:36:11
転載
566 人が閲覧しました

元素被错误地从 eBPF LRU 哈希图中逐出

質問の内容

ebpf lru ハッシュ マップ (bpf_map_type_lru_hash) 内の要素が誤って削除されていることがわかりました。以下のコードでは、サイズ 8 の lru ハッシュ マップを挿入し、その内容を毎秒出力します。 リーリー

上記のプログラムを実行すると、次のように表示されます:

リーリー

マップには 8 つのエントリがあるため、4 行目には 4 つの値が表示されると予想しましたが、エントリ

(1, 1) が削除されているため、3 つしか表示されません。

max_entries を 1024 に変更すると、この問題は 200 番目の要素を挿入した後に発生することに気付きましたが、その後も発生することがあります。一貫性がありません。

この問題は、マップを作成してマップに挿入する xdp プログラムでこの問題を確認したため、ユーザー空間からのマップの作成/挿入に限定されません。上記は、実際のプログラムで確認した問題を再現しています。実際のプログラムにも 1024 個のエントリがありますが、16 個の要素を挿入した後にこの問題が発生することに気付きました。

Linux カーネル 5.16.7 を実行している運用サーバーでこれをテストしました。

Linux VM でテストし、カーネルを 6.2.8 にアップグレードしたところ、エビクション ポリシーの違いに気づきました。たとえば、

max_entries が 8 の場合、次のようになります。 リーリー max_entries

が 1024 の場合、1025 番目の要素を追加すると、要素の総数は 897 になることに気付きました。実稼働サーバーではカーネル 6.2.8 を使用してテストできませんでした。

正解


LRUハッシュマップは項目の最大数を

正確に
保証するものではなく、実装は明らかにそれを超えて機能するように設計されています。 8 複数のプロジェクトに優れたパフォーマンスを提供します。コードをざっと見たところ、次のことがわかりました:

LRU は、「アクティブ リスト」と「非アクティブ リスト」の 2 つの部分に分かれており、そのタスクは、要素が最近アクセスされたかどうかに基づいて、要素を一方の部分からもう一方の部分に定期的に移動することです。それは本当の LRU (アクセスするたびに項目が先頭に移動するわけではない) ではありません。
  1. マップがいっぱいで、新しい項目を挿入する前に何かを削除する必要がある場合、コードは 1 回のパスで非アクティブ リストから最大 128 個の項目を削除します。非アクティブ リストが空の場合に限り、アクティブなリストから 1 つの項目を削除します。
  2. データが入力されるのを待っている割り当て済みアイテムを含む CPU ごとの「ローカル空きリスト」もあります。空で実行されると、グローバル空きリストから取得しようとします。そのリストが空の場合は、 、立ち退きパスに入ります。ローカル フリー リストの目標サイズは 4 エントリです。
  3. したがって、6.2.8 の動作は単純かつ一貫しているように見えます。おそらく、すべてのキーが「非アクティブ リスト」に含まれていると考えられます (スキャン タイプのアクセス パターンとしてはそれほど驚くべきことではありません。あるいは、単にどれも昇格する機会がなかっただけかもしれません)。 、そして全員が追い出されました。 5.16 についてはよくわかりませんが、ローカルのフリーリストとすべてのアップデートが同じ CPU から実行されていることに関係があるのか​​もしれません。
基本的に、このデータ型はあなたが使用している方法で使用されることを意図したものではないと思います。エラーはあなたが期待したものです。同意できない場合は、カーネル開発者と話し合う必要があると思います。

以上が要素が eBPF LRU ハッシュマップから誤って削除されるの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:stackoverflow.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!