How to Use Dtrace Tracing Ruby Executing
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的更多相关文章
- dtrace 语法
Usage: dtrace [-aACeFHlqSvVwZ] [-arch i386|x86_64] [-b bufsz] [-c cmd] [-D name[=def]] [-I path ...
- 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 ...
- 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 ...
- [转]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 ...
- 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 ...
- Tracing mysqld Using DTrace
http://dev.mysql.com/doc/refman/5.6/en/dba-dtrace-server.html MySQL 5.6 Reference Manual -> 5 MyS ...
- 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 ...
- [转]Breaking Bad With DTrace
Source:http://initwithfunk.com/blog/2013/05/31/breaking-bad-with-dtrace/ I’ve spent an unwise amount ...
- 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- ...
随机推荐
- ubuntu gcc的下载链接,比较快的。
http://mirrors.163.com/ubuntu-releases/ http://xhmikosr.1f0.de/tools/msys/
- Java获得字节码对象的三种方式
1.Class 类的forName方法 Class clazz = Class.forName("com.test.Test"); 该方法要注意的是会抛出一个ClassNotFou ...
- 手撸一套纯粹的CQRS实现
关于CQRS,在实现上有很多差异,这是因为CQRS本身很简单,但是它犹如潘多拉魔盒的钥匙,有了它,读写分离.事件溯源.消息传递.最终一致性等都被引入了框架,从而导致CQRS背负了太多的混淆.本文旨在提 ...
- luogu2053 [SCOI2007]修车
把m个师傅拆成n个阶段,考虑每个人选上第某个阶段的某师傅对答案做出的贡献. 参见这里与那里. #include <iostream> #include <cstring> #i ...
- python - 字符串的内建函数
# -*- coding:utf-8 -*- '''@project: jiaxy@author: Jimmy@file: study_3_str_内建函数.py@ide: PyCharm Commu ...
- 初学-BeautifulSoup爬取豆瓣页面
# -*- coding: utf-8 -*-import osimport urllibimport urllib2from bs4 import BeautifulSoup headers = { ...
- postgres 用户管理
首次安装完成 pg 数据库后,会默认自带一个用户, 用户名: postgres 密码: postgres 可以使用命令 \du 查看数据库用户 创建新用户: create user dev with ...
- 代码托管在阿里云并用git拉取
1.在阿里云上注册一个账号,https://code.aliyun.com/ 2.创建组 3.添加组员权限 4.添加项目 5.复制项目地址 安装git https://git-scm.com/ ...
- jsonp跨域请求发布出去
最近在做运动城项目,这一个项目下面有多个子项目,如主数据项目,pos项目等.主数据项目的域名为www.topmall.com,POS项目的域名为pos.topmall.com.即两个项目的主域名相同, ...
- 一句话学Java——Java重载和重写
概念:重载是指两个不同的函数有相同的名称,可以是在本类之中的函数之间的重载,也可以是子类和父类的函数之间的函数重载. 重写:只能是子类重写父类的函数.这是多态的基础. 重写的规则: 参数:重写 ...