我有一個類似於程式碼的測試案例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 接口。
我正在使用 uname -a 運行 Ubuntu 22.04
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
。