用 eBPF trace PostgreSQL 的几种姿势
前
用 eBPF 来观测用户空间应用程序这几年越来越火了,诞生了不少开源的应用,但在数据库这个领域相关的应用还不算太多,特别是 PostgreSQL. 在这个领域之前没那么多人研究可能的原因:
- 数据库开发在前些年还没像今天这么热门
- PostgreSQL 自带 dtrace 只需要在编译时 --enable-dtrace 就可以进行一些观测
- pg10 之前应用 uprobe 并不容易
发展
bcc
bcc 是自带 mysql 和 postgres 的例子的, 可以观测慢查询和 latency 但针对 pg 必须开启 dtrace 才能使用
- tools/dbslower: Trace MySQL/PostgreSQL queries slower than a threshold. Examples.
- tools/dbstat: Summarize MySQL/PostgreSQL query latency as a histogram. Examples.
postgres-bcc
能不能不用 dtrace 而只使用 eBPF 的 uprobe 来观测 pg 的查询呢?答案是能的:
就像 mysql 的查询入口是 dispatch_command 一样,要使用 uprobe 来 trace 的函数入口是 exec_simple_query 之前在 GitHub 上查询一下,最早把 trace postgres 写成应用的是 postgres-bcc 作者应用 bcc 且不用开启 pg 自带的 dtrace 写了一系列 trace pg 的小工具,工具包括:
- Lock tracing(包括 lwLock)
- Network usage
- WAL
- Filesystem(io)
这个项目相比 bcc examples 可以说是非常成熟,作者把 kprobe 和 uprobe 结合起来,来从用户态和内核态来一起观测 pg, 更厉害的是,作者还写了一篇的文章:
-
还有配套的视频:https://www.youtube.com/watch?v=5BEEQqcF6Ms
PGTracer
PGTracer 是 2022 年诞生的第一个 eBPF 来观测 pg 的企业项目,来自 aiven 这个公司,这个项目的定位也很有意思从最开始的 perf 工具到现在的工具集,它会把一个查询的整体信息打印出来,帮助大家观察查询,更有意思的是,它还包括了查询计划,如图:
- query:
- tracing result:
pg-lock-tracer
pg-lock-tracer 是 2023 年诞生的新项目,作者是这个项目专注于 trace pg 中的各种锁,作者还把 lock 和 lwlock 区分开来 trace, 还可以直接生成 dot 图,方便学习,观测以及 debug.
如果想学习 pg 中的 lock 这个项目也是很好的切入点
-
Lock statistics:
-
dot 图:
作者 @jnidzwetzki 还写了两篇介绍文章
我也想写一个工具
如果大家也想写一个类似的工具如何入手呢?
我在去年给 ecapture 提了一个支持 pg 的 PR 大家可以参考:
- 学习一点前置的 eBPF 的知识,知道 uprobe 怎么用
- 把上面的任何一个项目运行起来
- 针对 pg 找到你想 trace 的点,然后找到相关的函数,利用 uprobe hook 这个函数,用 eBPF 拿到函数的参数值,时间,pid 等信息,利用这些信息整理出 trace 的结果
- 如果需要配合 kprobe 可以把这些结合在一起
- 学习一点 bcc, 可以直接参考我上面列出项目的代码,来 hook 自己想要的函数和想要 trace 的点
- 如果用 go 的同学可以把 bcc 换成 cilium
未来展望
- 不止是 pg, 现在很多数据库可以直接使用 eBPF 来进行观测,像 greenplum 是默认开启 debug 的,观测会更方便些
- 云上数据库结合 eBPF 观测感觉未来也会有一些很棒的项目
- Enjoy it
2024.06.13 更新
有了个看起来非常好的新项目 https://github.com/ChrisBellew/pg-ferret