当前位置:首页 >> 中医保健 >> 入门即享受!coolbpf 硬核提升 BPF 开发效率 | 龙蜥电子技术

入门即享受!coolbpf 硬核提升 BPF 开发效率 | 龙蜥电子技术

发布时间:2025-02-26

ule 给我们很大的权利去抓取系统设计系统设计的一些资讯,但是却存有不极多弊端。

上图是系统设计系统设计模块和 BPF 的对比(图源:)。

2.4 BPF 程序集

BPF(默认常指 eBPF 非 cBPF) 代理服务器端程序都是 64 位,特常指了 11 个 64 位数据逆,32 位特常指半数据逆(subregister)和一个代理服务器端计天内器(program counter),一个大小为 512 字符串的 BPF 子程序。所有的 BPF 程序都有着相同的编码方型式。eBPFID程序系统设计属于 RISC,占总有 11 个ID数据逆、r0-r10,在不太可能试运行时,ID机内就会把这 11 个数据逆一 一对不宜于硬件 CPU 的物理数据逆。上图是新来由程序的对比:

BPF 程序的本体结构设计纤如下,每一条 eBPF 程序都以一个 bpf_insn 来声称,在 cBPF 中就会是其他的一个结构设计纤(struct sock_filter ),不过最终则就会转换成实质上的格型式,这中就会都我们只研究 eBPF:

由结构设计纤中就会的短时u8 code 可以究竟,一条 BPF 程序是 8 个字符串长。这 8 位的 code,第 0、1、2 位声称的是该系统设计程序的类别,共五 8 种:

从最极低位到最高位分别是:

8 位的 opcode;有 BPF_X 各种类型的基于数据逆的程序,也有 BPF_K 各种类型的基于马上天内的程序 4 位的期望数据逆 (dst) 4 位的类似数据逆 (src) 16 位的对齐(有下标),是比起于子程序、算子最大值(map values)、统计天内据打包(packet data)等的比起区块 32 位的马上天内 (imm)(有下标)

8 bit 的 opcode 进一步只用,上图声称的是存储和加载类程序:

上图声称的是运算和跳转程序:

总之,BPF 程序很简洁,我们必定就会在研发步骤中就会特常指它来透过预假定撰写成(十分相似纯摘要,就会让人崩溃),洞察这些是有助于我们格外深刻印象的理解 BPF 的试运行原理。

2.5 BPF 的 prog type 和 map

PROG TYPE

BPF 无关的代理服务器端,首先行并不需要设置为比起不宜的的代理服务器端各种类型,截止 Linux 系统设计系统设计 5.8 代理服务器端各种类型假定有 29 个,而且还在持续增加中就会,BPF 代理服务器端各种类型(prog_type)提议了代理服务器端可以加载的系统设计系统设计借助于算子的子集,也提议了代理服务器端输入上下文 -- bpf_context 结构设计的格型式。

我们经常特常指BPF代理服务器端各种类型主要涉及一般而言两类:

监视

南半部BPF代理服务器端都是这一类,主要通过kprobe、tracepoint(rawtracepoint)等监视系统设计行为及换取系统设计硬件资讯。也可以出访特定代理服务器端的存储器区域,从试运行进程中就会分离出来执行者监视资讯。

的网络

这类BPF代理服务器端用于检测和管理系统设计的的网络逆量。可以对的网络连接器统计天内据打包透过漂白,甚至可以紧接全拒绝统计天内据打包。

Gmail稳态是通过系统设计加载来加载BPF代理服务器端到系统设计系统设计的,在加载代理服务器端时,并不需要传递的参天内中就会有一个字段叫prog_type,这个就是BPF的代理服务器端各种类型,监视无关的是:BPF_PROG_TYPE_KPROBE和BPF_PROG_TYPE_TRACEPOINT,的网络无关是:BPF_PROG_TYPE_SK_SKB、BPF_PROG_TYPE_SOCK_OPS等。下面是描绘BPF代理服务器端各种类型的枚举结构设计:

