暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

基于bpftrace对PostgreSQL进行观测(续)

原创 夏克 2023-03-25
719

基于bpftrace对PostgreSQL进行观测(续)

引子

这篇是第六篇关于可观测技术在数据库上的使用,前几篇都是基于USDT来进行观测的,虽然可以比较方便的对应用程序进行观测,但是有一个很明显的缺点就是需要应用程序预先埋下观测点的探针,是一种静态的跟踪方式。比如OceanBase需要修改源码,PostgreSQL或MySQL则是源码中为了Dtrace提供了一些埋点(需要在编译时开启–enable-dtrace),显然不太适合生产中调试发现问题。这可能让大家对eBPF的可用性和使用范围产生怀疑。当然,之前的文章也提到过USDT只是eBPF技术的冰山一角,所以,今天介绍另一种真正的“零”侵入的观测方法——uprobe。

简介

uprobe是eBPF中的一种类型,它可以让用户空间的程序在应用程序的用户空间地址上安装观察点(probe),并在应用程序执行到该地址时执行自定义的代码。使用uProbe,用户可以监控应用程序的函数调用、系统调用、信号处理等事件,从而实现一些特定的功能,如性能分析、错误排查、安全监控等。

图片.png

原理

  1. 用户空间程序调用某个函数或执行某条指令时,该函数或指令所对应的代码段被映射到内核空间。
  2. 在内核空间,eBPF程序通过uprobes机制注册一个probe,即将一个观察点安装到该函数或指令的代码段中。这个观察点是一个断点,即当应用程序执行到该地址时,会触发一个异常,然后内核会回调eBPF程序执行自定义的代码。
  3. eBPF程序可以访问触发异常的进程的上下文信息,如进程ID、用户ID、系统调用号等,还可以通过一些内核API获取应用程序栈帧信息、内存访问等细节信息。
  4. eBPF程序执行完自定义代码后,可以选择恢复原始的指令并返回到应用程序的正常执行流程中,也可以改变执行流程,比如跳转到其他代码段继续执行。

预备知识

eBPF是什么?eBPF能做什么?如何搭建eBPF环境?等等。这些内容不进行赘述了,可以参考下面几篇文章。

  1. PostgreSQL + eBPF实现数据库服务可观测
  2. OceanBase 4.0 改装:另一种全链路追踪的尝试
  3. 使用eBPF提升可观测性(xiongcc)
  4. pg_lock_tracer实现数据库服务可观测
  5. eBPF实现“零”侵入的慢SQL抓取
  6. 基于bpftrace对PostgreSQL进行观测

范例演示

下面将通过两中范例来演示使用uprobe对PostgreSQL的观测。
一种是bpftrace的安装可以参考上一篇基于bpftrace对PostgreSQL进行观测。
另一种是bcc工具集中trace-bpfcc。

BCC编译安装

sudo apt install liblzma-dev sudo apt install libclang-14-dev git clone https://github.com/iovisor/bcc.git mkdir bcc/build; cd bcc/build cmake .. make sudo make install cmake -DPYTHON_CMD=python3 .. # build python3 binding pushd src/python/ make sudo make install popd

安装完成后在tools目录下会看到以下工具脚本,其中trace.py就是我们今天要演示的一个工具,这些工具会被安装到/usr/sbin/目录下,并加速-bpfcc后缀。

图片.png

PostgreSQL设置

_,不需要任何设置。

演示

图片.png

注解

bpftrace窗口(右上):监控exec_simple_query函数,sudo bpftrace -e 'uprobe:/home/frank/pgsql/bin/postgres:exec_simple_query { printf("sql: %s\n", str(arg0)); }'

trace-bpfcc窗口(左上):同样监控exec_simple_query函数,sudo trace-bpfcc '/home/frank/pgsql/bin/postgres:exec_simple_query "%s" arg1'

psql窗口(左下):执行两个查询命令select version();\l

trace-bpfcc共计不到1000行代码:

图片.png

总结

这篇是作为续,是上一篇的补充,同时更重要的是介绍了使用uprobe方式对用户程序的观测,优点是uprobe是动态跟着的方式,不需要提前埋入探针,所以这种方式有在生产上使用的可能性(不建议再生产上观测调用频繁的函数)。

从输出效果上看trace-bpfcc可读性更好些,但需要安装bcc,一些系统可以用过apt/yum进行安装。bpftrace的优势是可以编写脚本,介个脚本可以实现更复杂的功能。以上可以根据您具体的使用场景进行选择。

最后修改时间:2023-03-27 11:56:48
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论