mysql dtrace_如何用Systemtap探索MySQL-爱可生

本文介绍了如何使用Systemtap结合MySQL的Dtrace探针进行系统观测,探讨了不同编译版本的MySQL对观测点的支持情况,并通过实例展示了如何观测SQL解析的延迟时间。Systemtap提供了一种低成本的MySQL行为分析方法,适用于生产环境。
摘要由CSDN通过智能技术生成

原标题:如何用Systemtap探索MySQL-爱可生

ef3dc25289d4cbb4d96d20bb134ca2a2.png

1 Systemtap

MySQL 支持 Dtrace probe,即提供了一些Dtrace用的有用的观测点(probe)。Systemtap同样也可以利用这些观测点,可以作为一种低成本的观测MySQL的手段。

常用的几种观测点:

function,可以观测函数的访问/返回;

statement,可以直接观测源码中的某一行;

marker,由源码提供的观测点。

日常常用的是function和marker,尤其是marker,MySQL源码提供的观测点对于学习MySQL行为有所帮助。

2 Systemtap 观测点的支持程度

2.1 官方编译的MySQL 5.7.11

官方编译的MySQL支持function观测点:

> stap -L 'process("/opt/mysql-5.7.11-linux-glibc2.5-x86_64/bin/mysqld").function("dispatch_command")'

process("/opt/mysql-5.7.11-linux-glibc2.5-x86_64/bin/mysqld").function("dispatch_command@/export/home/pb2/build/sb_0-17781605-1454370718.35/mysql-5.7.11/sql/sql_parse.cc:1183") $thd:struct THD* $com_data:union COM_DATA const* $command:enum enum_server_command

官方编译的MySQL不支持mark观测点:

> stap -v -L 'process("/opt/mysql-5.7.11-linux-glibc2.5-x86_64/bin/mysqld").mark("*")'

Pass 1: parsed user script and 109 library script(s) using 96972virt/38616res/5780shr/32800data kb, in 150usr/10sys/164real ms.

Pass 2: analyzed script: 0 probe(s), 0 function(s), 0 embed(s), 0 global(s) using 97764virt/40340res/6684shr/33592data kb, in 10usr/0sys/4real ms.

Tip: /usr/share/doc/systemtap/README.Debian should help you get started

2.2 编译MySQL 5.7.11

在MySQL源码dtrace.cmake中可以找到定义:

Check if OS supports DTrace

MACRO(CHECK_DTRACE)

FIND_PROGRAM(DTRACE dtrace)

MARK_AS_ADVANCED(DTRACE)

# On FreeBSD, dtrace does not handle userland tracing yet

IF(DTRACE AND NOT CMAKE_SYSTEM_NAME MATCHES "FreeBSD")

SET(ENABLE_DTRACE ON CACHE BOOL "Enable dtrace")

ENDIF()

可知Linux环境下,只要环境中存在dtrace就会开启ENABLE_DTRACE。于是装好systemtap-sdt-dev包,再进行cmake就可以了. 不需要额外的配置选项,也不需要开启WITH_DEBUG。

(说明:按照手册,systemtap-sdt-dev中的dtrace用于将file.d文件转成头文件参与编译,并非真正的dtrace)

> apt-get install -sdt-dev

> cmake -DBUILD_CONFIG=mysql_release -DDOWNLOAD_BOOST=1 -DDOWNLOAD_BOOST_TIMEOUT=3600 -DWITH_BOOST=/opt/boost -L .

检查cmake的输出变量 (输出经过截断):

ENABLE_DTRACE:BOOL=ON

WITH_DEBUG:BOOL=OFF

ENABLE_DTRACE编译的MySQL支持mark观测点 (输出经过截断):

> stap -L 'process("/usr/local/mysql/bin/mysqld").mark("*")'

process("/usr/local/mysql/bin/mysqld").mark("command__done") $arg1:long

process("/usr/local/mysql/bin/mysqld").mark("command__start") $arg1:long $arg2:long $arg3:long $arg4:long

process("/usr/local/mysql/bin/mysqld").mark("connection__done") $arg1:long $arg2:long

process("/usr/local/mysql/bin/mysqld").mark("update__start") $arg1:long

3 Systemtap 使用举例

举例使用Systemtap的mark观测点,观测SQL的解析。

3.1 Systemtap脚本

global latency

probe process("/usr/local/mysql/bin/mysqld").mark("query__parse__start") {

printf ("parsing %s\n", user_string($arg1))

latency[tid()] = gettimeofday_ns()

}

probe process("/usr/local/mysql/bin/mysqld").mark("query__parse__done") {

printf ("parse latency: %dns\n", gettimeofday_ns() - latency[tid()])

}

3.2 运行

此例中,在Docker 容器中进行systemtap的编译,再放到生产环境执行,所以分成编译和执行两步。也可以直接使用stap执行。

> stap -v /opt/test_mysql_sql_parse.stp -m test_mysql_sql_parse.ko

$ sudo staprun -v test_mysql_sql_parse.ko

staprun:insert_module:183 Module test_mysql_sql_parse inserted from file /opt/test_mysql_sql_parse.ko

parsing select @@version_comment limit 1

parse latency: 54094ns

parsing create database test.a(a int)

parse latency: 48596ns

可以看到输出中包含SQL解析的语句和解析时间。

4 杂项

Systemtap的观测成本低,且成本变高时会自动断开观测,而不影响被观测程序运行,因此可以考虑在生产环境作为必杀技使用;

在Docker容器中,可以观测到kernel probe,但观测不到同容器的userspace probe,原因不详;

如果MySQL的路径上有软连接,则可能无法进行userspace probe,原因不详。

责任编辑:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值