ebpf lru ハッシュ マップ (bpf_map_type_lru_hash
) 内の要素が誤って削除されていることがわかりました。以下のコードでは、サイズ 8 の lru ハッシュ マップを挿入し、その内容を毎秒出力します。
リーリー
リーリー
マップには 8 つのエントリがあるため、4 行目には 4 つの値が表示されると予想しましたが、エントリ(1, 1) が削除されているため、3 つしか表示されません。
max_entries を 1024 に変更すると、この問題は 200 番目の要素を挿入した後に発生することに気付きましたが、その後も発生することがあります。一貫性がありません。
Linux カーネル 5.16.7 を実行している運用サーバーでこれをテストしました。
Linux VM でテストし、カーネルを 6.2.8 にアップグレードしたところ、エビクション ポリシーの違いに気づきました。たとえば、
max_entries が 8 の場合、次のようになります。
リーリー
max_entries
正解
LRU は、「アクティブ リスト」と「非アクティブ リスト」の 2 つの部分に分かれており、そのタスクは、要素が最近アクセスされたかどうかに基づいて、要素を一方の部分からもう一方の部分に定期的に移動することです。それは本当の LRU (アクセスするたびに項目が先頭に移動するわけではない) ではありません。
したがって、6.2.8 の動作は単純かつ一貫しているように見えます。おそらく、すべてのキーが「非アクティブ リスト」に含まれていると考えられます (スキャン タイプのアクセス パターンとしてはそれほど驚くべきことではありません。あるいは、単にどれも昇格する機会がなかっただけかもしれません)。 、そして全員が追い出されました。 5.16 についてはよくわかりませんが、ローカルのフリーリストとすべてのアップデートが同じ CPU から実行されていることに関係があるのかもしれません。
以上が要素が eBPF LRU ハッシュマップから誤って削除されるの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。