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. 大圆那些事 LIBRARY_PATH和LD_LIBRARY_PATH环境变量的区别

    LIBRARY_PATH和LD_LIBRARY_PATH环境变量的区别 LIBRARY_PATH和LD_LIBRARY_PATH是Linux下的两个环境变量,二者的含义和作用分别如下: LIBRARY ...

  2. JavaScript判断对象数组中是否存在某个对象【转】

    1. 如果要判断数组中是否存在某个元素的话很好判断,直接用数组的indexOf方法就好,存在返回当前索引不存在返回-1 var arr=[1,2,3,4] arr.indexOf(3) arr.ind ...

  3. curl 采集的时候遇到60报错怎么办?

    1.到https://curl.haxx.se/ca/cacert.pem复制下文本粘贴到文件夹cart.pem 然后把catr.pem放到PHP的bin目录下 2.在php.ini中修改下面这句话, ...

  4. Centos7基本命令

    shell基本命令 linux命令行的组成结构 linux系统命令操作语法格式 命令 空格 参数 空格 文件路径或者需要处理的内容 rm   -rf   /tmp/* ls   -la   /home ...

  5. 设置靠近 水平居中的主体内容Div 的 左侧位置固定的Div

    示例效果: 1.主体内容的divMain 水平居中: 2.divLeft 靠近divMain ,位置固定,不随垂直滚动条而动: 相关代码: <html> <head runat=&q ...

  6. 【Spring】AOP

    AOP 编程允许你把遍布应用各处的功能分离出来形成可重用的组件,将安全.事务和日志关注点与你的核心业务逻辑相分离. 面向切面编程往往被定义为促使应用程序分离关注点的一项技术.系统由许多不同组件组成,每 ...

  7. Raspberry Pi开发之旅-光照强度检测(BH1750)

    一.前期准备 1.环境要求 GY30模块(BH1750FVI传感器),树莓派系统,python-smbus,iic开启 2.取消对IIC驱动的黑名单 nano /etc/modprobe.d/rasp ...

  8. 一,前端---关于微信小程序遇到的wx.request({})问题

    域名请求错误问题 当我们在编写小程序,要发送请求时,wx.request({})时或许会遇到如下的问题: 一:这是因为微信小程序的开发中,域名只能是https方式请求,所以我们必须在小程序微信公众平台 ...

  9. Android基础TOP4:Tost的使用

    Activity: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xm ...

  10. CSS——◇demo

    核心思想:嵌套盒子中的◇超过父盒子的部分隐藏. 第一种写法: <!DOCTYPE html> <html> <head> <meta charset=&quo ...