image

用 eBPF 来观测用户空间应用程序这几年越来越火了,诞生了不少开源的应用,但在数据库这个领域相关的应用还不算太多,特别是 PostgreSQL. 在这个领域之前没那么多人研究可能的原因:

  1. 数据库开发在前些年还没像今天这么热门
  2. PostgreSQL 自带 dtrace 只需要在编译时 --enable-dtrace 就可以进行一些观测
  3. 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, 更厉害的是,作者还写了一篇的文章:

PGTracer

PGTracer 是 2022 年诞生的第一个 eBPF 来观测 pg 的企业项目,来自 aiven 这个公司,这个项目的定位也很有意思从最开始的 perf 工具到现在的工具集,它会把一个查询的整体信息打印出来,帮助大家观察查询,更有意思的是,它还包括了查询计划,如图:

  • query: image
  • tracing result: image

pg-lock-tracer

pg-lock-tracer 是 2023 年诞生的新项目,作者是这个项目专注于 trace pg 中的各种锁,作者还把 lock 和 lwlock 区分开来 trace, 还可以直接生成 dot 图,方便学习,观测以及 debug.

如果想学习 pg 中的 lock 这个项目也是很好的切入点

image

  • Lock statistics: image

  • dot 图: image

作者 @jnidzwetzki 还写了两篇介绍文章

我也想写一个工具

如果大家也想写一个类似的工具如何入手呢?

我在去年给 ecapture 提了一个支持 pg 的 PR 大家可以参考:

  1. 学习一点前置的 eBPF 的知识,知道 uprobe 怎么用
  2. 把上面的任何一个项目运行起来
  3. 针对 pg 找到你想 trace 的点,然后找到相关的函数,利用 uprobe hook 这个函数,用 eBPF 拿到函数的参数值,时间,pid 等信息,利用这些信息整理出 trace 的结果
  4. 如果需要配合 kprobe 可以把这些结合在一起
  5. 学习一点 bcc, 可以直接参考我上面列出项目的代码,来 hook 自己想要的函数和想要 trace 的点
  6. 如果用 go 的同学可以把 bcc 换成 cilium

image

未来展望

  1. 不止是 pg, 现在很多数据库可以直接使用 eBPF 来进行观测,像 greenplum 是默认开启 debug 的,观测会更方便些
  2. 云上数据库结合 eBPF 观测感觉未来也会有一些很棒的项目
  3. Enjoy it

2024.06.13 更新

有了个看起来非常好的新项目 https://github.com/ChrisBellew/pg-ferret image