3.11 Android eBPF Hello World调试(五)

一,写在前面

HelloWorld程序的目标是跟踪当前core最近得到调度的任务ID;有同学遇到这样一个情况?明明cpu的核心只有8个核,但从map中却遍历了1024条数据。

为什么会出现从eBPF map中读取的数据都是1024个条目的情况呢?

那是因为不同的eBPF map类型有着不同的香味。例如,BPF_MAP_TYPE_ARRAY类型的map总是有一个固定的大小,并且索引是从0开始的连续整数。如果你创建了一个大小为1024的ARRAY map,那么读取时总会返回1024个结果,无论这些条目是否真的有数据被写入。

二,问题示例

以HelloWorld为例,如果map类型定义为ARRAY,如下:

DEFINE_BPF_MAP(cpu_pid_map, ARRAY, int, uint32_t, 1024)

那么该map类型就是array类型的。因为map大小为1024,其key就是从0到1023;当我们遍历map时,就会遍历出1024个元素。

先说说array类型,上面代码中的ARRAY,定义在bionic/libc/kernel/uapi/linux/bpf.h中,如下:

enum bpf_map_type {
  BPF_MAP_TYPE_UNSPEC,
  BPF_MAP_TYPE_HASH,
  BPF_MAP_TYPE_ARRAY,
  BPF_MAP_TYPE_PROG_ARRAY,
  BPF_MAP_TYPE_PERF_EVENT_ARRAY,
  BPF_MAP_TYPE_PERCPU_HASH,
  BPF_MAP_TYPE_PERCPU_ARRAY,
  BPF_MAP_TYPE_STACK_TRACE,
  

你可能感兴趣的:(Android,eBPF,Book,android,ebpf,性能)