static void check_on_cpu(int cpu, struct perf_event_attr *attr) { struct bpf_perf_event_value value2; int pmu_fd, error = 0; cpu_set_t set; __u64 value; Expand All @@ -46,8 +47,18 @@ static void check_on_cpu(int cpu, struct perf_event_attr *attr) fprintf(stderr, "Va...
BPF_PROG_TYPE_PERF_EVENT: BPF_FUNC_perf_event_output() BPF_FUNC_get_stackid() BPF_FUNC_get_stack() BPF_FUNC_perf_prog_read_value() Tracing functions 6. cgroup套接字程序 该程序允许cgroup在其包含的进程中控制网络流量。在传入cgroup控制之前,通过cgroup套接字程序,可以决定如何处理这些数据包。cili...
bpf_perf_event_output, bpf_get_stackid, bpf_get_current_current_task bpf_current_task_under_cgroup, bpf_get_numa_node_id, bpf_probe_read_str, bpf_perf_event_read_value, bpf_perf_prog_read_value, bpf_get_stack, bpf_get_current_cgroup_id, bpf_map_push_elem, bpf_map_pop_ele...
之后,你还需要自行open和attachperf_event: static int open_and_attach_perf_event(int freq, struct bpf_program *prog, struct bpf_link *links[]) { struct perf_event_attr attr = { .type = PERF_TYPE_SOFTWARE, .freq = 1, .sample_period = freq, .config = PERF_COUNT_SW_CPU_CLOCK, }; ...
struct bpf_perf_event_value c = {}; error = bpf_perf_event_read_value( &cpu_instructions_event_reader, *cpu_id, &c, sizeof(c)); if (error) return 0; return c.counter; } static __always_inline u64 get_on_cpu_cache_miss(u32 *cpu_id) { long error; struct bpf_perf_event_va...
return perf_event_read_local(ee->event, value, enabled, running); } BPF_CALL_2(bpf_perf_event_read, struct bpf_map *, map, u64, flags) { u64 value = 0; int err; err = get_map_perf_counter(map, flags, &value, NULL, NULL); /* * this api is ugly ...
(data.comm)); events.perf_submit(ctx, &data, sizeof(data)); } """ # initialize BPF b = BPF(text=bpf_text) b.attach_kprobe(event=function, fn_name="trace_stack") TASK_COMM_LEN = 16 # linux/sched.h matched = b.num_open_kprobes() # 判断输入的 function 是否合法 if matched =...
使用perf event 的原理和使用 ring buffer 非常类似,使用我们的框架时,也只需要在头文件中定义好所需导出的事件,然后定义一下 perf event map: struct{ __uint(type,BPF_MAP_TYPE_PERF_EVENT_ARRAY); __uint(key_size,sizeof(u32)); __uint(value_size,sizeof(u32)); ...
perf_event_open(): 和 perf(1) 工具的用法一样,BPF 跟踪工具也开始频繁地这样使用了.相关的支持已经加入 Linux 内核 4.17 版本(perf_uprobe PMU). 在内核中同时包含了 register_uprobe_event() 函数, 和 register_kprobe() 函数类似, 但是并没有以 API 地形式显露. ...
BPF_MAP_TYPE_PERF_EVENT_AYYAY:Perf事件数组映射,该映射将perf_events数据存储在环形缓存区,用于BPF程序和用户空间程序进行实时通信。其可以将内核跟踪工具发出的事件转发给用户空间程序,使很多可观测工具的基础。 BPF_MAP_TYPE_PERCUP_HASH:哈希表映射的改进版本,我们可以将此哈希表分配给单个独立的CPU(每个CPU都有...