eBPF实战教程七 | 性能监控工具—bpftop

目录

bpftop介绍

工作原理

工具使用

功能小结


在之前的文章《USDT的预埋与性能测评》中,我们通过多次触发探针并统计用户态函数调用时间来分析USDT的性能,这种方法在编写demo时非常便捷,但在工程化的项目中,我们通常无法直接修改用户态应用程序或内核代码,这导致在分析eBPF程序本身的性能时,往往粒度比较粗。

例如当对MySQL进行探测时,我们可能部署了多个uprobe来探测SQL执行路径。但在观测性能时,只能通过sysbench等压测工具对MySQL进行压力测试,通过部署eBPF前后MySQL的QPS表现来估计eBPF的性能,但这种方式粒度比较粗。eBPF程序出现性能问题时,由于是多个uprobe同时对SQL执行链路进行探测,我们难以精确识别是哪个探针导致了性能问题。

那有没有一种工具能更直观分析eBPF程序性能问题呢?性能分析大神Brendan Gregg老东家开源的bpftop工具可完美解决eBPF程序自身性能分析问题。

项目地址:https://github.com/Netflix/bpftop

bpftop介绍

bpftop 提供了一个可以实时动态查看 eBPF 程序运行情况的界面。它可以显示每个程序的平均执行时间、每秒事件数和估算的 CPU 占用率。这个工具只在其运行时启用性能统计功能,以尽量减少对系统的开销。

图片

bpftop 通过实现高效的基准测试、代码优化和即时反馈循环,简化了eBPF程序的性能优化过程。如果没有 bpftop,优化过程将需要手动计算,增加了不必要的复杂性。有了 bpftop,用户可以快速建立基线,进行改进,并验证优化效果,从而简化了整个流程。

这款工具的一个亮点是它能够以时间序列图的形式展示统计数据。这种展示方式可以揭示其他方法可能错过的模式和趋势。

工作原理

bpftop 使用 BPF_ENABLE_STATS 系统调用命令来启用全局 eBPF 运行时统计数据收集,该功能默认是禁用的以减少性能开销。它每秒收集一次这些统计数据,计算每个 eBPF 程序在该样本周期内的平均执行时间、每秒事件数和估算的 CPU 利用率。这些信息可以以类似 top 的表格格式或者在 10 秒移动窗口的时间序列图中显示出来。一旦bpftop终止,它会关闭统计数据收集功能。该工具用 Rust 编写,利用了 libbpf-rs 和 ratatui 的 crates。

工具使用

项目地址中有已经打包好的release二进制文件,下载到开发机试用时发现该文件依赖glibc2.29。由于前段时间曾遇到glibc需要升级的情况,在glibc官网下载源码编译安装,导致ld文件不兼容,造成整个系统不可用,只能救援模式把ld覆盖回去了 。  遂放弃升级主机的glibc,选择源码编译bpftop。

项目中给出的编译命令很简单: cross build --release。

项目是用rust写的,需要先安装rust跨平台编译器。

  • 先安装cargo用来安装cross:  cargo install cross

  • 安装rustup: curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh (安装完成后需要source环境变量或者reboot)

  • 如有报错可更新下rust版本: rustup update

  • 用cargo安装cross: cargo install cross

等待安装完成就可以编译啦。

编译完成后,在target/x86_64-unknown-linux-gnu/release目录中生成了bpftop这个二进制文件,当运行时再次发现该二进制依赖gblic2.0.29。

cross build --release -v 发现是在镜像中编译的。


/usr/bin/docker run --userns host -e 'PKG_CONFIG_ALLOW_CROSS=1' -e 'XARGO_HOME=/xargo' -e 'CARGO_HOME=/cargo' -e 
'CARGO_TARGET_DIR=/target' -e 'CROSS_RUNNER=' -e https_proxy -e http_proxy -e TERM -e 'USER=root' --rm -v 
/root/.xargo:/xargo:z -v /root/.cargo:/cargo:z -v /cargo/bin -v /home/github/bpftop-main:/project:z -v 
/root/.rustup/toolchains/stable-x86_64-unknown-linux-gnu:/rust:z,ro -v /home/github/bpftop-main/target:/target:z -w /project 
cross-custom-bpftop-main:x86_64-unknown-linux-gnu-0e427 sh -c 'PATH=$PATH:/rust/bin cargo build --release -v --target 
x86_64-unknown-linux-gnu'

那就把这个二进制文件丢进容器中执行,先把编译容器拉起来:

docker run -d --name bpftop-dev --privileged --entrypoint sleep cross-custom-bpftop-main:x86_64-unknown-linux-gnu-0e427 1000000

将二进制拷贝至容器中 docker cp bpftop bpftop-dev:/,进入bpftop-dev容器 docker exec -it bpftop bash,运行bpftop工具能正常执行了。

图片

在示例中发现项目中正在运行的kprobe以及uprobe都进行了统计,对每个探针的平均耗时,事件触发频率以及CPU消耗进行了打印。

UI做的功能还是比较丰富的,可以通过关键字筛选探针,可以进行排序,选中一个探针后按ENTER可以展现该探针的曲线图。

图片

这样,每个探针的性能表现就一目了然了,对与eBPF程序开发者来说,这是再实用不过的功能了。

功能小结

bpftop是一个强大的工具,使用bpftop工具可以直观地监控系统中正在运行的eBPF程序,极大提升了开发eBPF程序时对其自身性能优化的效率。

参考文档:Netflix的博客《Announcing bpftop: Streamlining eBPF performance optimization》https://netflixtechblog.com/announcing-bpftop-streamlining-ebpf-performance-optimization-6a727c1ae2e5

********************************************************************************************************

了解更多eBPF相关知识,请关注【DBdoctor】公众号,或点击下方卡片了解更多

DBdoctor-1分钟定位数据库性能问题DBdoctor是一款企业级数据库监控、巡检、性能诊断、SQL审核与优化平台,利用eBPF透视数据库内核,可一分钟定位数据库性能问题,实现根因诊断,并给出优化建议。icon-default.png?t=O83Ahttps://www.dbdoctor.cn/?utm=4cf70f49547b4b45864ac76d1da334bf

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值