eBPF专题一 | 手把手教你用eBPF诊断MySQL(含源码)


DBdoctor 是一款数据库内核级性能诊断工具,利用eBPF技术深入数据库内核,致力于解决数据库的一切性能问题。

被称之为“革命性”内核技术的eBPF一直以来都备受关注,而DBdoctor作为一款数据库性能诊断工具,首次将eBPF技术深入应用在了数据库领域,目前已涵盖SQL性能审核、问题SQL一分钟定位、锁分析、审计日志、根因诊断、索引推荐、智能巡检等诸多功能。很多小伙伴对如何利用eBPF技术观测数据库内核有浓厚兴趣,因此我们在【DBdoctor】公众号开设了eBPF技术专栏,将定期与您分享eBPF相关的技术文章,手把手教您使用eBPF探测数据库,欢迎关注我们!

本文是eBPF专题的首篇,将用一个具体的例子介绍如何采用eBPF在MySQL连接校验处加探针,并打出hello world,快来一起体验eBPF的强大吧!

uprobe是一种用户探针,uprobe探针允许在用户程序中动态插桩,插桩位置包括:函数入口、特定偏移处,以及函数返回处。当我们定义uprobe时,内核会在附加的指令上创建快速断点指令,当程序执行到该指令时,内核将触发事件,程序陷入到内核态,并以回调函数的方式调用探针函数,执行完探针函数再返回到用户态继续执行后序的指令。

uprobe基于文件,当一个二进制文件中的一个函数被跟踪时,所有使用到这个文件的进程都会被插桩,这样就可以在全系统范围内跟踪系统调用。uprobe适用于在用户态去解析一些内核态探针无法解析的流量,例如http2流量(报文header被编码,内核无法解码)、https流量(加密流量,内核无法解密)等。

eBPF uprobe如何探测MySQL?1)环境准备

    准备一台 Linux 机器,安装好 Python 和内核开发包。(注:内核开发包版本必须和内核版本一致)
    安装带有符号表的MySQL
    2)基于BCC工具实现探测MySQL

    BCC程序使用 Python 编写,它会嵌入一段 c 代码,执行时将 c 代码编译成BPF字节码加载到内核运行。而 Python 代码可以通过 perf event 从内核将数据拷贝到用户空间读取到数据然后展示出来。

    接下来我们将基于BCC的uprobe,写一个eBPF程序,观测MySQL上是否存在大量短连接。

    a)分析MySQL源码相关连接处理的函数

      //从MySQL源码中分析函数选用了mysql-server层的连接校验处理函数check_connection
      static int check_connection(THD *thd){
      ...
      }