与我们大多数人想象的不同,DTrace用于MySQL时不需对MySQL做任何更改。DTrace最强大的“提供器”(provider,是一组可观测的探测器)是FBT(Functional Boundary Tracing,函数边界跟踪)提供器。我们可以把它与PID提供器结合起来,用于深入观测userland过程。只需要对MySQL代码有一些基本了解,我们就可以开发挖掘这些功能了。
  那么,我们如何才能了解MySQL代码呢?有两种方法。第一,你可以买一本好点儿的相关书籍,如MySQL Internals。如果你很重视MySQL相关知识,一定要买这本书。第二种方法是通过DTrace本身来了解MySQL代码。DTrace最好的一个功能是一个叫做“flowindent”的编译指示选项。这个函数会相应地显示entry和return并生成一个逻辑树,以便用户能了解其内部的函数调用关系。实际上,我们可以通过这种方式了解到MySQL的内部情况。
  下面是代码(mysqlflow.d):
#!/usr/sbin/dtrace -s
  
#pragma D option flowindent
  
pid$target:mysqld::entry
{
}
pid$target:mysqld::return
{
}
  将这段代码放到一个文本文件中,然后将该文件改为可执行文件。这里,我们使用PID提供器来观测“mysqld”过程。因为我们指定的不是一个函数(请记住,探测器格式是PROBIDER:MODULE:FUNCTION:NAME),所以它是作为wildcard被翻译的。因此,我们会看见所有的函数,所有函数的entry和return名都为初始探测器名。
  在运行该文件时,我们需要使用DTrace –p来指定mysql daemon的PID(过程id)。在Solaris中,通过如下“pgrep”命令我们可以很方便地获得PID。
# ./mysqlflow.d -p `pgrep -x mysqld`
0  -> sync_array_get_nth_cell       
0  <- sync_array_get_nth_cell       
0 <- sync_array_print_long_waits      
0 -> os_thread_sleep            
2 <- os_thread_sleep            
2 -> sync_arr_wake_threads_if_sema_free  
2  -> sync_array_enter          
2   -> os_mutex_enter          
2    -> os_fast_mutex_lock       
2    <- os_fast_mutex_lock       
2   <- os_mutex_enter          
2  <- sync_array_enter          
2  -> sync_array_exit           
2   -> os_mutex_exit           
2    -> os_fast_mutex_unlock      
2    <- os_fast_mutex_unlock      
2   <- os_mutex_exit           
2  <- sync_array_exit           
2 <- sync_arr_wake_threads_if_sema_free 
...
  使用^C可以结束跟踪。单单是这些就可能够你折腾几个小时了。
  首先你会发现的是InnoDB非常“健谈”,即使数据库非常清闲时也是如此。这个看似恒定“sync_array_get_nth_cell()”函数流实际上是InnoDB检查点的结果。
  上述例子向我们展示了DTrace实时监视MySQL函数进出情况的能力。但是,要想发挥它的作用,我们还需要了解都有哪些东西进入了这些函数。我们需要看看某些特定的函数和它们的引数(argument)。我们谁都喜欢监视别人,对吧?如果我告诉你我不需要登录数据库也不需要查看任何日志文件就可以看到MySQL处理的每一个查询,你会怎么想呢?其实很简单,通过跟踪“dispatch_command()”的引数,你就可以做到了。
  如下是需要用到的脚本(query_watch.d):
#!/usr/sbin/dtrace -s
  
#pragma D option quiet
  
pid$target:mysqld:*dispatch_command*:entry
{
printf("Query: %s\n", copyinstr(arg2));
}
  同样,将该脚本保存到一个文本文件中并将它改为可执行文件,利用“-p PID”执行它,使用^C停止跟踪。
# query_watch.d -p `pgrep -x mysqld`
Query: show tables
Query: select * from Country LIMIT 10
Query: explain user
...
  既然我们可以实时查看所有进入MySQL dispatcher的查询,因此我们可以很轻易地看出查询的情况和趋势。不知道你注意到没有,每秒钟你的CRM都会执行几百个相同的查询。
  你可能意识到了我想暗示你的安全性问题,只有root用户(或Solaris中明确指定的特权用户)才能运行DTrace。如果你的本能反应是害怕DTrace系统中的MySQL,我们可以把DTrace这样用于Oracle、PostgreSQL、Mozilla或其它任何应用。DTrace可以看见所有的一切。如果你还不了解DTrace的威力,我希望你了解一下。
  下面,我们再深入地看看这个例子。重复的查询可能会导致严重的问题,通常会引发客户端存储缓慢或应用逻辑性差等问题。我们可以用DTrace计算一下所有重复的查询,并报告每个查询在特定时间段被执行过多少次。
  使用如下脚本(querycounts.d):
#!/usr/sbin/dtrace -s
  
#pragma D option quiet
  
dtrace:::BEGIN
{
    printf("Tracing... Hit Ctrl-C to end.\n");
}
  
pid$target::*dispatch_command*:entry
{
    @query[copyinstr(arg2)] = count();
}
  在运行该脚本时,它会开始收集数据,直到完成才会输出报告。合并计算函数count()将通过“dispatch_command”函数的arg2的结果赋给@query。
# querycounts.d -p `pgrep -x mysqld`
Tracing... Hit Ctrl-C to end.
  
