bpf资料整理以及使用
08 Jan 2021
|
|
这个文章 介绍了BPF的基本知识 概念,也有自己的学习资料repo 本文大部分抄自这里 自己的整理记录,复读等于自己也会了!
就是一种vm,之前是class bpf,只做抓数据包,典型应用 tcpdump
架构图
原理图
eBPF 相关的知名的开源项目:
- Facebook 高性能 4 层负载均衡器 Katran;
- Cilium 为下一代微服务 ServiceMesh 打造了具备API感知和安全高效的容器网络方案;底层主要使用 XDP 和 TC 等相关技术;
- IO Visor 项目开源的 BCC、 BPFTrace 和 Kubectl-Trace: BCC 提供了更高阶的抽象,可以让用户采用 Python、C++ 和 Lua 等高级语言快速开发 BPF 程序;BPFTrace 采用类似于 awk 语言快速编写 eBPF 程序;Kubectl-Trace 则提供了在 kubernetes 集群中使用 BPF 程序调试的方便操作;
- CloudFlare 公司开源的 eBPF Exporter 和 bpf-tools:eBPF 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 我也转了,做记录备忘