systemtap mysql_用Systemtap探索MySQL
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相关推荐
- systemtap mysql_使用systemtap调试工具分析MySQL的性能
SystemTap是Linux下的动态跟踪工具,可以方便的监控.跟踪运行中的程序或Linux内核操作,我们通过写SystemTap脚本(与C语言类似),编译为内核模块,然后加载到内核中运行,它带来的性 ...
- 探索MySQL高可用架构之MHA(6)
探索MySQL高可用架构之MHA(6) -----构建mysql高可用系列(共9篇) 上一篇文章介绍了本次架构的Atlas读写分离! 本篇文章主要介绍本次架构中的keepalive部分! 什么是Kee ...
- systemtap mysql_如何用Systemtap探索MySQL
1 Systemtap MySQL 支持 Dtrace probe,即提供了一些Dtrace用的有用的观测点(probe).Systemtap同样也可以利用这些观测点,可以作为一种低成本的观测MySQ ...
- val什么意思vb中的属性值_老司机带你探索Mysql中int(1)、int(10)、int(11)的区别是什么?...
在上一篇原创文章MySQL一个表的自增id用完了,背井大佬让我用这些姿势再往里插数据,最后留下了一个问题,大家知不知道int(1)和int(11)有什么区别,没有小伙伴互动回答,只有一位老哥让我说一下 ...
- int signed in mysql_【转】mysql 中int类型字段unsigned和signed的区别
转自https://www.cnblogs.com/wangzhongqiu/p/6424827.html 用法: mysql> CREATE TABLE t ( a INT UNSIGNED, ...
- MySQL_(Java)分页查询MySQL中的数据
MySQL_(Java)使用JDBC向数据库发起查询请求 传送门 MySQL_(Java)使用JDBC创建用户名和密码校验查询方法 传送门 MySQL_(Java)使用preparestatement ...
- mysql查询是否走索引_探索MySQL是否走索引(一)——范围查询一定走索引吗?
首先,准备4个版本的数据库,5.5/5.6/5.7/8.0 然后,每个库中有一模一样的表,数据量一样,建立的索引一样,InnoDB引擎. 先看一看,各个版本中,索引统计信息(Cardinality代表 ...
- oracle运维与mysql_运维日记| MySQL/Oracle深度解析之一:逻辑读
前言 THE FIRST 比较数据库优劣.异同的文章有很多了,使用压测工具,进行不同压力下的测试,就能大致上比较出来哪种数据库是"最快"的数据库.但从有经验的数据架构.DBA等专业 ...
- 计算机二级mysql_全国计算机二级MySQL试题(总)
因害怕失败而不敢放手一搏,是不会成功.因害怕计算机等级考试不过关而不去尝试做二级MySQL试题,永远不能战胜自己. 2019年9月二级MySQL试题 [1] 1.数据库系统的核心是________. ...
最新文章
- CListCtrl 使用技巧
- 基于JQuery实现的幻灯片轮播(对时间间隔做严格控制)
- 如何阅读一本书~阅读的层次
- python直角三角形型编程_python打印直角三角形与等腰三角形实例代码
- Struts2 ( 二 )
- python的while循环时if不能打印_Python if语句在while循环中没有响应
- 异常日志处理-ThrowsAdvice
- 1038. Recover the Smallest Number
- 阿里云 MSE 微服务治理发布企业版
- nginx请求报499错误
- 11月第5周业务风控关注|重磅!瓜子二手车“遥遥领先”被罚天价1250万
- 解决由于ntoskrnl.exe导致的蓝屏
- 如何避免拼多多售后?拼多多售后有哪些规则?
- 如何将某一文件添加到信任列表?
- mysql的字段空格是null_空字符与空格字符、NULL、空字符串
- 精通Apache Flink读书笔记
- 高清壁纸免费下载网站
- matlab 显示绘图工具和停靠图形,4 7 交互式绘图工具ppt
- 奇数偶数分频电路(占空比50%)
- 第一章 初到贵地 Win32异界类型
热门文章
- amazon linux 安装nginx,amazon-web-services – 如何在amazon linux disto上安装nginx 1.9.15
- 日语能力考试N2级核心词汇必备—接续词
- SHT30学习记录(51单片机代码)
- 武林外传经典对话大全(转)
- Python算法分析
- Spring中对象的初始化和销毁
- 数据结构——冒泡算法
- 【Java面试题】Double和double 区别
- 单片空间后方交会程序设计(代码共享)
- 计算机及网络验收表,08040501_信息网络系统调试检验批质量验收记录