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("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

编译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解析的语句和解析时间.

杂项

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

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

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

systemtap mysql_用Systemtap探索MySQL相关推荐

  1. systemtap mysql_使用systemtap调试工具分析MySQL的性能

    SystemTap是Linux下的动态跟踪工具,可以方便的监控.跟踪运行中的程序或Linux内核操作,我们通过写SystemTap脚本(与C语言类似),编译为内核模块,然后加载到内核中运行,它带来的性 ...

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

    探索MySQL高可用架构之MHA(6) -----构建mysql高可用系列(共9篇) 上一篇文章介绍了本次架构的Atlas读写分离! 本篇文章主要介绍本次架构中的keepalive部分! 什么是Kee ...

  3. systemtap mysql_如何用Systemtap探索MySQL

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

  4. val什么意思vb中的属性值_老司机带你探索Mysql中int(1)、int(10)、int(11)的区别是什么?...

    在上一篇原创文章MySQL一个表的自增id用完了,背井大佬让我用这些姿势再往里插数据,最后留下了一个问题,大家知不知道int(1)和int(11)有什么区别,没有小伙伴互动回答,只有一位老哥让我说一下 ...

  5. int signed in mysql_【转】mysql 中int类型字段unsigned和signed的区别

    转自https://www.cnblogs.com/wangzhongqiu/p/6424827.html 用法: mysql> CREATE TABLE t ( a INT UNSIGNED, ...

  6. MySQL_(Java)分页查询MySQL中的数据

    MySQL_(Java)使用JDBC向数据库发起查询请求 传送门 MySQL_(Java)使用JDBC创建用户名和密码校验查询方法 传送门 MySQL_(Java)使用preparestatement ...

  7. mysql查询是否走索引_探索MySQL是否走索引(一)——范围查询一定走索引吗?

    首先,准备4个版本的数据库,5.5/5.6/5.7/8.0 然后,每个库中有一模一样的表,数据量一样,建立的索引一样,InnoDB引擎. 先看一看,各个版本中,索引统计信息(Cardinality代表 ...

  8. oracle运维与mysql_运维日记| MySQL/Oracle深度解析之一:逻辑读

    前言 THE FIRST 比较数据库优劣.异同的文章有很多了,使用压测工具,进行不同压力下的测试,就能大致上比较出来哪种数据库是"最快"的数据库.但从有经验的数据架构.DBA等专业 ...

  9. 计算机二级mysql_全国计算机二级MySQL试题(总)

    因害怕失败而不敢放手一搏,是不会成功.因害怕计算机等级考试不过关而不去尝试做二级MySQL试题,永远不能战胜自己. 2019年9月二级MySQL试题 [1] 1.数据库系统的核心是________. ...

最新文章

  1. CListCtrl 使用技巧
  2. 基于JQuery实现的幻灯片轮播(对时间间隔做严格控制)
  3. 如何阅读一本书~阅读的层次
  4. python直角三角形型编程_python打印直角三角形与等腰三角形实例代码
  5. Struts2 ( 二 )
  6. python的while循环时if不能打印_Python if语句在while循环中没有响应
  7. 异常日志处理-ThrowsAdvice
  8. 1038. Recover the Smallest Number
  9. 阿里云 MSE 微服务治理发布企业版
  10. nginx请求报499错误
  11. 11月第5周业务风控关注|重磅!瓜子二手车“遥遥领先”被罚天价1250万
  12. 解决由于ntoskrnl.exe导致的蓝屏
  13. 如何避免拼多多售后?拼多多售后有哪些规则?
  14. 如何将某一文件添加到信任列表?
  15. mysql的字段空格是null_空字符与空格字符、NULL、空字符串
  16. 精通Apache Flink读书笔记
  17. 高清壁纸免费下载网站
  18. matlab 显示绘图工具和停靠图形,4 7 交互式绘图工具ppt
  19. 奇数偶数分频电路(占空比50%)
  20. 第一章 初到贵地 Win32异界类型

热门文章

  1. amazon linux 安装nginx,amazon-web-services – 如何在amazon linux disto上安装nginx 1.9.15
  2. 日语能力考试N2级核心词汇必备—接续词
  3. SHT30学习记录(51单片机代码)
  4. 武林外传经典对话大全(转)
  5. Python算法分析
  6. Spring中对象的初始化和销毁
  7. 数据结构——冒泡算法
  8. 【Java面试题】Double和double 区别
  9. 单片空间后方交会程序设计(代码共享)
  10. 计算机及网络验收表,08040501_信息网络系统调试检验批质量验收记录