Ruby Profiler 详解之 stackprof
简介
stackprof 是基于采样的一个调优工具,采样有什么好处呢?好处就是你可以线上使用,按照内置的算法抓取一部分数据,只影响一小部分性能。它会产生一系列的 dump 文件,然后你在线下分析这些文件,从而定位出问题,google 有一篇基于采样的论文,也基本证明了采样是可行的。而 stackprof 也是深受 google 的 perftools 的影响,采用了采样的方式来做调优。
基本使用方法
StackProf.run(mode: :cpu, out: './stackprof.dump') do
# 你的代码
end
这里我们给出一段示例代码,来作为测试目标:
require "stackprof"
class Compute
def m1
"string" * 100
end
def m2
"string" * 10000
end
def start
100_000.times do
m1
m2
end
end
end
StackProf.run(mode: :cpu, out: './stackprof.dump') do
Compute.new.start
end
保存为test.rb,同时执行 ruby test.rb 就会在当前目录下生成 stackprof.dump 文件,我们用 stackprof 打开这个文件:
stackprof stackprof.dump --text
==================================
Mode: cpu(1000)
Samples: 1793 (0.61% miss rate)
GC: 587 (32.74%)
==================================
TOTAL (pct) SAMPLES (pct) FRAME
1106 (61.7%) 1106 (61.7%) Compute#m2
98 (5.5%) 98 (5.5%) Compute#m1
1206 (67.3%) 2 (0.1%) block in Compute#start
1206 (67.3%) 0 (0.0%) <main>
1206 (67.3%) 0 (0.0%) Compute#start
1206 (67.3%) 0 (0.0%) <main>
1206 (67.3%) 0 (0.0%) block in <main>
这里可以很明显的看出是 m2 方法比较慢,占据了大部分的执行时间,相比其他的调优工具,它只是列出了用户自己的方法所占时间比,在 ruby-prof 中的测试中,它是会显示String#*这个方法的占比的,但是对于我们来说,它的意义不大,而 stackprof 是不会理会标准库里的方法的。同时 stackprof 也是可以过滤方法的,比如我们发现了 m2 这个方法有问题,那么就可以把它过滤出来,看看细节:
stackprof stackprof.dump --text --method 'Compute#m2'
Compute#m2 (/Users/lizhe/Workspace/ruby-performance-tuning/test.rb:9)
samples: 1106 self (61.7%) / 1106 total (61.7%)
callers:
1106 ( 100.0%) block in Compute#start
code:
| 9 | end
1106 (61.7%) / 1106 (61.7%) | 10 |
| 11 | def start
我们可以看到 m2 这个方法定义在哪一个文件的哪一行,同时是谁调用了它,以及还显示了它在源码中的上下文。假如有多个方法调用了 m2 ,还会显示出这几个方法,以及他们调用 m2 所占的比例,也就是上面的 callers 部分,因为只有一个 start 方法调用了 m2,所以它是 100% 。
在rack中的使用方法
stackprof 本身实现了一个 rack middleware ,所以可以很方便的挂载到一个 rack 应用中:
use StackProf::Middleware, enabled: true, mode: :cpu, save_every: 5
在 rails 中使用,先在 Gemfile 中添加 stackprof ,然后添加 middleware :
config.middleware.use StackProf::Middleware, enabled: true, mode: :cpu, save_every: 5
然后请求你的应用,多请求几次,每5秒钟它会保存一次输出结果到tmp目录中,查看其中某一个结果:
==================================
Mode: cpu(1000)
Samples: 155 (0.00% miss rate)
GC: 11 (7.10%)
==================================
TOTAL (pct) SAMPLES (pct) FRAME
18 (11.6%) 18 (11.6%) Hike::Index#entries
12 (7.7%) 12 (7.7%) Hike::Index#stat
9 (5.8%) 9 (5.8%) #<Module:0x007fb72a0c7b08>.load_with_autoloading
18 (11.6%) 9 (5.8%) Sprockets::Cache::FileStore#[]
6 (3.9%) 6 (3.9%) block (2 levels) in BindingOfCaller::BindingExtensions#callers
5 (3.2%) 5 (3.2%) Time.parse
5 (3.2%) 5 (3.2%) Sprockets::Mime#mime_types
5 (3.2%) 5 (3.2%) Pathname#chop_basename
4 (2.6%) 4 (2.6%) block in ActionView::PathResolver#find_template_paths
4 (2.6%) 4 (2.6%) block in BetterErrors::ExceptionExtension#set_backtrace
15 (9.7%) 3 (1.9%) block in ActiveSupport::Dependencies#load_file
2 (1.3%) 2 (1.3%) Temple::Mixins::CompiledDispatcher::DispatchNode#initialize
5 (3.2%) 2 (1.3%) ActionDispatch::Cookies::EncryptedCookieJar#initialize
2 (1.3%) 2 (1.3%) ActiveSupport::KeyGenerator#generate_key
2 (1.3%) 2 (1.3%) block in ActionView::PathResolver#query
4 (2.6%) 2 (1.3%) Slim::Parser#initialize
113 (72.9%) 2 (1.3%) ActionView::Renderer#render_template
2 (1.3%) 2 (1.3%) Hike::Trail#stat
2 (1.3%) 2 (1.3%) block in ActiveSupport::Dependencies#search_for_file
22 (14.2%) 2 (1.3%) block in Temple::Filters::MultiFlattener#on_multi
20 (12.9%) 2 (1.3%) Temple::Filters::ControlFlow#dispatcher
15 (9.7%) 2 (1.3%) ActionView::Renderer#render_partial
1 (0.6%) 1 (0.6%) block in Slim::Parser#initialize
1 (0.6%) 1 (0.6%) Pathname#prepend_prefix
1 (0.6%) 1 (0.6%) String#blank?
1 (0.6%) 1 (0.6%) ActiveSupport::SafeBuffer#initialize
10 (6.5%) 1 (0.6%) Sprockets::Asset#dependency_fresh?
1 (0.6%) 1 (0.6%) Sprockets::Asset#init_with
1 (0.6%) 1 (0.6%) Hike::Index#sort_matches
1 (0.6%) 1 (0.6%) block in ActiveSupport::Dependencies::Loadable#require
可以利用这样的方式调试线上的环境。
参考链接
本文系 OneAPM 工程师李哲原创文章。想阅读更多技术文章,请访问 OneAPM 官方技术博客。
Ruby Profiler 详解之 stackprof的更多相关文章
- Ruby Profiler 详解之 ruby-prof(I)
项目地址: ruby-prof 在上一篇 Ruby 中的 Profiling 工具中,我们列举了几种最常用的 Profiler,不过只是简单介绍,这一次详细介绍一下 ruby-prof 的使用方法. ...
- [置顶] ruby变量详解(收集+整理)
ruby的变量有局部变量,全局变量,实例变量,类变量,常量. 1.局部变量 局部变量以一个小写字母开头或下划线开头 局部变量有局部作用域限制(比如一个block内),它的作用域起始于声明处,结束于该声 ...
- Ruby Gem命令详解
转自:http://www.jianshu.com/p/728184da1699 Gem介绍: Gem是一个管理Ruby库和程序的标准包,它通过Ruby Gem(如 http://rubygems.o ...
- Code First开发系列之管理数据库创建,填充种子数据以及LINQ操作详解
返回<8天掌握EF的Code First开发>总目录 本篇目录 管理数据库创建 管理数据库连接 管理数据库初始化 填充种子数据 LINQ to Entities详解 什么是LINQ to ...
- Console命令详解,让调试js代码变得更简单
Firebug是网页开发的利器,能够极大地提升工作效率. 但是,它不太容易上手.我曾经翻译过一篇<Firebug入门指南>,介绍了一些基本用法.今天,继续介绍它的高级用法. ======= ...
- 8天掌握EF的Code First开发系列之3 管理数据库创建,填充种子数据以及LINQ操作详解
本文出自8天掌握EF的Code First开发系列,经过自己的实践整理出来. 本篇目录 管理数据库创建 管理数据库连接 管理数据库初始化 填充种子数据 LINQ to Entities详解 什么是LI ...
- GitHub详解(GitHub for Windows)
GitHub详解 GitHub 是一个共享虚拟主机服务,用于存放使用Git版本控制的软件代码和内容项目.它由GitHub公司(曾称Logical Awesome)的开发者Chris Wanstrath ...
- OutputCache属性详解(四)— SqlDependency
目录 OutputCache概念学习 OutputCache属性详解(一) OutputCache属性详解(二) OutputCache属性详解(三) OutputCache属性详解(四)— SqlD ...
- [logstash-input-http] 插件使用详解
插件介绍 Http插件是2.0版本才出现的新插件,1.x是没有这个插件的.这个插件可以帮助logstash接收其他主机或者本机发送的http报文. 插件的原理很简单,它自己启动了一个ruby的服务器, ...
随机推荐
- 推荐一个sqlce,sqllite等数据库管理工具
推荐一个sqlce,sqllite等数据库管理工具 下载地址: http://fishcodelib.com/files/DatabaseNet4.zip 支持sqlserver,sqlce, sql ...
- hdu 4631Sad Love Story<计算几何>
链接:http://acm.hdu.edu.cn/showproblem.php?pid=4631 题意:依次给你n个点,每次求出当前点中的最近点对,输出所有最近点对的和: 思路:按照x排序,然后用s ...
- [原创]PostgreSQL Plus Advanced Server监控工具PEM(四)
四.PEM管理工具 1.编辑配置 选择进行管理的目标服务器,点击菜单Tools->Server Configuration->postgresql.conf管理服务器配置,可以看到我们经常 ...
- Knockout.Js学习目录
1.Knockout.Js(简介) 2.Knockout.Js(监控属性Observables) 3.Knockout.Js(属性绑定) 4.Knockout.Js(事件绑定) 5.Knockout. ...
- mysql substring_index
select * from tablename where substring_index(field1,'_',-1)=‘abc' #表中field1的值结构为123_abc
- CentOs环境下PHP支持PDO_MYSQL
一.下载相应tgz包: http://pecl.php.net/get/PDO_MYSQL-1.0.2.tgz二.安装开始 解压# tar zxvf PDO_MYSQL-1.0.2.tgz # cd ...
- verilog语法之memory存储器
命名规则:reg[n-1:0] 存储器名[m-1:0] 说明:这是m个n位的存储器,该存储器的地址范围是0-(m-1) 举例:reg[3:0] memo[255:0] 说明:这是256个4位存储器,该 ...
- 2.2孙鑫C++
1.继承 动物有 吃 睡 呼吸的方法 当然 鱼也有 不用重复再定义 1)public 那里都可以访问 #include <iostream.h> class Animal //类 基 ...
- Log4Net学习【二】
Log4Net结构详解 当我们在描述为系统做日志这个动作的时候,实际上描述了3个点:做日志,其实就是在规定,在什么地方 用什么日志记录器 以什么样的格式做日志.把三个最重要的点抽取出来,即什么地方,日 ...
- MVC中使用SignalR打造酷炫实用的即时通讯功能附源码
前言,现在这世道写篇帖子没个前言真不好意思发出来.本贴的主要内容来自于本人在之前项目中所开发的一个小功能,用于OA中的即时通讯.由于当时走的太急,忘记把代码拿出来.想想这已经是大半年前的事情了,时间过 ...