这就是BPF Map的作用,BPF程序本身只有指令,不会包含实际数据及其状态。我们可以在BPF程序创建BPF Map,这个Map像其他编程语言具有的Map数据结构类似,也有很多类型,常用的就是Hash和Array类型,如下所示: Hash tables, Arrays LRU (Least Recently Used) Ring Buffer Stack Trace LPM (Longest Prefix match) 下图所示是...
BPF_HASH(start, struct request *); void trace_start(struct pt_regs *ctx, struct request *req) { // stash start timestamp by request ptr u64 ts = bpf_ktime_get_ns(); start.update(&req, &ts); } ... b.attach_kprobe(event="blk_start_request", fn_name="trace_start") b.attach...
这就是BPF Map的作用,BPF程序本身只有指令,不会包含实际数据及其状态。我们可以在BPF程序创建BPF Map,这个Map像其他编程语言具有的Map数据结构类似,也有很多类型,常用的就是Hash和Array类型,如下所示: Hash tables, Arrays LRU (Least Recently Used) Ring Buffer Stack Trace LPM (Longest Prefix match) 下图所示是...
同为BPF 映射类型,BPF_ARRAY 可以被看作为一类特殊的 BPF_HASH( ARRAY 的 key 从 0 开始,为非零整数),但有一下几点区别。BPF_ARRAY 在初始化时会预先分配空间,并设置为零。 BPF_ARRAY 的大小是固定的,其元素不能被删除。 BPF_ARRAY 通常用于保存 val 可能会更新的信息,由于 key 默认为非负整数索引,因此...
BPF_HASH(counts, struct key_t); int trace_kfree_skb(struct pt_regs *ctx) { u64 zero = 0, *val, pid; pid = bpf_get_current_pid_tgid() >> 32; struct key_t key = {}; key.pid = pid; val = counts.lookup_or_try_init(&key, &zero); ...
structbpf_map_defSEC("maps")my_hash_map={.type=BPF_MAP_TYPE_HASH,.key_size=sizeof(__u32),.value_size=sizeof(__u64),.max_entries=1024,}; 1. 2. 3. 4. 5. 6. 在上述代码中,我们通过struct bpf_map_def定义了一个名为my_hash_map的BPF映射对象。其中,.type字段指定了映射类型为BPF_...
随着多 CPU 架构的成熟发展,BPF Map 也引入了per-cpu 类型,如 BPF_MAP_TYPE_PERCPU_HASH、BPF_MAP_TYPE_PERCPU_ARRAY 等,每个 CPU 都会存储并看到它自己的 Map 数据,从属于不同 CPU 之间的数据是互相隔离的。下面是描述 BPF map 的枚举结构:enum bpf_map_type { BPF_MAP_TYPE_UNSPEC, BPF_MAP_...
Hash tables, Arrays LRU (Least Recently Used) Ring Buffer Stack Trace LPM (Longest Prefix match) 下图所示是一个典型的BPF Map创建代码: 值得一提的是: BPF Map是可以被用户空间访问并操作的 BPF Map是可以与BPF程序分离的,即当创建一个BPF Map的BPF程序运行结束后,该BPF Map还能存在,而不是随着程序一...
对于非本地流量(router workload),会使用 packet hash 作为 fallback 方式。 使用方式: 应用可以通过setsockopt(SO_MAX_PACING_RATE)来指定最大 pacing 速率。 FQ 会在包之间加入延迟来达到这个 socket 设置的 rate limitation。 在Linux 4.20 之后,内核采用了 EDT(Earliest Departure Time) 算法, TCP 也能直接为...
根据申请内存方式的不同,BPF Map 有很多种类型,常用的类型是BPF_MAP_TYPE_HASH 和 BPF_MAP_TYPE_ARRAY,它们背后的内存管理方式跟我们熟悉的哈希表和数组基本一致。随着多 CPU 架构的成熟发展,BPF Map 也引入了per-cpu 类型,如 BPF_MAP_TYPE_PERCPU_HASH、BPF_MAP_TYPE_PERCPU_ARRAY 等,每个 CPU 都会存储并...