^C
select * from CountryLanguage LIMIT 5  1
show tables     4
select * from City    10
  显然,这个例子的输出结果并不是真正的生产系统的结果。如果在生产中使用,你得到的结果会远远大于该输出结果。
  这里所讨论的例子仅仅是冰山一角。如果你结合一本好的MySQL internal参考书,很快你会发现你的理解方式是以前想都没想到过的。你能够将DTrace利用到生产代码中的各个部分。
  我希望这篇文章能帮助你稳步前进,一步一个脚印。你可以用它来学习,吸引你的同事,节约时间。最后,祝您跟踪愉快!
  特别感谢Derek Crudginton。
  关于作者:Ben Rockwood是云计算基础架构Joyent公司的系统经理。他是Solaris方面的专家,也是Sun推广者。

利用DTrace实时检测MySQl的更多相关文章

  1. mysql触发器实时检测一条语句进行备份删除

    问题描述:用户有一个这样一个需求,在一张表里会不时出现 "违规" 字样的字段,需要在出现这个字段的时候,把整行的数据删掉.这是个采集任务,如果发现有"违规"字样 ...

  2. MYSQL启用日志,查看日志,利用mysqlbinlog工具恢复MySQL数据库【转载】

    转自 MYSQL启用日志,查看日志,利用mysqlbinlog工具恢复MySQL数据库 - _安静 - 博客园http://www.cnblogs.com/xionghui/archive/2012/ ...

  3. opencv+python+dlib人脸关键点检测、实时检测

    安装的是anaconde3.python3.7.3,3.7环境安装dlib太麻烦, 在anaconde3中新建环境python3.6.8, 在3.6环境下安装dlib-19.6.1-cp36-cp36 ...

  4. 怎么实时查看mysql当前连接数

    如何实时查看mysql当前连接数? 如何实时查看mysql当前连接数? .查看当前所有连接的详细资料: ./mysqladmin -uadmin -p -h10. processlist .只查看当前 ...

  5. 蛙蛙推荐:如何实时监控MySql状态

    大多网站的性能瓶颈都会出在数据库上,所以想把Mysql监控起来,就搜索了下相关资料. 后来和同事讨论了下cacti和nagios有些老套和过时,graphite比较时尚,然后就搜了下相关的资料,最后搞 ...

  6. 实时监控MySql状态

    大多网站的性能瓶颈都会出在数据库上,所以想把Mysql监控起来,就搜索了下相关资料. 后来和同事讨论了下cacti和nagios有些老套和过时,graphite比较时尚,然后就搜了下相关的资料,最后搞 ...

  7. 使用Logstash来实时同步MySQL数据到ES

    上篇讲到了ES和Head插件的环境搭建和配置,也简单模拟了数据作测试 本篇我们来实战从MYSQL里直接同步数据 一.首先下载和你的ES对应的logstash版本,本篇我们使用的都是6.1.1 下载后使 ...

  8. 页面刷新方式实时检测cookie是否失效

    在浏览器端每隔10秒钟刷新一次页面,可用于检查cookie值是否失效. 在study.php文件中存在这样一条语句: <meta http-equiv="refresh" c ...

  9. [C++]Linux之网络实时检测功能

    声明:如需引用或者摘抄本博文源码或者其文章的,请在显著处注明,来源于本博文/作者,以示尊重劳动成果,助力开源精神.也欢迎大家一起探讨,交流,以共同进步,乃至成为朋友- 0.0 由于学习操作系统实验课程 ...

随机推荐

  1. 用vue-cli快速构建项目

    用vue-cli脚手架快速构建项目的过程:1.首先要在node的环境下安装: 1>安装node:https://nodejs.org/en/(带npm,但是npm太慢了,建议安装cnpm,cnp ...

  2. codeforce 杀题计划

    先尽量做Div 1 A B 想做难题时做C 全天学竞赛时每天至少两道Div2 (算法数据结构没学的先过,题面很长的......也先过  我的英语啊...)

  3. hadoop一主一从部署(1)

    一.安装前说明 主机IP:192.168.132.128 从机IP:192.168.132.129 1. 所有的安装包我放在了/root/这个目录下,你要根据自己情况去修改,这点必须注意 2. 采用的 ...

  4. day24 03 多继承

    day24 03 多继承 正常的代码中  单继承==减少了代码的重复 继承表达的是一种 子类是父类的关系 1.简单的多继承关系 A,B,C,D四个类,其中D类继承A,B,C三个父类,因此也叫多继承,子 ...

  5. mysql数据库存储的引擎和数据类型

    一.查看支持的存储引擎 SHOW ENGINES \G; 或者 SHOW VARIABLES LIKE 'have%'; 二.安装版mysql的默认引擎是InnoDB,免安装版默认引擎是MyISAM ...

  6. [转]linux之awk命令

    转自:http://blog.chinaunix.net/uid-23302288-id-3785105.html awk是行处理器: 相比较屏幕处理的优点,在处理庞大文件时不会出现内存溢出或是处理缓 ...

  7. android学习之路资料集合

    版权声明:本文为 stormzhang 原创文章,可以随意转载,但必须在明确位置注明出处!!! 这篇博客背后的故事 一路走来很不容易,刚好知乎上被人邀请回答如何自学android编程, 就借这个机会在 ...

  8. 关于 WebView 的一些笔记

    什么是 WebView WebView 是手机中内置了一款高性能 webkit 内核浏览器,在 SDK 中封装的一个组件.没有提供地址栏和导航栏, WebView 只是单纯的展示一个网页界面.在开发中 ...

  9. js indexOf 列表筛选

    先来一堆效果图:  代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> ...

  10. html base 又一重大发现

    base 一个曾经不记得的标签,虽然接触Javaweb这么久了,但是还有很多基础性的东西都被我忽略掉了,还有很多基础但实用的技巧应该没有被我发现,虽然不使用这些技巧对功能实现没有多大影响.但是,发现这 ...