私は次のコードに似たテストケースを持っていますhttps://github.com/xdp-project/xdp-tutorial/CPU ごとの配列に統計マップを維持し、統計を定期的に表示するユーザー空間コードです。
これを実行すると、ユーザー スペース コードには常にゼロが表示されます。eBPF カーネル コードを bpf_trace_printk でインストルメント化しましたが、マップに正しい値が設定されているようです。ユーザー コードはすべての可能な CPU を反復処理していますが、CPU ごとの配列スロットでは常にゼロが検出されます。
何が間違っているのか誰か教えてもらえますか?
私のテストケースはここ ; af_xdp_kern.cはeBPFコード、af_xdp_user.cはeBPFコードを駆動するユーザースペースコード、filter-xdp_stats.cは統計を表示するコードです。これらはすべてそのディレクトリの「make」でビルドされ、私が使用する実行スクリプトがあります。
tjcw@r28b29-n10:~/workspace/bpf-examples/AF_XDP-filter/netperf-namespace$ sudo FILTER=af_xdp_kern ./run.sh
マシン上の2つのネットワーク名前空間間でデータが転送されるユーザーコードとeBPFコードを実行します。実行中は、
tjcw@r28b29-n10:~/workspace/bpf-examples/AF_XDP-filter$ sudo ./filter-xdp_stats
統計情報が表示されるはずですが、実際にはゼロが表示されます。
私のテスト ケースは '1.0' BPF インターフェイスにコーディングされていますが、xdp-tutorial のコードはプレリリース BPF インターフェイスにコーディングされています。
私はUbuntu 22.04をuname -aで実行しています
tjcw@r28b29-n10:~/workspace/bpf-examples/AF_XDP-filter$ uname -a
Linux r28b29-n10 5.15.0-48-generic #54-Ubuntu SMP Fri Aug 26 13:26:29 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
tjcw@r28b29-n10:~/workspace/bpf-examples/AF_XDP-filter$
ご協力いただきありがとうございます!
答え1
統計表示アプリケーションは、ユーザーおよび eBPF アプリケーションと同じネットワーク名前空間で実行する必要があります ( の同じインスタンス内でも) ip netns exec
。