乐趣区

关于mysql:技术分享-dbslower-工具学习之探针使用

作者:王悦

Copyright (C) 2021 wingYue

本文起源:原创投稿

* 爱可生开源社区出品,原创内容未经受权不得随便应用,转载请分割小编并注明起源。


最近应用了 bcc 工具集中的 dbslower,这个工具能够探测 MySQL 指定阈值下的慢 query,应用十分不便。

应用举例:

因为这个工具是一个 python 脚本,于是关上学习一下外部的机制。

首先开始的一段是一些应用案例:

这里咱们关注这两个:

dbslower mysql -p 480 -m 30  # trace MySQL queries slower than 30ms

dbslower mysql -x $(which mysqld)  # trace MySQL queries with uprobes

同样是检测慢日志,一种是提供 pid,另一种是提供二进制文件地址,粗看之下只是应用形式的不同,其实其中齐全走向了不同的机制。

咱们接着看下一段

这一段是用来确认最终应用的机制 mode,如果提供 pid,那么 mode=“MYSQL57”,如果提供的是二进制地址,那么 mode=“USDT”。

这里 USDT 指的是(Userland Statically Defined Tracing)用户态动态探针,也就是说,当应用 pid 时,脚本理论应用了 USDT 动态探针机制,而应用二进制文件时,则应用了另一种动静探针机制。要持续了解上面的段落,咱们先来看一下动态探针和动静探针到底是指什么。

探针的分类

探针大抵能够分为两类,动态探针和动静探针。

动态探针就比方咱们上文看到的 USDT,对应 MySQL 中,则是 MySQL DTrace 的实现。这类探针须要当时在代码中定义并在编译时开启。

须要阐明的是 MySQL DTrace 在 MySQL5.7.18 被弃用,在 MySQL8.0 被彻底删除,所以咱们只能在晚期的版本中进行 DTrace 检测。MySQL 的 DTrace 蕴含了很多的探针,比方 query-start 和 query-done 用于检测一条语句的执行过程,比方 connection-start 和 connection-done 用于检测客户端连贯的过程,这些探针都是须要在代码中实现的。且启用探针须要减少编译参数 -DENABLE_DTRACE=1。

咱们来看一个官网示例直观的理解一下:

https://dev.MySQL.com/doc/ref…

这里应用了 query-start 和 query-done 这两个探针,来获取语句执行工夫

编辑 DTrace 脚本

执行成果

惋惜动态探针在新版的 MySQL 上曾经没有了,咱们就不去深究了。

除了动态探针,还有一类是动静探针,就比方 bfs 技术中常常应用到的 uprobes 和 kprobes,这类探针比拟灵便,能够在程序运行时动静增加,如果相熟代码,堪称是神器。

我应用 MySQL8.0 作为试验环境,简略写了一个利用 uprobes 打印 query 的示例。

这里的关键在于{printf("%s\n", str(*arg1)); },意思是打印出 dispatch_command 方 法的第二个参数指向的内容。

同样的原理,变更一下函数,能动静打印任何咱们想要的变量内容,或者利用探针写一些 bpf 脚本,可能实现许多性能,非常好用。

好了,回到咱们的 dbslower 脚本上来。实际上这个脚本同时实现了动态探针和动静探针两种机制。

当咱们应用 pid 时,比方 dbslower MySQL -p 480 -m 30,变量 mode 值为“USDT”,走入了上图的 else 段落,即利用了query__startquery__done 这两个动态探针,当探针被触发时,挂载到对应的处理函数 query_startquery_end,这两个处理函数中的逻辑很简略,就是获取对应的 query 内容,记录时间等,有趣味的话能够去脚本中查看,这里就不列举了。

另一种状况,当咱们应用二进制文件地址时,比方 dbslower MySQL -x $(which MySQLd),变量 mode 值为“MYSQL57”,走入了上图的 if 段落,mysql_func_name 在脚本中被赋予的值是 dispatch_command 函数,即利用了 bfp,在函数 dispatch_command 执行前后插入了动静探针,同样的,当探针被触发时,挂载到对应的处理函数query_startquery_end进行工夫的计算。

总结

  1. dbslower 脚本利用探针检测 MySQL query 执行工夫。
  2. 当 dbslower 应用 pid 时,理论利用了动态探针机制,须要在编译时开启 -DENABLE_DTRACE=1,且该机制在 MySQL 新版本中被删除了,须要特地留神。
  3. 当 dbslower 应用 mysqld 二进制门路时,理论是利用了动静探针机制,动静探针能够在程序运行时动静增加,无论新旧版本的 MySQL 都能够应用。
  4. bpf 的 uprobe 动静探针非常灵便,纯熟应用之后,对一些故障排查场景是一大利器,毛病是少数状况下须要对照代码进行配置。
退出移动版