bpf原理(Berkeley Packet Filter)
在操作系统内运行沙盒程序,安全效率的扩展操作系统内核的能力而不需要修改源代码或者加载内核模块。bpf不只是可以用来做性能分析,由于可以执行自己的jit编译的字节码,只要有bpf钩子(或探针)的地方都可以扩展功能(系统调用或者内核函数)。
1.将代码生成bpf字节码。
2.字节码被内核中的jit编译成二进制指令,不需要重启自动重新加载。
3.在attach点执行这段代码。
4.使用bpf map,用户空间可以共享内核空间的数据。
kprobes
钩子函数,内核可以attach的点。通过SEC()来设置section段。
kprobes的技术原理和调试技术类似,调试技术使用了cpu异常处理,将指令第一个字节替换成特殊指令跳转到用户注册的回调函数,返回后将指令替换回去。注册回调需要查找符号表,找到对应函数。探测点类型分为调用前调用后和内存访问出错三种。
tracepoint编程
可以嵌入代码用来跟踪或者调试目的。
xdp编程
更早获取网络包数据并处理。可以自己实现程序来避免ddos攻击。
perf event编程
perf是内核自己实现的软硬件性能分析工具。可以将bpf程序attach到perf events。
cgroup socket编程
可以将bpf逻辑attach到cgroups。
cgroup open socket编程
能够统一提供安全的访问控制的代码。
socket option编程
可以处理连接和网络。
socket map编程
可以实现负载均衡,拥塞控制。
其他能力
cgroup device编程
socket 消息推送编程
raw tracepoint 编程
cgorup socket addres 编程
socket reuseport编程
Flow Dissection 编程
xdp
对比perf
perf是linux在ebpf之前主流的性能分析工具,由于ebpf提供的能力更强大,ebpf能代替perf的大部分功能。
PMCs:cpu硬件(PMU)提供的程序计数器功能和采样分析功能。能够分析cpu的属性包括内存IO,cpu 周期,cache misses,底层性能静态分析。
软件计数器:统计系统调用函数调用次数
tracepoints:hook点跟踪
perf-stat perf-top perf-record perf-report perf-list