XDP/eBPF — 基于 eBPF 的 Linux Kernel 可观测性
目录
文章目录
- 目录
- eBPF 的可观测性架构
- 版本支持
- BCC
- 60s 系列 BPF 版本
- 生成火焰图
- 排查网络调用来源
eBPF 的可观测性架构
BPF 观测技术相关的程序程序类型可能是 kprobes、uprobes、tracepoint、perf_events 中的一个或多个,其中:
- kprobes:实现内核中的动态跟踪。kprobes 可以跟踪到 Linux 内核中的导出函数入口或返回点,但是不是稳定 ABI 接口,可能会因为内核版本变化导致,导致跟踪失效。
- uprobes:用户级别的动态跟踪。与 kprobes 类似,只是跟踪用户程序中的函数。
- tracepoints:内核中静态跟踪。tracepoints 是内核开发人员维护的跟踪点,能够提供稳定的 ABI 接口,但是由于是研发人员维护,数量和场景可能受限。
- perf_events:定时采样和 PMC。
内核中运行的 BPF 字节码程序可以使用两种方式将测量数据回传至用户空间:
- maps 方式:可用于将内核中实现的统计摘要信息(比如测量延迟、堆栈信息)等回传至用户空间;
- perf-event:可用于将内核采集的事件实时发送至用户空间,用户空间程序实时读取分析;
版本支持
由于 eBPF 还在快速发展期,内核中的功能也日趋增强,一般推荐基于 Linux 4.4+(4.9 以上会更好)内核的来使用 eBPF。部分 Linux Event 和 BPF 版本支持见下图。
BCC
IO Visor 项目的 BCC 工具,为性能分析和观察提供了更加丰富的工具集。
60s 系列 BPF 版本
生成火焰图
火焰图是帮助我们对系统耗时进行可视化的图表,能够对程序中那些代码经常被执行给出一个清晰的展现。
Brendan Gregg 是火焰图的创建者,他在 GitHub 上维护了一组脚本可以轻松生成需要的可视化格式数据。使用 BCC 中的工具 profile 可很方面地收集道 CPU 路径的数据,基于数据采用工具可以轻松地生成火焰图,查找到程序的性能瓶颈。
/usr/share/bcc/tools/profile -h
usage: profile [-h] [-p PID | -L TID] [-U | -K] [-F FREQUENCY | -c COUNT] [-d][-a] [-I] [-f] [--stack-storage-size STACK_STORAGE_SIZE][-C CPU][duration]Profile CPU stack traces at a timed intervalpositional arguments:duration duration of trace, in secondsoptional arguments:-h, --help show this help message and exit-p PID, --pid PID profile process with this PID only-L TID, --tid TID profile thread with this TID only-U, --user-stacks-onlyshow stacks from user space only (no kernel spacestacks)-K, --kernel-stacks-onlyshow stacks from kernel space only (no user spacestacks)-F FREQUENCY, --frequency FREQUENCYsample frequency, Hertz-c COUNT, --count COUNTsample period, number of events-d, --delimited insert delimiter between kernel/user stacks-a, --annotations add _[k] annotations to kernel frames-I, --include-idle include CPU idle stacks-f, --folded output folded format, one line per stack (for flamegraphs)--stack-storage-size STACK_STORAGE_SIZEthe number of unique stack traces that can be storedand displayed (default 16384)-C CPU, --cpu CPU cpu number to run profile onexamples:./profile # profile stack traces at 49 Hertz until Ctrl-C./profile -F 99 # profile stack traces at 99 Hertz./profile -c 1000000 # profile stack traces every 1 in a million events./profile 5 # profile at 49 Hertz for 5 seconds only./profile -f 5 # output in folded format for flame graphs./profile -p 185 # only profile process with PID 185./profile -L 185 # only profile thread with TID 185./profile -U # only show user space stacks (no kernel)./profile -K # only show kernel space stacks (no user)
profile 配合 FlameGraph 可以轻松帮我们绘制出 CPU 使用的火焰图。
$ profile -af 30 > out.stacks01
$ git clone https://github.com/brendangregg/FlameGraph
$ cd FlameGraph
$ ./flamegraph.pl --color=java < ../out.stacks01 > out.svg
排查网络调用来源
在生产场景下,会有些特定场景需要抓取连接到外网特定地址的程序,这时候我们可以采用 BCC 工具集中的 tcplife 来定位。
/usr/share/bcc/tools/tcplife -h
usage: tcplife [-h] [-T] [-t] [-w] [-s] [-p PID] [-L LOCALPORT][-D REMOTEPORT]Trace the lifespan of TCP sessions and summarizeoptional arguments:-h, --help show this help message and exit-T, --time include time column on output (HH:MM:SS)-t, --timestamp include timestamp on output (seconds)-w, --wide wide column output (fits IPv6 addresses)-s, --csv comma separated values output-p PID, --pid PID trace this PID only-L LOCALPORT, --localport LOCALPORTcomma-separated list of local ports to trace.-D REMOTEPORT, --remoteport REMOTEPORTcomma-separated list of remote ports to trace.examples:./tcplife # trace all TCP connect()s./tcplife -t # include time column (HH:MM:SS)./tcplife -w # wider colums (fit IPv6)./tcplife -stT # csv output, with times & timestamps./tcplife -p 181 # only trace PID 181./tcplife -L 80 # only trace local port 80./tcplife -L 80,81 # only trace local ports 80 and 81./tcplife -D 80 # only trace remote port 80
通过在机器上使用 tcplife 来获取的网络连接信息,我们可以看到包括了 PID、COMM、本地 IP 地址、本地端口、远程 IP 地址和远程端口,通过这些信息非常方便排查到连接到特定 IP 地址的程序,尤其是连接的过程非常短暂,通过 netstat 等其他工具不容易排查的场景。
$ /usr/share/bcc/tools/tcplife
PID COMM IP LADDR LPORT RADDR RPORT TX_KB RX_KB MS
1776 blackbox_export 4 169.254.20.10 35830 169.254.20.10 53 0 0 0.36
27150 node-cache 4 169.254.20.10 53 169.254.20.10 35830 0 0 0.36
12511 coredns 4 127.0.0.1 58492 127.0.0.1 8080 0 0 0.32
...
如果我们想知道更加详细的 TCP 状态情况,那么 tcptracer 可展示更加详细的 TCP 状态,其中 C 代表 Connect X 表示关闭, A 代表 Accept。
$ /usr/share/bcc/tools/tcptracer
Tracing TCP established connections. Ctrl-C to end.
T PID COMM IP SADDR DADDR SPORT DPORT
C 21066 ilogtail 4 10.81.128.12 100.100.49.128 40906 80
X 21066 ilogtail 4 10.81.128.12 100.100.49.128 40906 80
C 21066 ilogtail 4 10.81.128.12 100.100.49.128 40908 80
X 21066 ilogtail 4 10.81.128.12 100.100.49.128 40908 80
tcpstates 还能够展示出来 TCP 状态机的流转情况:
$ /usr/share/bcc/tools/tcpstates
SKADDR C-PID C-COMM LADDR LPORT RADDR RPORT OLDSTATE -> NEWSTATE MS
ffff9fd7e8192000 22384 curl 100.66.100.185 0 52.33.159.26 80 CLOSE -> SYN_SENT 0.000
ffff9fd7e8192000 0 swapper/5 100.66.100.185 63446 52.33.159.26 80 SYN_SENT -> ESTABLISHED 1.373
ffff9fd7e8192000 22384 curl 100.66.100.185 63446 52.33.159.26 80 ESTABLISHED -> FIN_WAIT1 176.042
XDP/eBPF — 基于 eBPF 的 Linux Kernel 可观测性相关推荐
- 基于arm64的linux kernel cpu 初始化分析
从start_kernel开始分析 init/main.cstart_kernel|smp_setup_processor_id|setup_arch|setup_nr_cpu_ids|setup_p ...
- 深入浅出 eBPF: (Linux/Kernel/XDP/BCC/BPFTrace/Cillium)
[BPF入门系列-1]eBPF 技术简介 | 深入浅出 eBPF[BPF入门系列-1]eBPF 技术简介https://www.ebpf.top/post/bpf_intro_blog/ 目录 eBP ...
- Linux中基于eBPF的恶意利用与检测机制(rootkit、驱动)
目录 前言 现状分析 海外资料 国内资料 eBPF技术恶意利用的攻击原理 网络层恶意利用 Linux系统运行时恶意利用 综述 检测防御 运行前 运行时 运行后 防御 工程实现 系统兼容性 CO-RE ...
- 基于 eBPF 的云原生可观测性深度实践
本文整理自云杉网络 DeepFlow 产品负责人向阳在 QCon 2023 的演讲分享,主题为 "基于 eBPF 的云原生可观测性深度实践". 分享从四个方面展开.第一部分回顾分布 ...
- 基于eBPF的Linux沙盒文件系统SandFS
好玩的东西又来咯! 我一向自诩自己是Netfilter的骨灰级业余玩家,但对于文件系统,我终究连入门都没有曾经. 如果把Netfilter嫁接在VFS上会怎样? 我没有亲自去做,因为我对VFS的API ...
- 深度解析|基于 eBPF 的 Kubernetes 一站式可观测性系统
作者:李煌东.炎寻 摘要 阿里云目前推出了面向 Kubernetes 的一站式可观测性系统,旨在解决 Kubernetes 环境下架构复杂度高.多语言&多协议并存带来的运维难度高的问题,数据采 ...
- 基于eBPF的云原生可观测性开源工具Kindling之Kindling-agent 性能测试评估
背景 Kindling-agent是基于eBPF的云原生可观测性开源工具Kindling中采集端的组件,能够通过采集和分析内核事件,获取运行于同一宿主机上的其他服务的业务.网络等指标.其工作模式是在主 ...
- 首届中国eBPF大会分享---基于eBPF的内核漏洞检测实践
背景 随着智能化.数字化.云化的飞速发展,全球基于Linux系统的设备数以百亿计,而这些设备的安全保障主要取决于主线内核的安全性和健壮性.传统的内核安全存在周期长.效率低以及版本适配的问题,有没有实用 ...
- Cilium 1.7发布:Hubble UI、全集群网络策略、基于eBPF的Direct Server Return以及更多
在这里,我们要向大家高兴地宣布,Cilium 1.7版本正式发布了!在本轮更新周期当中,由141位开发者组成的项目社区共完成了1551项提交,而且很多朋友是第一次为Cilium项目提交贡献. Hubb ...
最新文章
- 如何从Android中的另一个应用程序启动活动
- 学好python可以做什么兼职-自学Python能干些什么副业
- 日期相减 python_如果将excel的数字转化为日期(高级教程)
- Oracle多表连接查询
- 域名绑定html网站吗,使用Coding搭建html纯静态网站后绑定域名+SSL证书
- topic:开发人员眼中的RIA,基于Flash实现
- NTKO文档控件常见报错信息集合
- 摄影测量前方交会编程实现
- 2022 Google IO大会新技术
- 310实验室一点补充
- 采用FPGA开发高清相机sensorISP芯片要点分析
- C/C++ 简单排序之冒泡排序
- Android 系统原生TTS使用
- sox处理mp3_SoX — 音频处理工具里的瑞士军刀
- QQ空间迁移_【SRX550_HA_以及端口绑定高可靠性尝试】
- 汇编命令及OD常用命令及断点设置
- 软件工程可行性研究报告
- springboot瘦身打包
- 【VirtualAPP 双开系列07】第三方 APP Service、Provider 加载分析
- 《Adobe After Effects CS4经典教程》——1.10 控制用户界面的亮度
热门文章
- Xcode代码不提示或提示慢
- mysql删除没有索引页_InnoDB中没有主键是如何运转的
- vs编译器 printf 控制台输出_【语言教程】通过语言了解GCC编译器工作过程
- 查看python 3.x 关键字 (保留字)(预留字)
- 全息物体也能触摸到!约翰·霍普金斯大学研究者使用脑机接口让患者感受到全息物体...
- 脑机接口,风口还是入口?
- 你在听音乐的时候能否感受到背后有“寒意“?
- eeglab中文教程系列(3)-绘制通道光谱图
- 特斯拉中国召回20万辆问题汽车:存在硬件风险,部分引擎盖可能意外打开
- 用上这个Python的Docker正式版镜像,你也能成为容器高玩