enum bpf_prog_type {

BPF_PROG_TYPE_UNSPEC, /* Reserve 0 as invalid program type */

BPF_PROG_TYPE_SOCKET_FILTER,

BPF_PROG_TYPE_KPROBE,

BPF_PROG_TYPE_SCHED_CLS,

BPF_PROG_TYPE_SCHED_ACT,

BPF_PROG_TYPE_TRACEPOINT,

BPF_PROG_TYPE_XDP,

BPF_PROG_TYPE_PERF_EVENT,

BPF_PROG_TYPE_CGROUP_SKB,

BPF_PROG_TYPE_CGROUP_SOCK,

BPF_PROG_TYPE_LWT_IN,

BPF_PROG_TYPE_LWT_OUT,

BPF_PROG_TYPE_LWT_XMIT,

BPF_PROG_TYPE_SOCK_OPS,

BPF_PROG_TYPE_SK_SKB,

BPF_PROG_TYPE_CGROUP_DEVICE,

BPF_PROG_TYPE_SK_MSG,

BPF_PROG_TYPE_RAW_TRACEPOINT,

BPF_PROG_TYPE_CGROUP_SOCK_ADDR,

BPF_PROG_TYPE_LWT_SEG6LOCAL,

BPF_PROG_TYPE_LIRC_MODE2,

BPF_PROG_TYPE_SK_REUSEPORT,

BPF_PROG_TYPE_FLOW_DISSECTOR,

/* See /usr/include/linux/bpf.h for the full list. */

};

BPF MAP

BPF 的 map 可用于系统设计系统设计 BPF 代理服务器端和Gmail不宜用代理服务器端两者之间借助于双向的统计因特网, 是不可或缺根基统计天内据结构设计,它可以通过发备注声明 struct bpf_map_def 结构设计紧接成创设。

关于 BPF 最吸引人的一个总体,就是试运行在系统设计系统设计上的代理服务器端可以在试运行时特常指一个系统相互通信系统,而 BPF Map 就是Gmail维度和系统设计系统设计维度两者之间的统计因特网、资讯传递的桥梁。

BPF Map 事物上是以键/最大值方型式存储在系统设计系统设计中就会的统计天内据结构设计。在系统设计系统设计维度的代理服务器端创设 BPF Map 并来到对不宜的机密文件描绘符,在Gmail维度试运行的代理服务器端就可以通过这个机密文件描绘符来出访并系统设计 BPF Map。

根据注册存储器方型式的有所不同,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 则就会存储并见到它自己的 Map 统计天内据,从属于有所不同 CPU 两者之间的统计天内据是互相监护的。

下面是描绘 BPF map 的枚举结构设计:

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,

BPF_MAP_TYPE_CGROUP_ARRAY,

BPF_MAP_TYPE_LRU_HASH,

BPF_MAP_TYPE_LRU_PERCPU_HASH,

BPF_MAP_TYPE_LPM_TRIE,

BPF_MAP_TYPE_ARRAY_OF_MAPS,

BPF_MAP_TYPE_HASH_OF_MAPS,

BPF_MAP_TYPE_DEVMAP,

BPF_MAP_TYPE_SOCKMAP,

BPF_MAP_TYPE_CPUMAP,

BPF_MAP_TYPE_XSKMAP,

BPF_MAP_TYPE_SOCKHASH,

BPF_MAP_TYPE_CGROUP_STORAGE,

BPF_MAP_TYPE_REUSEPORT_SOCKARRAY,

BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE,

BPF_MAP_TYPE_QUEUE,

BPF_MAP_TYPE_STACK,

BPF_MAP_TYPE_SK_STORAGE,

BPF_MAP_TYPE_DEVMAP_HASH,

BPF_MAP_TYPE_STRUCT_OPS,

BPF_MAP_TYPE_RINGBUF,

BPF_MAP_TYPE_INODE_STORAGE,

BPF_MAP_TYPE_TASK_STORAGE,

BPF_MAP_TYPE_BLOOM_FILTER,

};

三、BPF 的研发姿势

3.1 BPF 研发框架

上图就是十分经典的 BPF 研发框架图了,一般研发逆程都是先行将Gmail撰写成的特定代理服务器端通过 LLVM 程序预假定为 BPF 字符串码,在注入到系统设计系统设计中就会时就会经过 verifier 严格的检查,确保预假定不就会出现死反转、宕机内之类的情况,然后先通过jit将其翻译为 native code 透过执行者,Gmail可以通过察看系统设计系统设计透出的统计天内据,洞察系统设计的试运行情况。

虽然 BPF 有十分多的不宜用,但特常指的时候也有许多的限制。比如:

不用有不确定的反转系统设计;系统设计系统设计要确保执行者逆一定可以从BPF代理服务器端中就会出来。 不强制睡眠中;睡眠中可能引发系统设计系统设计执行者逆之后出不来。 不强制修改系统设计系统设计统计天内据结构设计;一般不用修改统计天内据报文。 子程序维度意味着;这两项只有 512 字符串。 不强制被直接加载系统设计系统设计算子;必须通过借助于算子。

3.2 GNU用以和跨平台

