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. P3379最近公共祖先(LCA)

    题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询问的个数和树根结点的序号. 接下来N-1行每 ...

  2. http通讯基础

    1 . 一个网页包括 JS  CSS Html 2 . 状态码:200  正常   302  临时重定向 (类似呼叫转移) 304  未修改,客户端缓存的信息是最新的,无需到服务器重新获取 403  ...

  3. 解决input输入框在iOS中有阴影问题

    input{ -webkit-appearance: none; }

  4. SpringBoot集成Mybatis配置动态数据源

    很多人在项目里边都会用到多个数据源,下面记录一次SpringBoot集成Mybatis配置多数据源的过程. pom.xml <?xml version="1.0" encod ...

  5. BZOJ 3456 NTT图的计数 容斥

    思路: RT 懒得写了 //By SiriusRen #include <cstdio> #include <cstring> #include <algorithm&g ...

  6. C++ 由虚基类 虚继承 虚函数 到 虚函数表

    //虚基类:一个类可以在一个类族中既被用作虚基类,也被用作非虚基类. class Base1{ public: Base1(){cout<<"Construct Base1!&q ...

  7. [ HAOI 2010 ] 最长公共子序列

    \(\\\) \(Description\) 求两个长度\(\le5000\)的大写字母串的\(LCS\)长度及个数,定义两\(LCS\)中某一字符在两序列出现位置有一处不同就视为不同. \(\\\) ...

  8. git——merge和rebase的区别

    参考http://www.jianshu.com/p/129e721adc6e 我在公司里看到其他同事都使用git pull --rebase拉取远程代码,而我总是用git pull,也有同事和我说过 ...

  9. html5——web字体

    基本介绍 1.自定义网页特殊字体,无需考虑用户电脑上是否安装了此特殊字体,从此把特殊字体处理成图片的时代便成为了过去. 2.支持程度比较好,甚至IE低版本浏览器也能支持. 3.web字体的大小鉴定是字 ...

  10. html5——表单

    type类型 email //输入email格式 tel //手机号码 url //只能输入url格式 number //只能输入数字 search //搜索框 range //范围 滑动条 colo ...