У меня есть тестовый пример, похожий на код вhttps://github.com/xdp-project/xdp-tutorial/который поддерживает статистическую карту в массиве каждого процессора, и код пользовательского пространства, который периодически отображает статистику.
Когда я запускаю это, код пользовательского пространства всегда отображает нули. Я оснастил свой код ядра eBPF с помощью bpf_trace_printk, и он, похоже, помещает правильные значения в карту. Пользовательский код перебирает все возможные ЦП, но всегда находит нули в слотах массива per-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 с передачей данных между двумя сетевыми пространствами имен на машине. Во время работы,
tjcw@r28b29-n10:~/workspace/bpf-examples/AF_XDP-filter$ sudo ./filter-xdp_stats
должен отображать статистику, но на самом деле отображает нули.
Мой тестовый пример написан на основе интерфейса BPF «1.0», тогда как код в 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
.