BPF的面向对象分别为两大多,一大多是试运行在系统设计系统设计稳态,这是 BPF 面向对象的本体;另一大多是试运行在Gmail稳态,这大多预假定主要用来加载BPF,收集并处理事件统计天内据等。

libbpf

libbpf是官方的Gmail稳态库里。和程序预假定一般来说的c代理服务器端就会想得到一个.o机密文件一样,LLVM程序预假定紧接BPF 代理服务器端也就会想得到一个的.o机密文件(一般我们定名为xx.bpf.o)。这个 bpf.o 机密文件按照 elf 的格型式的组织 BPF 代理服务器端的字符串码、map假定以及下标等资讯,libbpf 库里负责解析这些资讯,创设 map,注入 BPF 代理服务器端到系统设计系统设计工用上。因此,对于Gmail来说,并不需要做很多死板的工用上:

用 C 自然语言来撰写成 BPF 代理服务器端; 撰写成 makefile,加载 LLVM 程序预假定转化 .o 机密文件; 加载 libbpf 的连接器加载 .o 机密文件; 特常指 libbpf 的连接器换取 map 中就会的统计天内据。

BCC

BCC 是如今最热门也是对新手最友好的GNU跨平台。它用 python 封装了程序预假定、加载和读取统计天内据的步骤,透过了很多十分好用的 API。

和 libbpf 并不需要提前把 bpf 代理服务器端程序预假定成 bpf.o 有所不同,BCC 是在试运行时才加载 LLVM 透步骤序预假定的,所以要求Gmail生稳态上有 llvm 和 kernel-devel。这个就就会像后面我们写成到的,它就会出现试运行时对齐引发的瞬时自然资源冲高情况。

bpftrace

bpftrace 是单下达用以,让Gmail像特常指脚本一样特常指 BPF。它自假定了自己的 DSL 用上为内侧,底层也是加载 LLVM 的。事实上,它忽视于 BCC 透过的 libbcc.so 机密文件。

3.3 libbpf CORE

后面写成到 libbpf 研发,成为这两项最另类的研发方型式,但是并不需要为每个系统设计系统设计原版都研发特定的二进制代理服务器端,不用超出同一个 BPF 代理服务器端在有所不同系统设计系统设计原版上确保试运行。由于有所不同系统设计系统设计原版统计天内据的存储器布局有所不同,就并不需要背书CORE(CompileOnce、Runeverywhere),写成到 CORE 我们要先行来洞察一下 BTF。

BTF(BPF Type Format)是一种十分相似 DWARF 的格型式,主要用途于描绘代理服务器端中就会统计天内据各种类型。其主要存有于两个地方:

一是 vmlinux 反转内。

二是Gmail撰写成的 BPF 代理服务器端内。

二者存有着一定的关联。第一个关联是:BPF 代理服务器端内除了存有 .btf 段外,还存有.btf.ext 段,主要用途于据信 BPF 代理服务器端内特常指的统计天内据各种类型的情况。第二个关联是:vmlinux 反转内的 BTF 代理服务器端由原存有于该反转内的 dwarf 资讯简化而来,而 BPF 代理服务器端内的 BTF 段由 CLANG 程序预假定器转化,并不需要在程序预假定时常指定 --target bpf。并用 BPF 代理服务器端中就会都的 BTF 段和存置于每个系统设计上的 BTF 机密文件,我们将这些资讯透过重定位,就能确定每个统计天内据结构设计的对齐,超出 CORE 的借以。

更为重要组件:

BTF: 描绘系统设计系统设计反转,换取系统设计系统设计及BPF代理服务器端各种类型和预假定的更为重要资讯() Clang 释放 bpf 代理服务器端重定位资讯到 .btf 段 Libbpf CO-RE 根据 .btf 段重定位 bpf 代理服务器端

在此之后在 libbpf CO-RE 中就会并不需要透过重定位的资讯主要有三类:

1)结构设计纤无关重定位,这大多和 BTF 息息无关;

Clang 通过 短时builtin_preserve_access_index() 据信成员区块

u64 inode = task->mm->exe_file->f_inode->i_ino;

u64 inode = BPF_CORE_READ(task, mm, exe_file, f_inode, i_ino);

2)map fd、全局变量、extern 等重定位,这大多主要忽视于 ELF 重定位机内制。通过加载 ELF 重定位段收集重定位资讯,格外新相不宜程序的 imm 字段。

skel->rodata->my_cfg.feature_enabled = true;

skel->rodata->my_cfg.pid_to_filter = 123;

extern u32 LINUX_KERNEL_VERSION 短时kconfig;

extern u32 CONFIG_HZ 短时kconfig;

