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

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

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

本文是eBPF专题的首篇,将用一个具体的例子介绍如何采用eBPF在MySQL连接校验处加探针,并打出hello world,快来一起体验eBPF的强大吧!
在这里插入图片描述
eBPF (extended Berkeley Packet Filter)是一种在Linux内核中执行代码的技术,它允许开发人员在不修改内核代码的情况下运行特定的功能。传统的BPF 只能用于网络过滤,而 eBPF则更加强大和灵活,有更多的应用场景,包括网络监控、安全过滤和性能分析等。uprobe是eBPF的一种使用方式,它允许我们在用户空间的应用程序中插入代码来监控和分析内核中的函数调用。

具体来说,eBPF uprobe可以在用户空间的应用程序中选择一个目标函数,并在该函数执行之前和之后插入自定义的代码逻辑。这样可以实现对目标函数的监控、性能分析、错误检测等功能。通过eBPF uprobe,我们可以在不修改内核源代码的情况下,对内核中的函数进行动态追踪和分析。

在这里插入图片描述工作原理
在这里插入图片描述
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){...
}

b)导入BCC的BPF对象


#!/usr/bin/python
//这个对象可以将我们的观测代码嵌入到观测点中执行
from bcc import BPF

c)用c编写观测代码

bpf_text="""
#include <uapi/linux/ptrace.h>
#include <linux/sched.h>//定义结构体 data_t 保存我们每次观测到的结果
struct data_t {u32 pid;u32 tgid;u64 ts;char info[40];
};//PF_PERF_OUTPUT 定义了一个叫 events 的表,观测代码可以将观测数据写入到 events 表中
BPF_PERF_OUTPUT(events);//该自定义函数用来和MySQL观察的内核函数进行绑定关联
int do_check_connection(struct pt_regs *ctx) {//获取了 MySQL 进程对应的结构体 task_struct,然后从获取了其中的 线程pid 和 用户空间进程tgidstruct task_struct *t = (struct task_struct *)bpf_get_current_task();//初始化data用来保存观测结果struct data_t data = {};// create a new connectionchar a[] = "hello world,create a new connection";bpf_probe_read_kernel_str(&data.info,sizeof(data.info),a);// process idbpf_probe_read(&data.pid,sizeof(data.pid),&t->pid);// thread idbpf_probe_read(&data.tgid,sizeof(data.pid),&t->tgid);// bpf_ktime_get_ns returns u64 number of nanoseconds. Starts at system boot time but stops during suspend.data.ts = bpf_ktime_get_ns();//将观测的数据提交到表中events.perf_submit(ctx, &data, sizeof(data));return 0;
}

d)观测代码关联MySQL 中需要观测的函数

# initialize BPF
//自定义的ebpf程序
b = BPF(text=bpf_text)
//将ebpf观察代码中的自定义函数和MySQL的内核函数进行绑定(name为mysqld进程路径,sym为编译后的探测函数名,fn_name为绑定的ebpf自定义函数)
b.attach_uprobe(name="/home/mysqld", sym="_ZL16check_connectionP3THD",fn_name='do_check_connection')

e) 打印观测结果

# output trace result.
print("Starting to Trace MySQL server do_check_connection function")
print("------------------------------------------------------------")//定义打印的回调函数
def print_event(cpu, data, size):event = b["events"].event(data)decoded_string = event.info.decode('utf-8')print("%-35s, process id %-6s, thread id %-6s, sytem uptime(s) %-14s" % (decoded_string,event.tgid, event.pid,event.ts/1000000000))//open_perf_buffer 将打印的回调函数注册到 events 表中
b["events"].open_perf_buffer(print_event)
while 1:try:b.perf_buffer_poll()except KeyboardInterrupt:exit()

f)效果演示
执行该eBPF程序
在这里插入图片描述
分别开两个窗口执行连接MySQL的命令
在这里插入图片描述
打印观测的结果
在这里插入图片描述
从上面的演示中我们能看到,客户端和MySQL建立连接的时候会打印日志,显示这个连接的校验时间、线程id、进程id。如果存在大量日志输出,说明数据库上一直在创建新连接(即短连接),再进行下一步分析是哪个应用程序导致的。

在这里插入图片描述
eBPF在程序开发过程中有哪些限制?

eBPF在应用和开发过程中会出现多种问题,下面就跟大家分享一下eBPF在程序开发过程中可能会遇到的限制:

1)栈大小512字节

eBPF单个探测函数对栈大小限制为512字节,使用BPF_PERF_OUTPUT将数据从内核态输出到用户态时,会直接限制单个数据结构的大小定义不能超过512字节。

2)多参数获取

BCC中的宏定义从PT_REGS_PARM1(x)~PT_REGS_PARM5(x),栈传递的参数,是从右边向左压栈,想要获取探测函数的入参可以通过PT_REGS_PARM来获取,但X86寄存器的个数是有限的,BCC的定义是能取到5个参数,对于超过6个参数的不能直接获取。

3)循环遍历

Kernel 内核版本低于4.15,不支持任何循环。

4)复杂数据结构的解析

对于参数中复杂数据结构进行解析,由于eBPF程序无法直接引用用户态的头文件,且无法直接在eBPF代码中定义C++的类,对于复杂的数据结构获取其成员变量不能直接获取。

例:

class THD: public MDL_context_owner,public Query_area,public Open_tables_state{public:MDL_context mdl_context;enum enum_mark_columns mark_used_columns;unlong wat_privilege;LEX *lex;bool gtid_executed_warning_issued;...private:...LEX_CSTRING m_catalog;}

该数据结构较为复杂,在使用eBPF获取该数据结构的m_catalog时,显然是不能在内核中定义相同的数据结构来进行转换。

5)uretprobe获取入参值

在uretprobe触发时,寄存器中只能确保rax有效保留返回值,无法直接获取函数入参的值。

在这里插入图片描述
利用eBPF技术探测MySQL ,具有更高效,更扩展,更安全等优势,不用修改内核就可观测数据库性能。通过上面例子您是否发现采用eBPF跟踪数据库其实并不难,主要的门槛在于精通数据库内核和Linux编程,而且要对代码有精益求精的意识。您的hello world出现了吗?欢迎进群跟我们探讨!

专题二预告:为什么eBPF可以重新定义数据库可观测

在这里插入图片描述

DBdoctor免费下载

1️⃣ 下载地址(安装包零依赖,支持一键拉起,耗时一分钟内):https://www.hisensecloud.com/h-col-126.html?statId=9

2️⃣ 公众号:DBdoctor
在这里插入图片描述

3️⃣ 在线试用:

https://dbdoctor1.hisensecloud.com

(关注公众号,点击在线试用获取试用环境专属账号密码)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/804188.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FPGA实现Canny算法(Verilog)

在边缘检测算法里面Sobel是比较简单的一个算法&#xff0c;但是其检测出来的边缘往往是比较粗的&#xff0c;效果不是很好&#xff0c;因为我们最理想的边缘肯定就是一个宽度为1的细线。 Canny算法在此基础上进行了改进&#xff0c;通过使用边缘的梯度信息进行非最大值抑制(NM…

【随笔】Git 高级篇 -- 最近标签距离查询 git describe(二十一)

&#x1f48c; 所属专栏&#xff1a;【Git】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢迎大…

【计算机毕业设计】企业仓储管理系统——后附源码

&#x1f389;**欢迎来到我的技术世界&#xff01;**&#x1f389; &#x1f4d8; 博主小档案&#xff1a; 一名来自世界500强的资深程序媛&#xff0c;毕业于国内知名985高校。 &#x1f527; 技术专长&#xff1a; 在深度学习任务中展现出卓越的能力&#xff0c;包括但不限于…

python-pytorch实现CBOW 0.5.000

python-pytorch实现CBOW 0.5.000 数据加载、切词准备训练数据准备模型和参数训练保存模型加载模型简单预测获取词向量降维显示图使用词向量计算相似度参考 数据加载、切词 按照链接https://blog.csdn.net/m0_60688978/article/details/137538274操作后&#xff0c;可以获得的数…

由近期 RAGFlow 的火爆看 RAG 的现状与未来

4 月 1 日&#xff0c;InfiniFlow &#xff08;英飞流&#xff09;的端到端 RAG 解决方案 RAGFlow 正式开源&#xff0c;首日即获得了 github 千星&#xff0c;目前已接近 3000 star。在这之前&#xff0c;InfiniFlow 还开源了专门用于 RAG 场景的 AI 原生数据库 Infinity&…

用 ElementPlus 的日历组件 Calendar 自定义渲染

文章目录 需求分析1. 英文改为中文2. 修改样式3. 自定义头部4. 增删改功能接入需求 使用 ElementPlus中的 Calendar 组件完成自定义渲染 分析 1. 英文改为中文 转为中文的方式:用 ElementPlus的日历组件如何改为中文 2. 修改样式 附源码<template><el-calendar&…

linux查看硬盘空间使用情况

df &#xff08;1&#xff09;查看磁盘空间的占用情况 -h是给大小带上单位 df -h 总空间不一定等于已用未用&#xff0c;系统可能留出来一点空间另做他用 &#xff08;2&#xff09;查看INode的使用情况 df -idu du命令比df命令复杂一点&#xff0c;是查看文件和目录占用的…

部署GlusterFS群集

目录 一、部署GlusterFS群集 1. 服务器节点分配 2. 服务器环境&#xff08;所有node节点上操作&#xff09; 2.1 关闭防火墙 2.2 磁盘分区&#xff0c;并挂载 2.3 修改主机名&#xff0c;配置/etc/hosts文件 3. 安装、启动GlusterFS&#xff08;所有node节点上操作&…

51单片机入门_江协科技_25~26_OB记录的笔记_蜂鸣器教程

25. 蜂鸣器 25.1. 蜂鸣器介绍 •蜂鸣器是一种将电信号转换为声音信号的器件&#xff0c;常用来产生设备的按键音、报警音等提示信号 •蜂鸣器按驱动方式可分为有源蜂鸣器和无源蜂鸣器&#xff08;开发板上用的无源蜂鸣器&#xff09; •有源蜂鸣器&#xff1a;内部自带振荡源&a…

二:什么是RocketMQ

RocketMQ是阿里开源的消息中间件产品&#xff0c;纯Java开发&#xff0c;具有高吞吐量、高可用性、适合大规模分布式系统应用的特点,性能强劲(零拷贝技术)&#xff0c;支持海量堆积,在阿里内部进行大规模使用&#xff0c;适合在互联网与高并发系统中应用。 官方文档&#xff1a…

【Linux】虚拟化技术docker搭建SuitoCRM系统及汉化

CRM系统 CRM&#xff08;Customer Relationship Management&#xff0c;客户关系管理&#xff09;系统是一种用于管理和优化企业与客户关系的软件工具。在商业竞争激烈的现代社会中&#xff0c;CRM系统已成为许多企业提高销售、增强客户满意度和实现持续增长的重要工具。本文将…

计算器(C语言)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 介绍关键代码运行代码&#xff08;3种&#xff09; 介绍 标准计数器&#xff1a;执行加减乘除等等科学计算器&#xff1a;执行分数、统计学、指数函数、对数、三角…

BoostCompass(数据准备预处理模块)

阅读导航 一、网页数据下载二、编写数据去标签与数据清洗的模块 Parser✅boost 开发库的安装1. 基本思路2. 详细讲解&#xff08;1&#xff09;程序递归遍历目录&#xff0c;收集所有HTML文件的路径&#xff08;2&#xff09;对每个HTML文件进行解析&#xff0c;提取出文档标题…

【资源分享】书籍:现代统计学:使用Python的计算方法

::: block-1 “时问桫椤”是一个致力于为本科生到研究生教育阶段提供帮助的不太正式的公众号。我们旨在在大家感到困惑、痛苦或面临困难时伸出援手。通过总结广大研究生的经验&#xff0c;帮助大家尽早适应研究生生活&#xff0c;尽快了解科研的本质。祝一切顺利&#xff01;—…

【微服务】------微服务架构技术栈

目前微服务早已火遍大江南北&#xff0c;对于开发来说&#xff0c;我们时刻关注着技术的迭代更新&#xff0c;而项目采用什么技术栈选型落地是开发、产品都需要关注的事情&#xff0c;该篇博客主要分享一些目前普遍公司都在用的技术栈&#xff0c;快来分享一下你当前所在用的技…

Java每日一题(三道同一类型的题)

前言 本文一共有三道题:1.两数之和 2.三数之和 3. 四数之和 为什么把这三道题放一起呢&#xff0c;因为三数之和是可以根据两数之和进行推导&#xff0c;四数之和可以根据三数之和进行推导。 两数之和 思路分析: 我的思路: 1.排序 2.使用左右指针 3.处理细节问题 先让数组…

生活中的数学 --- 等额本息贷款和等额本金贷款的月供应该怎么算?

等额本息贷款和等额本金贷款的月供应该怎么算&#xff1f; 从一个例子开始&#xff0c;假设我要从银行贷款36万(即&#xff0c;本金)&#xff0c;银行给出的贷款年利率是12%(月利率为年利率除以12)&#xff0c;贷款半年(6个月)&#xff0c;按月还款&#xff0c;分6期还完。 问分…

电池二次利用走向可持续大循环周期的潜力和挑战(第二篇)

一、二次利用风险 电动汽车的当前电池信息&#xff0c;如年份、容量和制造商&#xff0c;通常是相互关联和不完整的。再加上电池内部的电化学变化&#xff0c;SLB在包括安全和环境在内的一些领域存在很大的风险&#xff0c;这表明短期内梯次利用仍然是一个不成熟的方案。 1.1 安…

在mysql中如何更新数据呢?

如何更新一条数据&#xff1f; 在 MySQL 中&#xff0c;更新一条数据可以使用 UPDATE 语句。以下是更新一条数据的基本语法&#xff1a; UPDATE table_name SET column1 value1, column2 value2,... WHERE condition;其中&#xff1a; table_name&#xff1a;要更新的表的…

Linux 系统下对于 MySQL 的初级操作

由于公司老板想把早已封存的服务器陈年老码捣鼓一下&#xff0c;所以找了一个外援&#xff0c;我则是配合提供支持。但是过程并不顺利。至少 5 年以上的间隔&#xff0c;导致外援查看的时候发现很多代码和配置是缺失的&#xff0c;目前卡在数据库部分&#xff0c;而我这边就帮忙…