是:BPF 如何计算 PERCPU_ARRAY 的 CPU 的数量?
Was: How does BPF calculate number of CPU for PERCPU_ARRAY?
我遇到了一个有趣的问题,在一个有 2 个处理器的系统上创建的 PERCPU_ARRAY 创建了一个包含 2 个 per-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 */
}
所以他们就是这样的!
我遇到了一个有趣的问题,在一个有 2 个处理器的系统上创建的 PERCPU_ARRAY 创建了一个包含 2 个 per-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 */
}
所以他们就是这样的!