用Systemtap探索MySQL

http://www.actionsky.com/docs/archives/168#Systemtap

目录

Systemtap

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

常用的几种观测点:
1. function, 可以观测函数的访问/返回
2. statement, 可以直接观测源码中的某一行
3. marker, 由源码提供的观测点

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

Systemtap 观测点的支持程度

官方编译的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("[email protected]/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

编译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

Systemtap 使用举例

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

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()])
}

运行

此例中, 在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解析的语句和解析时间.

杂项

  1. Systemtap的观测成本低, 且成本变高时会自动断开观测, 而不影响被观测程序运行, 因此可以考虑在生产环境作为必杀技使用.
  2. 在Docker容器中, 可以观测到kernel probe, 但观测不到同容器的userspace probe. 原因不详.
  3. 如果MySQL的路径上有软连接, 则可能无法进行userspace probe, 原因不详
时间: 2024-10-15 17:30:22

用Systemtap探索MySQL的相关文章

使用动态跟踪技术SystemTap监控MySQL、Oracle性能

[IT168 技术]本文根据吕海波2018年5月11日在[第九届中国数据库技术大会]上的演讲内容整理而成. 讲师介绍: 吕海波,美创科技研究员,ITPUB管理版版主.出版技术书籍<Oracle内核技术揭密>,曾参加过两届数据库大会.IT老兵,22年IT领域从业经历,十数年数据库经验,惯看IT江湖风起云涌.曾在多家巨头型互联网公司(阿里.ebay.京东)从事数据库管理.数据架构.运维自动化工作.目前主要研究数据安全.敏捷运维等方向. 内容摘要: 时间都去哪儿了?这是性能调优时大家最爱问的问题.比

深度探索MySQL主从复制原理

深度探索MySQL主从复制原理 一 .概要 MySQL Replication (MySQL 主从复制) 是什么? 为什么要主从复制以及它的实现原理是什么? 1.1 MySQL 主从复制概念 MySQL 主从复制是指数据可以从一个MySQL数据库服务器主节点复制到一个或多个从节点.MySQL 默认采用异步复制方式,这样从节点不用一直访问主服务器来更新自己的数据,数据的更新可以在远程连接上进行,从节点可以复制主数据库中的所有数据库或者特定的数据库,或者特定的表. 1.2 MySQL 主从复制主要用

分页性能探索-mysql

分页技术在开发中是十分常见的,我刚到公司做的两个项目都用到了分页技术,于是就想着对分页技术进行深入的探索一下. 常见的几种分页方式: 扶梯方式 扶梯方式在导航上通常只提供上一页/下一页这两种模式,部分产品甚至不提供上一页功能,只提供一种"更多/more"的方式,也有下拉自动加载更多的方式,在技术上都可以归纳成扶梯方式. 扶梯方式在技术实现上比较简单及高效,根据当前页最后一条的偏移往后获取一页即可.写成SQL可能类似 SELECT * FROM LIST_TABLE WHERE id &

探索MySQL高可用架构之MHA(7)

-----构建mysql高可用系列(共9篇) 上一篇文章介绍了本次架构的keepalive读写分离! 本篇文章主要介绍本次架构中的mha安装部分! 关于MHA MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职于 Facebook公司)开发,是一套优秀的作为MySQL高可用性环境下故障切换和主从提升的高可用软件.在MySQL故障切换过程中,MHA能做到在 0~30秒之内自动完成数据库的故

探索MySQL高可用架构之MHA(4)

-----构建mysql高可用系列(共9篇) 上一篇文章介绍了本次架构中的Mysql源码安装.本篇文章主要介绍本次架构中的ABBB复制. 首先我们先介绍什么是MySql AB复制???? AB复制又称主从复制,实现的是数据同步.如果要做MySQL AB复制,数据库版本尽量保持一致.如果版本不一致,从服务器版本高于主服务器,但是版本不一致不能做双向复制. MySQL AB复制有什么好处呢? a.解决宕机带来的数据不一致,因为MySQL AB复制可以实时备份数据. b.减轻数据库服务器压力,这点很容

探索MySQL高可用架构之MHA(6)

-----构建mysql高可用系列(共9篇) 上一篇文章介绍了本次架构的Atlas读写分离! 本篇文章主要介绍本次架构中的keepalive部分! 什么是Keepalived呢???? keepalived是一款c语言写的实现在linux系统上实现负载均衡和高可用的软件.它遵从于GNU是一款优秀的开源软件.keepalived观其名可知,保持存活,在网络里面就是保持在线了,也就是所谓的高可用或热备,用来防止单点故障的发生. 两个关键词的解释 负载均衡 keepalived内置了对ipvs函数的调

探索MySQL高可用架构之MHA(5)

-----构建mysql高可用系列(共9篇) 上一篇文章介绍了本次架构的AB复制操作! 本篇文章主要介绍本次架构中的Atlas读写分离! 为什么要分库.分表.读写分离? 现在大型的电子商务系统,在数据库层面大都采用读写分离技术,就是一个Master数据库,多个Slave数据库. Master库负责数据更新,Slave库当然负责非实时数据查询. 因为在实际的应用中,数据库都是读多写少(读取数据的频率高,更新数据的频率相对较少),而读取数据通常耗时比较长,占用数据库服务器的CPU较多,从而影响用户体

从程序员的角度深入理解MySQL

前言 作为一名工作了4年的程序猿,今天我将站在程序员的角度以MySQL为例探索数据库的奥秘! 数据库基本原理 第一,数据库的组成:存储 + 实例 不必多说,数据当然需要存储:存储了还不够,显然需要提供程序对存储的操作进行封装,对外提供增删改查的API,即实例. 一个存储,可以对应多个实例,这将提高这个存储的负载能力以及高可用:多个存储可以分布在不同的机房.地域,将实现容灾. 第二,按Block or Page读取数据 用大腿想也知道,数据库不可能按行读取数据(Why?   ^_^).实质上,数据

mysql 默认引擎innodb 初探(二)

写在前 本篇博客承接上一篇 mysql 默认引擎innodb 初探(一)进行对mysql数据库 innodb存储引擎进行探索 mysql默认存储引擎 innodb简介 Innodb是第一个完整支持ACID事务的mysql存储引擎(BDB是第一个支持事务的mysql存储引擎,目前已经停止开发): 主要特点是 支持行锁,MVCC,事务,外键及一致性非锁读,可以有效利用CPU和内存: 各版本对比如下: tips : 如果不支持多回滚段,Innodb最大支持并发事务量被限制为1023 innodb体系架