我遇到了一个有趣的问题,在一个具有2个处理器的系统上创建的PERCPU_ARRAY创建一个具有2个每个CPU元素的阵列,在另一个具有2个处理器的系统上创建一个具有128个每个CPU元素的阵列。后者对我来说是意外的!
我发现此行为的方式是,一个程序为CPU的数量分配了一个数组(使用get_nprocs_conf(3)),然后将PERCPU_ARRAY读入其中(使用bpf_map_lookup_elem()),该程序最终写入数组末尾并崩溃。
我想找出在读取BPF映射的程序中确定哪个正确方法是在系统上使用的PERCPU_ARRAY中的元素数量。
失败的话,我认为第二个最佳方法是选择一个“足够大”的读取缓冲区。在这里,问题是相似的:那个数字是多少,有没有办法在运行时学习它?

最佳答案

问题来自阅读bpftool的源代码,该代码指出了这一点:

unsigned int get_possible_cpus(void)
{
        int cpus = libbpf_num_possible_cpus();

        if (cpus < 0) {
                p_err("Can't get # of possible cpus: %s", strerror(-cpus));
                exit(-1);
        }
        return cpus;
}

int libbpf_num_possible_cpus(void)
{
        static const char *fcpu = "/sys/devices/system/cpu/possible";
        static int cpus;
        int err, n, i, tmp_cpus;
        bool *mask;

/* ---8<--- snip */

}
这就是他们的做法!

10-07 20:22