用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("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、Oracle性能
[IT168 技术]本文根据吕海波2018年5月11日在[第九届中国数据库技术大会]上的演讲内容整理而成. 讲师介绍: 吕海波,美创科技研究员,ITPUB管理版版主.出版技术书籍<Oracle内 ...
- 深度探索MySQL主从复制原理
深度探索MySQL主从复制原理 一 .概要 MySQL Replication (MySQL 主从复制) 是什么? 为什么要主从复制以及它的实现原理是什么? 1.1 MySQL 主从复制概念 MySQ ...
- 从官方文档中探索MySQL分页的几种方式及分页优化
概览 相比于Oracle,SQL Server 等数据库,MySQL分页的方式简单得多了,官方自带了分页语法 limit 语句: select * from test_t LIMIT {[offset ...
- MySQL基准测试--innodb_buffer_pool_instances
http://blog.chinaunix.net/uid-26896862-id-3345441.html 目的 根据现有硬件环境下,测试MySQL单实例下,在数据量小于innodb_buffer_ ...
- 从程序员的角度深入理解MySQL
前言 今天我将站在程序员的角度以MySQL为例探索数据库的奥秘! 数据库基本原理 我对DB的理解 1.数据库的组成:存储 + 实例 不必多说,数据当然需要存储:存储了还不够,显然需要提供程序对存储 ...
- MySQL恩恩怨怨
数据库基础 Windows安装MySQL Mac安装MySQL Linux安装MySQL MySQL存储引擎概述 MySQL表操作 MySQL支持的数据类型 MySQL表的完整性约束 MySQL记录操 ...
- 学习mysql水平分区和实践笔记
SHOW PLUGINS; sql 可以查看partition的Status 是否是ACTIVE的 使用mydatetime 进行水平分区案例: CREATE TABLE test_users ( ` ...
- Talk About AWS Aurora for MySQL max_connections parameter Calculation | 浅谈AWS Aurora for MySQL数据库中 max_connections参数的计算
1. The Problem | 现象 When connect to the product environment database of my company, the Navicat show ...
- 数据库篇:mysql事务原理之MVCC视图+锁
前言 数据库的事务特性 数据并发读写时遇到的一致性问题 mysql事务的隔离级别 MVCC的实现原理 锁和隔离级别 关注公众号,一起交流,微信搜一搜: 潜行前行 1 数据库的事务特性 原子性:同一个事 ...
随机推荐
- Python【基础第三篇】
set集合 s1=set() 集合特点: 访问速度快 没有重复项 collections系列(数据类型容器模块) 一.计数器(Counter) Counter是对字典类型的补充,用于追踪值的出现次数. ...
- mysql 用户权限
创建用户 CREATE USER username IDENTIFIED BY 'password';
- pip install 下载慢的问题
建个文件 ~/.pip/pip.conf, 内容如下 [global] timeout = 6000 index-url = https://pypi.doubanio.com/simple [ins ...
- 基于Storm 分布式BP神经网络,将神经网络做成实时分布式架构
将神经网络做成实时分布式架构: Storm 分布式BP神经网络: http://bbs.csdn.net/topics/390717623 流式大数据处理的三种框架:Storm,Spark和Sa ...
- Attach source code to a Netbeans Library Wrapper Module
http://rubenlaguna.com/wp/2008/02/22/attach-source-code-to-a-netbeans-library-wrapper-module/ Attach ...
- deque 居然已经实现了 insert 接口
最近有个开发需求,根据server传递来的广告位来展示某条广告. 但最终存储广告的数据结构是deque,里面存储的东西还是对象(stl 基于拷贝语义). 想了半天,在开头和结尾插入比较方便,在中间插入 ...
- OC动态特性
今天是2.15周日,快要过年了,我以一个实习生的身份在公司工作了快要两个月了吧,什么是北漂,北漂就是感觉生活节奏变了,以前困了可以上课睡觉,累了可以回家休息数周,人际交往乏了,可以躲起来看着窗外的雨或 ...
- 1) data-options
<select class="easyui-combobox" data-options="editable:false"> <select ...
- ckeditor 升级到 4.5
原来的项目用的是4.0+asp.net 3.5的,一直不错,这两天升级一下ckeditor到最新版4.5.1,用的是chrome浏览器测试,发觉TextBox.Text获取不到数据,在页面用js写do ...
- C#中的Collection 2
Core Generic interface IEnumerable<T>:you can interate my elemnts, no need to know the count, ...