首页 > 其他分享 >基于BPF提升postgres可观测性的前提或条件

基于BPF提升postgres可观测性的前提或条件

时间:2024-07-30 10:52:58浏览次数:13  
标签:postgres eBPF bpftrace 观测 BPF BCC CONFIG

最近看到一个新产品(dbdoctor)使用了eBPF技术,可实现对sql级别的监控,其涵盖了,cpu,内存,io,网络等,功能非常强大,目前mysql版本的已经开卖了。经过一番了解发现,该技术对于数据库的性能分析,故障排查方面很有用处。下面对了解到的内容总结一下。

参考:

Linux 可观测性 BPF&eBPF 以及 BCC&bpftrace 认知 - 知乎 (zhihu.com)

基于bpftrace对PostgreSQL进行观测 - 墨天轮 (modb.pro)

基于bpftrace对PostgreSQL进行观测(续) - 墨天轮 (modb.pro)

PostgreSQL + eBPF实现数据库服务可观测 - 墨天轮 (modb.pro)

使用eBPF提升可观测性 (qq.com)

BPF、eBPF、BCC、bpftrace的联系

BPF:最初的作用是提升网络过滤工具的性能和监控。

eBPF : 扩展后的BPF通常缩写为eBPF,事实上,在内核中只有一个执行引擎,即 BPF(扩展后的 BPF),它同时支持扩展后的 BPF和经典的 BPF 程序。eBPF有很多工具,按照封装程度由低到高分别是libbpf<bcc<bpftace

BCC(BPF 编译器集合,BPF Compiler Collection):最早用于开发 BPF 跟踪程序的高级框架。它提供了一个编写内核 BPF 程序的C语言环境,同时还提供了其他高级语言(如Python、Lua和C++)环境来实现用户端接口。它也是libbcc和 libbpf库'的前身,这两个库提供了使用BPF 程序对事件进行观测的库函数。BCC源代码库中提供了 70多个BPF 工具,可以用来支持性能分析和排障工作。你可以在自己的系统上安装 BCC,无须自己动手编写任何 BCC代码,更适合开发复杂的脚本和作为后台进程使用,它还可以调用其他库的支持。比如,有不少用 Python 开发的 BCC程序,它们使用 Python 的 argparse 库来提供复杂、精细的工具命令行参数支持。

bpftrace:是一个新近出现的前端,它提供了专门用于创建 BPF 工具的高级语言支持 ,bpftrace 工具的源代码非常简洁,因此本书中介绍相关工具时,可以直接带上源代码来展示具体的观测操作以及数据是如何被处理的。bpftrace 也是基于 libbcc 和 libbpf库进行构建的。编写功能强大的单行程序短小的脚本方面甚为理想

观测postgres的前提和条件

Linux前提

  • 4.1 - kprobes
  • 4.3 - uprobes
  • 4.6 - stack traces, count and hist builtins (use PERCPU maps for accuracy and efficiency)
  • 4.7 - tracepoints
  • 4.9 - timers/profiling

内核还需要使用以下选项进行构建:

CONFIG_BPF=y
CONFIG_BPF_SYSCALL=y
CONFIG_BPF_JIT=y
CONFIG_HAVE_EBPF_JIT=y
CONFIG_BPF_EVENTS=y
CONFIG_FTRACE_SYSCALLS=y
CONFIG_FUNCTION_TRACER=y
CONFIG_HAVE_DYNAMIC_FTRACE=y
CONFIG_DYNAMIC_FTRACE=y
CONFIG_HAVE_KPROBES=y
CONFIG_KPROBES=y
CONFIG_KPROBE_EVENTS=y
CONFIG_ARCH_SUPPORTS_UPROBES=y
CONFIG_UPROBES=y
CONFIG_UPROBE_EVENTS=y
CONFIG_DEBUG_FS=y

postgres前提

最好可以重新编译,并在configure 增加–enable-dtrace选项,可以跟踪postgres提供的观测点。

查看postgres的观测点可以使用readelf -n postgres ,也可以使用tplist-bpfcc -l /home/postgres/bin/postgres,或者访问pg官网提供的信息PostgreSQL: Documentation: 16: 28.5. Dynamic Tracing

一些学习地址

GitHub - bpftrace/bpftrace: High-level tracing language for Linux eBPF

bpftrace/tools/README.md at master · bpftrace/bpftrace · GitHub

