Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

用 eBPF trace PostgreSQL 的几种姿势 #257

Open
yihong0618 opened this issue Jan 28, 2023 · 6 comments
Open

用 eBPF trace PostgreSQL 的几种姿势 #257

yihong0618 opened this issue Jan 28, 2023 · 6 comments
Labels
Top Top label of gitblog 技术文章 技术文章

Comments

@yihong0618
Copy link
Owner

yihong0618 commented Jan 28, 2023

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

@yihong0618 yihong0618 added 技术文章 技术文章 Top Top label of gitblog labels Jan 28, 2023
@gaocegege
Copy link

有个疑问,为什么要为 PG 专门写一个 ebpf profiler,而不用之前的 dtrace 呢

@yihong0618
Copy link
Owner Author

有个疑问,为什么要为 PG 专门写一个 ebpf profiler,而不用之前的 dtrace 呢

  1. 因为 build-in dtrace 支持的有限 doc: https://www.postgresql.org/docs/current/dynamic-trace.html
  2. 因为有些系统安装 dtrace 不算太容易,有些 postgres 发行是带 debug info 的,但带 dtrace 的不多

@gaocegege
Copy link

SGTM

@jschwinger233
Copy link

如果用 go 的同学可以把 bcc 换成 cilium

正确的!使用 https://github.com/cilium/ebpf 这个用户态 go lib 可以编译出静态链接 elf,再也不用安装 bcc 那些奇怪的依赖了。

@baiwfg2
Copy link

baiwfg2 commented Apr 21, 2024

very good !

打算好好整整,为自家DB写一套工具,到时候惊艳一下 😄

@yihong0618
Copy link
Owner Author

very good !

打算好好整整,为自家DB写一套工具,到时候惊艳一下 😄

有了个新项目
https://github.com/ChrisBellew/pg-ferret

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Top Top label of gitblog 技术文章 技术文章
Projects
None yet
Development

No branches or pull requests

4 participants