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. ubuntu gcc的下载链接,比较快的。

    http://mirrors.163.com/ubuntu-releases/ http://xhmikosr.1f0.de/tools/msys/

  2. Java获得字节码对象的三种方式

    1.Class 类的forName方法 Class clazz = Class.forName("com.test.Test"); 该方法要注意的是会抛出一个ClassNotFou ...

  3. 手撸一套纯粹的CQRS实现

    关于CQRS,在实现上有很多差异,这是因为CQRS本身很简单,但是它犹如潘多拉魔盒的钥匙,有了它,读写分离.事件溯源.消息传递.最终一致性等都被引入了框架,从而导致CQRS背负了太多的混淆.本文旨在提 ...

  4. luogu2053 [SCOI2007]修车

    把m个师傅拆成n个阶段,考虑每个人选上第某个阶段的某师傅对答案做出的贡献. 参见这里与那里. #include <iostream> #include <cstring> #i ...

  5. python - 字符串的内建函数

    # -*- coding:utf-8 -*- '''@project: jiaxy@author: Jimmy@file: study_3_str_内建函数.py@ide: PyCharm Commu ...

  6. 初学-BeautifulSoup爬取豆瓣页面

    # -*- coding: utf-8 -*-import osimport urllibimport urllib2from bs4 import BeautifulSoup headers = { ...

  7. postgres 用户管理

    首次安装完成 pg 数据库后,会默认自带一个用户, 用户名: postgres 密码: postgres 可以使用命令 \du 查看数据库用户 创建新用户: create user dev with ...

  8. 代码托管在阿里云并用git拉取

    1.在阿里云上注册一个账号,https://code.aliyun.com/ 2.创建组 3.添加组员权限 4.添加项目 5.复制项目地址 安装git   https://git-scm.com/   ...

  9. jsonp跨域请求发布出去

    最近在做运动城项目,这一个项目下面有多个子项目,如主数据项目,pos项目等.主数据项目的域名为www.topmall.com,POS项目的域名为pos.topmall.com.即两个项目的主域名相同, ...

  10. 一句话学Java——Java重载和重写

    概念:重载是指两个不同的函数有相同的名称,可以是在本类之中的函数之间的重载,也可以是子类和父类的函数之间的函数重载. 重写:只能是子类重写父类的函数.这是多态的基础. 重写的规则:     参数:重写 ...