我有一个类似于代码的测试用例https://github.com/xdp-project/xdp-tutorial/它在每个 CPU 数组中维护一个统计图,用户空间代码会定期显示统计数据。
当我运行此代码时,用户空间代码始终显示零。我已使用 bpf_trace_printk 检测了我的 eBPF 内核代码,它似乎将正确的值放入了映射中。用户代码正在遍历所有可能的 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
运行用户代码和 eBPF 代码,数据在机器上的 2 个网络命名空间之间传输。运行时,
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
。