3)子算子重定位,也是忽视于 ELF 重定位机内制。但是借以不一样,子算子重定位是为了将 eBPF 代理服务器端加载的子算子同主算子置于同砖头年中就会的存储器中就会,便于三人加载到系统设计系统设计。例如将所有子代理服务器端拷贝到主代理服务器端所在区域, always_inline 算子。

libbpf CORE 研发步骤:

1)转化隙所有系统设计系统设计各种类型的头机密文件 vmlinux.h

bpftoolbtf dump file vmlinux format c> vmlinux.h

2)特常指 Clang (原版 10 或格外新原版)将BPF代理服务器端的源预假定程序预假定为 .o 取向机密文件;

3)从程序预假定好的 BPF 取向机密文件中就会转化BPF skeleton 头机密文件 bpftool gen 下达转化;

4)在Gmail维度预假定中就会举例来说转化的 BPF skeleton 头机密文件;

5)程序预假定Gmail维度预假定,这样就会算子 BPF 取向预假定,后续就要用释出单独的机密文件。

6)转化的 BPF skeleton 特常指如下步骤加载、COM、封存:

短时open() – 创设并弹出 BPF 不宜用,便可以设置 skel->rodata 变量。

短时load() – 初始化,加载和校验BPF 不宜用大多。

短时attach() – 附加所有可以相应附加的BPF代理服务器端 (可择一,可以直接特常指 libbpf API 用上格外多支配)。

短时destroy() – 分离所有的 BPF 代理服务器端并特常指其特常指的所有自然资源。

四、 coolbpf 忘却型式研发

后面我们仍然对 BPF 有了一个了解到,到此仍然初阶了,同时也学习了 BPF 的高阶经验:libbpf 的 CORE,它也是将就会的一个方向,但是我们也见到这中就会都面,还并不需要写成一堆预假定:open、load、attach 等等。我们能否把这一切透过简化呢?能不用忘却型式的透过研发。别急,先行来看看特常指的研发方型式:

4.1 BPF 研发特常指建议书对比

1)原生 libbpf,无 CO-RE (系统设计系统设计 samples/bpf 下述)

优势:自然资源占总使用量极低

缺点:

并不需要围住预假定二期工程、研发工用上效率极低; 有所不同系统设计系统设计原版通用性一比;

2)BCC(BPF Compile Collection、python 预假定)

优势:研发工用上效率高,可移植性好,背书动稳态修改系统设计系统设计大多预假定

缺点:

布防忽视的 Clang/LLVM; 每次试运行都要执行者 Clang/LLVM 程序预假定,抢夺存储器 CPU 存储器等自然资源; 忽视期望生稳态头机密文件;

3)BPF CO-RE(libbpf-tools 下面的预假定)

优势:不忽视在生稳态中就会布防 Clang/LLVM,自然资源占总用极多

缺点:

仍并不需要围住程序预假定程序预假定二期工程; 大多预假定比起浮动,未能动稳态可用; Gmail稳态研发背书资讯较极多,欠缺高阶自然语言终端;

综上所述,上述建议书不用很差可视投入生产生稳态中就会,多系统设计系统设计并存、迅速批量布防等投入生产力

4.2 Coolbpf(可以酷玩的 BPF)解决的情况

通过将 BPF 的三种研发方型式对比,我们发现都不用极致的在投入生产生稳态中就会解决如下几个情况:

安装忽视库里和系统设计系统设计头机密文件; CPU 和存储器等自然资源瞬时冲高; BTF 并不需要按原版随 BPF 二进制代理服务器端释出。

为解决这几个情况,我们提出一个 coolbpf 的研发程序预假定跨平台,在此之后举例来说 pylcc、rlcc、golcc 等目录,分别是高阶自然语言 python、rust 和 go 自然语言背书远程和本地程序预假定的能力。

预假定链接地址:

这中就会都不对 coolbpf 可避免详述,具纤内容劝概要《龙科龙科新社区GNU coolbpf,BPF 代理服务器端研发工用上效率改善百倍》。

4.3 pyLCC 的忘却型式

为了详述什么叫忘却型式研发,在这中就会都我们拿 coolbpf 的 pyLCC 透过展示出:

import sys

from pylcc.lbcBase import ClbcBase, CexecCmd //import pylcc base库里

