这个文章 介绍了BPF的基本知识 概念,也有自己的学习资料repo 本文大部分抄自这里 自己的整理记录,复读等于自己也会了!

就是一种vm,之前是class bpf,只做抓数据包,典型应用 tcpdump

架构图

原理图

eBPF 相关的知名的开源项目:

  • Facebook 高性能 4 层负载均衡器 Katran
  • Cilium 为下一代微服务 ServiceMesh 打造了具备API感知和安全高效的容器网络方案;底层主要使用 XDP 和 TC 等相关技术;
  • IO Visor 项目开源的 BCCBPFTraceKubectl-TraceBCC 提供了更高阶的抽象,可以让用户采用 Python、C++ 和 Lua 等高级语言快速开发 BPF 程序;BPFTrace 采用类似于 awk 语言快速编写 eBPF 程序;Kubectl-Trace 则提供了在 kubernetes 集群中使用 BPF 程序调试的方便操作;
  • CloudFlare 公司开源的 eBPF Exporterbpf-toolseBPF Exporter 将 eBPF 技术与监控 Prometheus 紧密结合起来;bpf-tools 可用于网络问题分析和排查;

bcc bpf工具集

我公司的开发机器不支持回去用linux笔记本试试

yum install bcc-tools

/usr/share/bcc/tools/opensnoop 
In file included from <built-in>:2:
/virtual/include/bcc/bpf.h:13:10: fatal error: 'linux/bpf_common.h' file not found
#include <linux/bpf_common.h>
         ^~~~~~~~~~~~~~~~~~~~
1 error generated.
Traceback (most recent call last):
  File "/usr/share/bcc/tools/opensnoop", line 181, in <module>
    b = BPF(text=bpf_text)
  File "/usr/lib/python2.7/site-packages/bcc/__init__.py", line 320, in __init__
    raise Exception("Failed to compile BPF text")
Exception: Failed to compile BPF text

linux支持程度以及对应的版本

工具介绍

execsnoop抓调用,可以抓到slab dentry过大的问题 (经典问题,见过用systemtap抓的。现如今systemtap不如bpf工具好用)

profile抓系统耗时指标

$ profile -af 30 > out.stacks01
$ git clone https://github.com/brendangregg/FlameGraph
$ cd FlameGraph
$ ./flamegraph.pl --color=java < ../out.stacks01 > out.svg

tcplife/tcptracer/tcpstates 抓连接信息/tcp状态/tcp流转状态!这个很牛逼

如何使用bpf定制工具?

  • bpftrace 基本相当于systemtap那种用法了
# 统计进程调用 sys_enter 的次数
#bpftrace -e 'tracepoint:raw_syscalls:sys_enter { @[comm] = count(); }'
Attaching 1 probe...
^C

@[bpftrace]: 6
@[systemd]: 24
@[snmp-pass]: 96
@[sshd]: 125

# 统计内核中函数堆栈的次数
# bpftrace -e 'profile:hz:99 { @[kstack] = count(); }'
Attaching 1 probe...
^C

[...]
@[
filemap_map_pages+181
__handle_mm_fault+2905
handle_mm_fault+250
__do_page_fault+599
async_page_fault+69
]: 12
[...]
@[
cpuidle_enter_state+164
do_idle+390
cpu_startup_entry+111
start_secondary+423
secondary_startup_64+165
]: 22122
  • bcc工具可以照常用,新的工具,建议使用libbpf来写,bcc下面也有例子

https://github.com/iovisor/bcc/tree/master/libbpf-tools 按照

pingcap公司也提供了几个工具

参考

  • 这个文章列了非常多的资料 https://linux.cn/article-9507-1.html 我也转了,做记录备忘