网站首页 > 技术教程 正文
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 started2.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:long3 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,原因不详。
猜你喜欢
- 2024-10-21 详解linux内核网络数据包发送在UDP协议层的处理与监控
- 2024-10-21 Linux下docker基础环境搭建(linux配置docker)
- 2024-10-21 electron-vue技术篇(electron vue案例)
- 2024-10-21 docker的daemon.json能做什么?(docker dsm)
- 2024-10-21 系统调用使世界完美运行(系统调用可以完成)
- 2024-10-21 Linux 多线程应用中如何编写安全的信号处理函数
- 2024-10-21 检查和升级您的 Linux 内核版本(linux系统检查)
- 2024-10-21 克罗地亚、波黑,新型病毒BalkanDoor和BalkanRAT现身多个国家
- 2024-10-21 asar归档解包(galgame arc文件解包)
- 2024-10-21 从源码角度看Linux内核中的open方法
欢迎 你 发表评论:
- 10-23Excel计算工龄和年份之差_excel算工龄的公式year
- 10-23Excel YEARFRAC函数:时间的"年份比例尺"详解
- 10-23最常用的10个Excel函数,中文解读,动图演示,易学易用
- 10-23EXCEL中如何计算截止到今日(两个时间中)的时间
- 10-2390%人不知道的Excel神技:DATEDIF 精准计算年龄,告别手动算错!
- 10-23计算工龄及工龄工资(90%的人搞错了):DATE、DATEDIF组合应用
- 10-23Excel中如何计算工作日天数?用这两个函数轻松计算,附新年日历
- 10-23怎样快速提取单元格中的出生日期?用「Ctrl+E」批量搞定
- 最近发表
-
- Excel计算工龄和年份之差_excel算工龄的公式year
- Excel YEARFRAC函数:时间的"年份比例尺"详解
- 最常用的10个Excel函数,中文解读,动图演示,易学易用
- EXCEL中如何计算截止到今日(两个时间中)的时间
- 90%人不知道的Excel神技:DATEDIF 精准计算年龄,告别手动算错!
- 计算工龄及工龄工资(90%的人搞错了):DATE、DATEDIF组合应用
- Excel中如何计算工作日天数?用这两个函数轻松计算,附新年日历
- 怎样快速提取单元格中的出生日期?用「Ctrl+E」批量搞定
- Excel日期函数之DATEDIF函数_excel函数datedif在哪里
- Excel函数-DATEDIF求司龄_exceldatedif函数计算年龄
- 标签列表
-
- 下划线是什么 (87)
- 精美网站 (58)
- qq登录界面 (90)
- nginx 命令 (82)
- nginx .http (73)
- nginx lua (70)
- nginx 重定向 (68)
- Nginx超时 (65)
- nginx 监控 (57)
- odbc (59)
- rar密码破解工具 (62)
- annotation (71)
- 红黑树 (57)
- 智力题 (62)
- php空间申请 (61)
- 按键精灵 注册码 (69)
- 软件测试报告 (59)
- ntcreatefile (64)
- 闪动文字 (56)
- guid (66)
- abap (63)
- mpeg 2 (65)
- column (63)
- dreamweaver教程 (57)
- excel行列转换 (56)

本文暂时没有评论,来添加一个吧(●'◡'●)