http://googya.github.io/blog/categories/dtrace/

最近看了点关于Dtrace的东西,它是个通用型的工具,但我主要集中于分析ruby程序的执行上面。关于操作系统的性能分析,比如cpu、内存、io、文件系统等,使用起来貌似挺复杂,木有细看。

这里简单的输出一条命令:

sudo dtrace -n 'ruby$target:::object-create {@objects[copyinstr(arg0)]=count();}' -c 'ruby -e "puts :hello"'

输出的结果是:

    dtrace: description 'ruby$target:::object-create ' matched 1 probe
-e:1: unterminated string meets end of file
dtrace: pid 15203 has exited #<Class:0x007fabf38e0700> 1
ARGF.class 1
IOError 1
Mutex 1
NoMemoryError 1
SyntaxError 1
SystemStackError 1
ThreadGroup 1
Time 1
LoadError 2
Object 2
Gem::Specification 8
Gem::Version 10
Hash 11
Gem::Requirement 23
Array 96
String 260

ruby2.0已经有支持probe了,所以可以使用dtrace

2.0之前的如果要使用dtrace的话,要使用 ruby-dtrace这个gem

另外在学习的时候,写了dtrace的脚本,其实就是D语言了, rb_flowinfo.d,查看ruby方法的调用过程:

    #!/usr/sbin/dtrace -Zs
#pragma D option quiet
#pragma D option switchrate=10 self int depth; dtrace:::BEGIN
{
printf("%s %6s %10s %16s:%-4s %-8s -- %s\n", "C", "PID", "DELTA(us)", "FILE", "LINE", "TYPE", "NAME");
} ruby*:::method-entry,
ruby*:::method-return
/self->last == 0/
{
self->last = timestamp;
} ruby*:::method-entry
/copyinstr(arg0) == "Object"/
{
this->delta = (timestamp - self->last) / 1000;
this->name = strjoin(strjoin(copyinstr(arg0), "::"), copyinstr(arg1));
printf("%d %6d %10d %16s:%-4d %-8s %*s-> %s\n", cpu, pid, this->delta,
basename(copyinstr(arg2)), arg3, "method", self->depth * 2, "", this->name); self->depth++;
self->last = timestamp;
} ruby*:::method-return
/copyinstr(arg0) == "Object"/
{
this->delta = (timestamp - self->last) / 1000;
self->depth -= self->depth > 0 ? 1 : 0;
this->name = strjoin(strjoin(copyinstr(arg0), "::"), copyinstr(arg1));
printf("%d %6d %10d %16s:%-4d %-8s %*s<- %s\n", cpu, pid, this->delta,
basename(copyinstr(arg2)), arg3, "method", self->depth * 2, "", this->name);
self->last = timestamp;
}

用于测试的ruby脚本, trace_method_call.rb

    dtrace_ruby $ cat trace_method_call.rb
#!/Users/wenleslie/.rvm/rubies/ruby-2.0.0-p0/bin/ruby
def func_c
puts "Function C"
sleep 1
end def func_b
puts "Function B"
sleep 6
func_c
end def func_a
puts "Function A"
func_b
end func_a

执行:

    sudo ./rb_flowinfo.d -c ./trace_method_call.rb

结果如下:

C    PID  DELTA(us)             FILE:LINE TYPE     -- NAME
Function A
Function B
4 15702 35986 trace_method_call.rb:13 method -> Object::func_a
4 15702 55 trace_method_call.rb:7 method -> Object::func_b
Function C0 15702 6001065 trace_method_call.rb:2 method -> Object::func_c 6 15702 1000922 trace_method_call.rb:5 method <- Object::func_c
6 15702 27 trace_method_call.rb:11 method <- Object::func_b
6 15702 19 trace_method_call.rb:16 method <- Object::func_a
^C

我的evernote上关于dtrace笔记有稍微详细一点的内容,有兴趣的话,可以看看

How to Use Dtrace Tracing Ruby Executing的更多相关文章

  1. dtrace 语法

    Usage: dtrace [-aACeFHlqSvVwZ] [-arch i386|x86_64] [-b bufsz] [-c cmd] [-D name[=def]]      [-I path ...

  2. Linux Perf Probes for Oracle Tracing

    Luca Canali on 21 Jan 2016 Topic: this post is about Linux perf and uprobes for tracing and profilin ...

  3. 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 ...

  4. [转]Top 10 DTrace scripts for Mac OS X

    org link: http://dtrace.org/blogs/brendan/2011/10/10/top-10-dtrace-scripts-for-mac-os-x/ Top 10 DTra ...

  5. End-to-End Tracing of Ajax/Java Applications Using DTrace

    End-to-End Tracing of Ajax/Java Applications Using DTrace         By Amit Hurvitz, July 2007     Aja ...

  6. Tracing mysqld Using DTrace

    http://dev.mysql.com/doc/refman/5.6/en/dba-dtrace-server.html MySQL 5.6 Reference Manual -> 5 MyS ...

  7. Using Dtrace OEL 6.X and Oracle® Solaris 11.3 DTrace (Dynamic Tracing) Guide

    http://www.hhutzler.de/blog/using-dtrace/ https://docs.oracle.com/cd/E53394_01/html/E53395/gkyaz.htm ...

  8. [转]Breaking Bad With DTrace

    Source:http://initwithfunk.com/blog/2013/05/31/breaking-bad-with-dtrace/ I’ve spent an unwise amount ...

  9. Life of an Oracle I/O: tracing logical and physical I/O with systemtap

    https://db-blog.web.cern.ch/blog/luca-canali/2014-12-life-oracle-io-tracing-logical-and-physical-io- ...

随机推荐

  1. try_except__异常处理

    try...except.raise 一.try...except 有时候我们写程序的时候,会出现一些错误或异常,导致程序终止.例如,做除法时,除数为0,会引起一个ZeroDivisionError ...

  2. OpenSSL version mismatch. Built against 1000105f, you have 10001060

    http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=732940 http://ftp.debian.org/debian/pool/main/o/ope ...

  3. LAMP动态网站安装脚本

    #!/bin/bash #auto make install LAMP #by authors zhangjianghua #httpd define path variable H_FILES=ht ...

  4. meteor 检测运行环境,手机或者桌面

    meteor add mystor:device-detection Meteor.Device.isPhone() https://atmospherejs.com/mystor/device-de ...

  5. 引用&符号详解

    变量的引用 PHP 的引用允许你用两个变量来指向同一个内容. 例一: <?php $a="2010"; $b =&$a; echo $a;//这里输出:2010 ec ...

  6. CodeForces 500E New Year Domino

    题意: 从左到右排列着\(n\)个多米诺骨牌,它们分别站在\(x\)轴上的位置\(p_i\)上且高度为\(l_i\). 当第\(i\)个多米诺骨牌向右倒下时,如果\(p_i < p_j \leq ...

  7. 转:获取GridView中RowCommand的当前索引行

    获取GridView中RowCommand的当前索引行 前台添加一模版列,里面添加一个LinkButton 前台 (如果在后台代码中用e.CommandArgument取值的话前台代码就必须在按钮中设 ...

  8. Flask_单例模式

    在flask实现单例模式的方法有多种: 这里我们列举五种,行吗? 第一种: 国际惯例:基于文件导入 第二种: 基于类的单例模式: 它又分两种: 一种加锁,一种不加锁. 不加锁的话,可以并发,但是我们的 ...

  9. js适配根字体大小

    方法一:<script>                (function (doc, win) {                var docEl = doc.documentElem ...

  10. [python IO学习篇] 补充中文编码

    http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001386820066616a7 ...