Linux eBPF Tracing Tools (brendangregg.com)

 Using BPFtrace to Trace PostgreSQL Vacuum Operations (timescale.com)

后续继续更新相关的内容。

标签:postgres,eBPF,bpftrace,观测,BPF,BCC,CONFIG
From: https://www.cnblogs.com/shen-ren-qiang/p/18331847

相关文章

  • PostgreSQL 之 to_timestamp函数
    to_timestamp是PostgreSQL中的一个函数,用于将字符串或数字转换为时间戳。以下是关于to_timestamp的详细介绍:引入版本to_timestamp函数在PostgreSQL7.3版本中引入。语法to_timestamp有两种主要的用法:1.将字符串转换为时间戳to_timestamp(text,text)第一......
  • 无法使用 Psycopg2 从 jupyter Notebook 连接到 Postgres 数据库
    我正在尝试连接到Postgres中的数据库以将数据插入到我的表中。来自Jupyter笔记本。我正在使用这些命令连接到数据库#url=postgresql+psycopg2://postgres@localhost:5432/citibike'fromsqlalchemyimportcreate_engineengine=create_engine('postgresql://......
  • eBPF skb字段pkt_type
    pkt_type取值范围https://elixir.bootlin.com/linux/v6.5/source/include/uapi/linux/if_packet.h#L33skb中pkt_type值,由网卡驱动层函数eth_type_trans,在tcingress之前,根据目的mac决定。https://elixir.bootlin.com/linux/v6.5/source/net/ethernet/eth.c#L155如果目的mac......
  • 实战:MyBatis适配多种数据库:MySQL、Oracle、PostGresql等
    概叙很多时候,一套代码要适配多种数据库,主流的三种库:MySQL、Oracle、PostGresql,刚好mybatis支持这种扩展,如下图所示,在一个“namespace”,判断唯一的标志是id+databaseId,刚好写了三个同样的方法,一个不带databaseId,两个带databaseId,此时当前库如果连接的是oracle则执行databaseId=......
  • 从 jupyter 笔记本连接到容器化 postgresql
    我有一个运行postgresql的容器,我想摄取一些我在ETL脚本中准备好的数据。我已经创建了数据库,但是,当我尝试通过jupyter笔记本连接本地计算机时,它一直说找不到主机,即使我在.yaml文件中设置了它。我的.yaml文件是这样的:version:'3.7'services:postgres:image:......
  • 【0299】Postgres内核之 INSERT INTO 原始解析树 转 Query 树 (3)
    相关文章:【0297】Postgres内核之INSERTINTO原始解析树转Query树(1)【0298】Postgres内核之INSERTINTO原始解析树转Query树(2)1.opentable(RangeVar指定)在完成了由函数setup_parser_errposition_callback()完成的解析器错误位置报告回调函数的注册后,接下来通......
  • Postgresql & PgAdmin powered by compose
    Postgresql&PgAdminpoweredbycomposehttps://github.com/fanqingsong/compose-postgres/blob/master/docker-compose.ymlQuickStartCloneordownloadthisrepositoryGoinsideofdirectory,cdcompose-postgresRunthiscommanddocker-composeup-d......
  • kettle从入门到精通 第八十一课 ETL之kettle kettle中的json对象字段写入postgresql中
    1、上一节可讲解了如何将json数据写入pg数据库表中的json字段,虽然实现了效果,但若客户继续使用表输出步骤则仍然无法解决问题。正确的的解决方式是设置数据库连接参数stringtype=unspecified2、stringtype=unspecified参数的作用:当设置为 unspecified 时,pgJDBC驱动将根据数......
  • kettle从入门到精通 第八十课 ETL之kettle kettle中的json对象字段写入postgresql中的
    场景:源数据库表为mysql的其中有json字段,通过kettle查询出来插入到目标数据库postgresql中,对应的表中也有json字段。。但是报错,提示kettle查询出来是varchar的的字段,无法插入到目标数据库中。1、创建测试表。CREATETABLEt3(idint,nameJSON);2、测试mysql......
  • 【0298】Postgres内核之 INSERT INTO 原始解析树 转 Query 树 (2)
    相关文章:【0297】Postgres内核之INSERTINTO原始解析树转Query树(1)1.获取insertinto目标表writelock在初始化了一个Query类型变量后,接下来第一步是需要获取INSERTINTO目标表上面的写锁(writelock)。必须在扫描SELECT之前获得INSERT目标表上的写锁,否则如果......