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,原因不详。

systemtap mysql_如何用Systemtap探索MySQL相关推荐

  1. 如何用jsp连接mysql_如何用jsp连接mysql数据库

    展开全部 import java.sql.*; public class BaseDao { public ResultSet rs=null; public Statement pstmt=null ...

  2. 怎么在cmd连接mysql_如何用cmd连接Mysql数据库

    通常我们在网络上看到的mysql教程和mysql工具书,里面都是cmd命令和结果集. 也许有一些初学者不懂在系统的哪个角落输入这些命令,或者启动mysql的一些工具,下面教你怎样进入这个mysql的c ...

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

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

  4. python向数据库写入数据_如何用Python向Mysql中插入数据

    我们使用Python经常会和Postgresql进行搭配,很少将python和mysql进行搭配.下面小编给大家分享如何用Python向Mysql中插入数据. 工具/原料 Pycharm 方法/步骤 ...

  5. 【SystemTap】 Linux下安装使用SystemTap源码安装SystemTap

    文章 http://blog.csdn.net/zklth/archive/2010/09/28/5912785.aspx 介绍的是使用CentOS默认的SystemTap,这里介绍使用SystemT ...

  6. 如何实现mysql自动备份_如何用脚本实现mysql自动备份?

    如何用脚本实现mysql自动备份? 发布时间:2020-05-21 15:24:19 来源:亿速云 阅读:173 作者:鸽子 首先执行vi dbbackup.sh命令,在打开的编辑器输入:#!/bin ...

  7. systemtap mysql_用Systemtap探索MySQL

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

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

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

  9. 如何用命令行启动mysql_命令行方式启动mysql 如何用命令行启动mysql

    如何用命令行启动mysql,有时候,仅是简单的想在电脑上启动myql,当然如果用myql图形管理器也是可以的,比如avicate以及qlyog,本经验教你如何使用命令行启动myql. 如何用命令行进入 ...

最新文章

  1. Linux 小知识翻译 - 「架构」(arch)
  2. ant自动打包多个android项目为apk
  3. 无需用眼,大脑直接成像,失明的人也能重新「看见」|Science
  4. 为什么阿里工程师纷纷在内网晒代码?
  5. 软件技术专业-就业提示(三、Java工程师必备技能)
  6. APNS提供了两项基本的服务:消息推送和反馈服务
  7. UNICODE十六进制数组转成中英文
  8. 拥抱Flutter,从0到1构建大前端应用
  9. bpmn js 生成json_js处理的8种跨域方法
  10. python求三角形的角度
  11. Python数据可视化(趋势图、条形图、动态图)
  12. Win10下用Strokeit的方法
  13. 那时候的漫画【怀旧贴】
  14. 台式计算机品牌怎么查,教你怎么看电脑主板型号和品牌
  15. 一位IT博士的大学十年
  16. oracle 时间天数计算,oracle计算连续登陆/上班天数
  17. AIO-3399J重新安装Ubuntu系统-刷新固件
  18. Linux 之 开机自启动
  19. tdm-gcc 的下载、安装教程【超详细】
  20. 2022-2027年中国功能糖行业市场调研及未来发展趋势预测报告

热门文章

  1. android直播视频编码,Android手机直播之视频编码技术
  2. 如何巧妙的获取Win 7/xp开机密码方法(粘滞键漏洞)
  3. 如何利用Trimble RealWorks三维激光扫描仪进行外业测量和内业处理?
  4. Adadelta--学习笔记
  5. Google年度安全报告显示第三方应用商店安全状况不容乐观
  6. pycharm专业版下载安装教程
  7. 支付宝wap异步回调失败问题
  8. Eclipse中文乱码解决方法
  9. ERP 和 MES 之间的联系是什么?
  10. 树莓派安装 kodi 19.1