zoukankan      html  css  js  c++  java
  • 用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
    ", user_string($arg1))
            latency[tid()] = gettimeofday_ns()
    }
    
    probe process("/usr/local/mysql/bin/mysqld").mark("query__parse__done") {
            printf ("parse latency: %dns
    ", 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解析的语句和解析时间.

    杂项

    1. Systemtap的观测成本低, 且成本变高时会自动断开观测, 而不影响被观测程序运行, 因此可以考虑在生产环境作为必杀技使用.
    2. 在Docker容器中, 可以观测到kernel probe, 但观测不到同容器的userspace probe. 原因不详.
    3. 如果MySQL的路径上有软连接, 则可能无法进行userspace probe, 原因不详
  • 相关阅读:
    老树新芽,在ES6下使用Express
    Swift3翻天覆地的改变
    NodeJs回调操作Promise化
    Node的关系型数据库ORM库:bookshelf
    基于Node的PetShop,RESTful API以及认证
    基于Node的PetShop,oauth2认证RESTful API
    Mongoose轻松搞定MongoDB,不要回调!
    Thymeleaf常用语法:表达式语法之运算符
    Thymeleaf对象的使用:日期对象
    Thymeleaf对象的使用:字符串对象
  • 原文地址:https://www.cnblogs.com/zengkefu/p/5679298.html
Copyright © 2011-2022 走看看