bpfProg = r"""

struct data_t {

int cpu;

int type; // 0: irq, 1:sirq

u32 stack_id;

u64 delayed;

};

LBC_PERF_OUTPUT(e_out, struct data_t, 128); //假定perf event output array map

LBC_STACK(call_stack, 256); //假定stack 的map

SEC("kprobe/check_timer_delay")

int j_check_timer_delay(struct pt_regs *ctx)

{

struct data_t data = {};

data.cpu = PT_REGS_PARM2(ctx);

data.type = PT_REGS_PARM1(ctx);

data.delayed = PT_REGS_PARM3(ctx);

data.stack_id = bpf_get_stackid(ctx, &call_stack, KERN_STACKID_FLAGS);

bpf_perf_event_output(ctx, &e_out, BPF_F_CURRENT_CPU, &data, sizeof(data));

return 0;

}

"""

class Crunlatency(ClbcBase):

def 短时init短时(self, lat=10):

self._exec = CexecCmd

self.setupKo(lat>> 1)

//只并不需要简单的init,就可以把open load attach 等动用上做好,然后集中精力于统计天内据处理事件

super(Crunlatency, self).短时init短时("runlatency", bpf_str=bpfProg)

def _cb(self, cpu, data, size):

stacks = self.maps['call_stack'].getStacks(e.stack_id)

print("call trace:") //call back算子中就会都集中精力处理事件统计天内据

for s in stacks:

print(s)

大家见到上面的下述,只并不需要一般而言三步,就可以紧接成一个代理服务器端的研发:

1)pip install coolbpf。

2)撰写成 bpf.c 预假定。

3)撰写成 python,通过 init() 加载便,就集中精力系统研发。

你可以要用关心 BPF 的摘要、字符串码,也要用安装 Clang,要用安装 kernel-dev 头机密文件,要用自己转化 BTF 机密文件(它就会相应到远程代理服务器浏览),只需集中精力你的系统研发,比如分析的网络逆量、监控机密文件弹出和关停、监视系统设计加载。

阐释来看,BPF 新技术还在肇始的演进着,但只要掌握了这些根基的经验点,就并不需要触类旁通,并用好已是的用以或跨平台,格外加能如虎添翼。通过后面的详述,我们不仅对 BPF 有了较为深刻印象的理解,还能借助 coolbpf,十分酷的玩了一把忘却型式的研发,简洁如此,谁能不甜蜜呢?

关于摄像和课件换取

【视频摄像】:视频回访已上传至龙科龙科主页(可读物译者往返): 察看。 【PPT课件换取】:非议天涯社区政府会号(OpenAnolis),仍要“龙科龙科课件” 即可换取。有任何疑问劝随时发表意见龙科龙科密友—凤科(天涯社区:openanolis_assis)。

—— 紧接 ——

投身于龙科龙科社集合起来

投身于天涯社区集合起来:填充新社区助理-龙科龙科新社区凤科(天涯社区:openanolis_assis),备注【龙科龙科】与你同在;投身于钉钉集合起来:图像正下方钉钉集合起来二维码。赞赏研发者/Gmail投身于龙科龙科新社区(OpenAnolis)交逆,共五同推进龙科龙科新社区的演进,三人打造一个活跃的、健康的GNU系统设计系统设计生稳态!

关于龙科龙科新社区

龙科龙科新社区(OpenAnolis)由企事业其单位、高等院校、科研其单位、非营利性的组织、个人等在义务、民族平等、GNU、协用上的根基上组成的非盈利性GNU新社区。龙科龙科新社区成立于 2020 年 9 月,借以重构一个GNU、中就会立、停止使用的Linux 中就会游Debian新社区及技术创新跨平台。

龙科龙科新社区成立的短期期望是研发龙科龙科系统设计系统设计(Anolis OS)用上为 CentOS 停服后的不宜对建议书,重构一个兼容国际上 Linux 另类厂商的新社区Debian。中就会长期期望是探究打造一个面向将就会的系统设计系统设计,建立实质上的GNU系统设计系统设计生稳态,孵化技术创新GNU建设项目,繁荣GNU生稳态。

在此之后,Anolis OS 8.6 已释出,格外多龙科龙科自研特点,背书 X86_64 、RISC-V、Arm64、LoongArch 驱动程式,紧接善可视 Intel、计纤、鲲鹏、龙科纤等纤片,并透过全子程序国密背书。

赞赏浏览:

投身于我们,三人打造面向将就会的GNU系统设计系统设计!

译者链接:

本文为阿中就会都云原创内容,予以强制不得转载。

骨折病人营养品推荐江中初元
看绝经费用需多少
nk细胞治疗多少钱一次
肚子胀气消化不良怎么办
腹泻吃什么药最有效
艾拉莫德片治疗类风湿关节僵硬效果怎么样
口臭吃乌梅仁丹有用吗
先声药业
先诺欣多少钱
消痔软膏与消痔凝胶哪个好
标签:
友情链接: