Inserting user-defined DTrace probes into MySQL source code is very useful to help user identify the performance problems in the application level and the database server, In addition, the cost of the USDT probe is basically neglectable. Each probes inserted into the src can be enabled by adding the code like:

 If (PROVIDER_PROBE_ENABLED()

{

                PROVIDER_PROBE(arg0,…);

}

The steps to add DTrace probes into MySQL is very straightforward.

Step 1: Figure out what probes are needed to insert into the source code

This is the difficult part that requires you understand the MySQL implementation details. Generally, it is good to insert probes to clarify the DB response time distribution including processing query, waiting on locks and latches, doing disk I/O, receiving/sending back data. You can certainly define more probes deep into each of the MySQL engines (such as: define probes to measure the cost of innodb sync spin wait)

Step 2: Define Provider and probes

Create a mysqlprovider.d file as:

provider mysql {

                probe query__execute__start(int);

               probe query__execute__finish(int);

            …

};

It is required to define the probes with easy to understand name. The two underscore(__) is translated to hyphen(-) in the D script file, so the above two probes are called query-execute-startand query-execute-finish

Step 3: Define header file for probes

Create mysqlprovider.h file as:

#ifndef _MYSQLPROVIDER_H

#define _MYSQLPROVIDER_H

 

#ifdef ENABLE_DTRACE

 

#define MYSQL_QUERY_EXECUTE_START(arg0) \\

             __dtrace_mysql__query_execute__start(arg0)

#define MYSQL_QUERY_EXECUTE_START_ENABLED() \\

             __dtraceenabled_mysql__query_execute__start()

#define MYSQL_QUERY_EXECUTE_FINISH(arg0) \\

             __dtrace_mysql__query_execute__finish(arg0)

#define MYSQL_QUERY_EXECUTE_FINISH_ENABLED() \\

             __dtraceenabled_mysql__query_execute__finish()

extern void __ dtrace_mysql__query_execute__start(int)

extern int __ dtraceenabled_mysql__query_execute__start(void)

extern void __ dtrace_mysql__query_execute__finish(int)

extern int __ dtraceenabled_mysql__query_execute__finish(void)

 

#else

/\*

\*Unless DTrace is explicitly enabled with –enable-dtrace, the MYSQL macros will expand to no-ops.

\*/

 

#define MYSQL_QUERY_EXECUTE_START(arg0) \\

             __dtrace_mysql__query_execute__start(arg0)

#define MYSQL_QUERY_EXECUTE_START_ENABLED() \\

             __dtraceenabled_mysql__query_execute__start()

#define MYSQL_QUERY_EXECUTE_FINISH(arg0) \\

             __dtrace_mysql__query_execute__finish(arg0)

#define MYSQL_QUERY_EXECUTE_FINISH_ENABLED()

 

#endif

#endif  /\* _MYSQLPROVIDER_H \*/

 

Step 4: Insert the probes into source code

You need to include the header file created for DTrace probes before inserting the probe macro. And in order to monitor the server behavior as expected, it requires the knowledge of the MySQLsource code to add the probe macro into the right place.

#include <mysqlprovider.h>

mysql_parse {

bool

mysql_execute_command(THD \*thd)

{

 

    MYSQL_QUERY_EXECUTE_START(thd->thread_id);

case SQLCOM_EXECUTE:

{

   mysql_sql_stmt_execute(thd);

  

   MYSQL_QUERY_EXECUTE_FINISH(thd->thread_id);

   Break;

}

….

 

}

 

Step 5: Build MySQL with DTrace

You will need to specify the “—enable-dtrace” as the configure option to make the DTrace probes available in MySQL on Solaris 10 and above. On the other operating system without the DTracefacility, the DTrace probes are disabled as default.

In the Makefile, you can compile the 64-bit MySQL with DTrace probes as bellow:

mysqlproviders.o: mysqlproviders.d $(mysqld_OBJECTS)

dtrace -G -64 -s mysqlproviders.d $(mysqld_OBJECTS)

 

Now, at this point, you have completed inserting the DTrace probes into MySQL, and the probes are ready to use. For example, to use the query-execute-start and query-execute-stop probes, you can write a simple D script(query-execute.d) to measure the time spending on the query execution for each session.

#!/usr/sbin/dtrace –qs

 

mysql\*:::query-execute-start

{

                self->init = timestamp;

}

 

mysql\*:::query-execute-finish

/self->init/

{

                @inittime[args[0]] = sum(timestamp – self->init);

                self->init = 0;

}

 

profile:::tick-5s

{

printf("--------------------------------------------------\\n");

        printf("Date: %Y\\n", walltimestamp);

        printf("Query execution time\\n");

        printa(@inittime);

        printf("--------------------------------------------------\\n");

}

Now, you can execute the script to get the data for query execution:

#./query_execute.d

--------------------------------------------------

Date: 2007 May 25 19:18:59

Query execution time

 

      149       4542802785

      146       4577178817

      148       4586742308

      147       4602289846

--------------------------------------------------

Please let me know if you find this is useful, any suggestions on which/where probes would be useful in the MySQL server and client application. You can contact me by email:Luojia.chen@sun.com, or comment on this blog.

Resources:

 
 

DTrace Probes In MySQL 自定义探针的更多相关文章

  1. mysql 自定义函数

    原文:http://www.cnblogs.com/zhangminghui/p/4113160.html 引言 MySQL本身提供了内置函数,这些函数的存在给我们日常的开发和数据操作带来了很大的便利 ...

  2. Adding DTrace Probes to PHP Extensions

      By cj on Dec 06, 2012 The powerful DTrace tracing facility has some PHP-specific probes that can b ...

  3. mysql 自定义排序顺序

    mysql 自定义排序顺序 实例如:在sql语句中加入ORDER BY FIELD(status,3,4,0,2,1)语句可定义排序顺序 SELECT tsdvoucher0_.VOUCHER_ID ...

  4. DTrace Probes in HotSpot VM----java

    http://docs.oracle.com/javase/6/docs/technotes/guides/vm/dtrace.html http://docs.oracle.com/javase/7 ...

  5. mysql自定义函数并在存储过程中调用,生成一千万条数据

    mysql 自定义函数,生成 n 个字符长度的随机字符串 -- sql function delimiter $$ create function rand_str(n int) returns VA ...

  6. MySQL 自定义函数CREATE FUNCTION实例

    分享一个MySQL 自定义函数CREATE FUNCTION的实例.mysql> delimiter $$mysql> CREATE FUNCTION myFunction-> (i ...

  7. 利用DTrace实时检测MySQl

    与我们大多数人想象的不同,DTrace用于MySQL时不需对MySQL做任何更改.DTrace最强大的“提供器”(provider,是一组可观测的探测器)是FBT(Functional Boundar ...

  8. MySQL自定义函数(四十六)

    MySQL自定义函数 一.什么是MYSQL自定义函数? mysql当中的自定义函数,我们简称为UDF,它实际上是一种对MySQL扩展的途径,其用法与内置函数相同. 二.自定义函数应该具备哪些条件? 我 ...

  9. MySQL自定义函数

    用户自定义函数(user-defined function,UDF)是一种对MySQL扩展的途径,其用法与内置函数相同. 自定义函数两个必要条件: 参数:可以有另个或多个 返回值:只能有一个 创建自定 ...

随机推荐

  1. Finding Nemo(搜索)

    http://poj.org/problem?id=2049 题意:有一个迷宫,迷宫中有墙.门和空地.有M道墙,每一道墙用(x,y,d,t)表示,(x,y)表示墙的起始坐标,(d=1,t)表示向上t个 ...

  2. Java常用的数组排序算法(面试宝典)

    这段时间有些忙,今天空闲出来给大家分享下Java中常用的数组排序算,有冒泡排序.快速排序.选择排序.插入排序.希尔算法.并归排序算法.堆排序算法,以上排序算法中,前面几种相对后面的比较容易理解一些.下 ...

  3. 6.10---springboot的配置

  4. synchronized关键字详解(二)

    synchronized关键字的性质 1.可重入:同一线程的外层函数获得锁之后,内层函数可直接再次获得该锁,好处:避免死锁,提升封装性 证明可重入粒度:1.同一个方法是可重入的 2.可重入不要求是同一 ...

  5. mysql中的各种concat

    引用:http://www.cnblogs.com/appleat/archive/2012/09/03/2669033.html 一.CONCAT()函数CONCAT()函数用于将多个字符串连接成一 ...

  6. Gradle的属性Property设置与调用

    Gradle在默认情况下已经为Project定义了很多Property: project:Project本身 name:Project的名字 path:Project的绝对路径 description ...

  7. CSS——text-indent

    在h1标签里套入a标签并写上文字,有利于seo,但是文字如何隐藏呢?一般都是a标签变成内联块并首行缩进为负值. <!DOCTYPE html> <html lang="en ...

  8. 06--Qt窗口布局

    Qt窗口布局 标签: qtlayout 2012-05-05 07:56 3076人阅读 评论(0) 收藏 举报  分类: Qt开发(33)  版权声明:本文为博主原创文章,未经博主允许不得转载. 布 ...

  9. Twisted web开发教程

    最近在网上看到一篇twisted web开发文章,将它实践了一下,twisted 提供基本的url路由 和 控制器,模板与模型需要外部扩展 1.目录浏览 2.get请求 3.url路由 4.接受带参数 ...

  10. MYSQL数据库迁移到ORACLE数据库

    一.环境和需求1.环境 MySQL数据库服务器: OS version:Linux 5.3 for 64 bit mysql Server version: 5.0.45 Oracle数据库服务器: ...