我在我的一个程序上运行了ruby-profiler.我想弄清楚每个字段的含义.我猜测一切都是CPU时间(而不是挂钟时间),这太棒了.我想了解"---"代表什么.那里有某种堆栈信息.调用a/b是什么意思?
Thread ID: 81980260
Total Time: 0.28
%total %self total self wait child calls Name
--------------------------------------------------------------------------------
0.28 0.00 0.00 0.28 5/6 FrameParser#receive_data
100.00% 0.00% 0.28 0.00 0.00 0.28 6 FrameParser#read_frames
0.28 0.00 0.00 0.28 4/4 ChatServerClient#receive_frame
0.00 0.00 0.00 0.00 5/47 Fixnum#+
0.00 0.00 0.00 0.00 1/2 DebugServer#receive_frame
0.00 0.00 0.00 0.00 10/29 String#[]
0.00 0.00 0.00 0.00 10/21 <Class::Range>#allocate
0.00 0.00 0.00 0.00 10/71 String#index
--------------------------------------------------------------------------------
100.00% 0.00% 0.28 0.00 0.00 0.28 5 FrameParser#receive_data
0.28 0.00 0.00 0.28 5/6 …Run Code Online (Sandbox Code Playgroud) 除了ruby-prof和核心Benchmark类之外,你用什么来分析你的Ruby代码?特别是,您如何找到代码中的瓶颈?几乎感觉我需要使用我自己的小工具才能找出在我的代码中花费的所有时间.
我意识到ruby-prof提供了这个,但输出坦率地说非常混乱,并且不容易找出你自己的代码的哪些实际块是问题的根源(它告诉你哪些方法调用占用了最多的时间)虽然).因此,我并没有像我想的那样得到更多的东西,而且还没有真正能够利用它.
也许我做错了?还有替代品吗?谷歌搜索不会为我带来任何东西.
我在rake任务中调试内存泄漏.我想看一个调用堆栈:
红宝石教授可以吗?
如果没有,我应该使用什么工具?
宝石
耙任务
我试过这些模式
它在文档中说的全部是:
RubyProf :: ALLOCATIONS对象分配报告显示程序中每个方法分配的对象数.
RubyProf :: MEMORY内存使用情况报告显示程序中每个方法使用的内存量.
这意味着ruby-prof只报告对象的总分配,而不仅仅是生活对象的分配.
我尝试过Ruby-Mass和Bloat Check,但似乎都没能做到我想要的.Ruby-Mass也崩溃,因为它出于某种原因在内存中找到FactoryGirl对象......
我需要描述rake任务.因为我是菜鸟我只知道如何配置.rb代码如下:ruby -Ilib -S ruby-prof -p graph_html profile.rb > profile.html
但是,我如何描述特定的Rake任务?
我newrelic_rpm在rails 3.2应用程序中本地使用开发人员模式.这工作正常.
当我ruby-prof在newrelic本地仪表板中安装并单击"开始分析"并返回到我的应用程序时,我的应用程序中的每个页面都为#提供了"未定义的方法`pop".
追溯的前几行:
newrelic_rpm (3.6.4.122) lib/new_relic/agent/instrumentation/controller_instrumentation.rb:421:in `ensure in perform_action_with_newrelic_profile'
newrelic_rpm (3.6.4.122) lib/new_relic/agent/instrumentation/controller_instrumentation.rb:421:in `perform_action_with_newrelic_profile'
newrelic_rpm (3.6.4.122) lib/new_relic/agent/instrumentation/controller_instrumentation.rb:305:in `perform_action_with_newrelic_trace'
newrelic_rpm (3.6.4.122) lib/new_relic/agent/instrumentation/rails3/action_controller.rb:37:in `process_action'
actionpack (3.2.13) lib/abstract_controller/base.rb:121:in `process'
Run Code Online (Sandbox Code Playgroud)
任何想法如何解决出了什么问题?
我可以用什么来分析1.9.2中的代码?所有版本的ruby-prof我都发现了针对1.9.2的段错误.
例如,当我添加
gem "ruby-prof"
Run Code Online (Sandbox Code Playgroud)
到我的Rails项目的Gemfile并运行
bundle
bundle exec ruby-prof config/environment.rb
Run Code Online (Sandbox Code Playgroud)
我得到了一个段错误.
镇上有新的剖析宝石吗?有没有办法让ruby-prof玩得好听?
我正在创建一个Rails性能测试,如Rails指南中所述,我遇到了ruby-prof的问题.
我正在使用Ruby 1.9.2-p0(尽管在p320上遇到了同样的问题)和Rails 3.1.0.
我有一个非常简单的测试控制器,相当于这个例子.
根据指南,我需要先安装ruby-prof才能使用性能测试.果然,如果我在没有它的情况下运行我的性能测试,我得到:
在Gemfile中将ruby-prof指定为应用程序的依赖项以运行基准测试.
如果我按照指南的说明进行操作,我将其添加到我的Gemfile中:
gem'ruby-prof',:git =>'git://github.com/wycats/ruby-prof.git'
...从wycats存储库获取版本0.11.0.当我运行我的测试时,我收到此错误:
/Users/craig/.rvm/gems/ruby-1.9.2-p0/bundler/gems/ruby-prof-ffae61a89553/lib/ruby-prof/abstract_printer.rb:44:in `inspect': undefined method `to_s' for #<Class:0x000001025a3f18> (NoMethodError)
from /Users/craig/.rvm/gems/ruby-1.9.2-p0/bundler/gems/ruby-prof-ffae61a89553/lib/ruby-prof/abstract_printer.rb:44:in `full_name'
...
Run Code Online (Sandbox Code Playgroud)
但是"wycats"似乎并不是ruby-prof的规范Github回购.该文档涉及rdp(Roger Pack).如果我改用这个回购:
gem'ruby-prof',:git =>'git://github.com/rdp/ruby-prof.git'
...我得到版本0.11.2,并得到此错误:
/Users/craig/.rvm/gems/ruby-1.9.2-p0/gems/activesupport-3.1.0/lib/active_support/testing/performance/ruby.rb:39:in
run': undefined methodvalues for [#]:Array(来自/Users/craig/.rvm/gems/ruby-1.9.2-p0/gems/activesupport-3.1.0/lib/active_support/testing/performance.rb:140:in"run_profile"的NoMethodError ...
如果我直接使用来自rubygems的gem(同样,版本0.11.2),我会得到相同的错误:
宝石'红宝石'教授'
任何想法出了什么问题,或者如何解决它?
我是Ruby分析的新手,它似乎ruby-prof是一个受欢迎的选择.我刚刚安装了gem并调用了我的程序:
ruby-prof ./my-prog.rb
Run Code Online (Sandbox Code Playgroud)
但是,输出非常冗长,因为包含了所有Ruby核心和标准库方法以及其他gem的数据分析.例如,前三行是:
8.79 0.011 0.010 0.000 0.001 3343 *String#%
7.28 0.078 0.009 0.000 0.069 2068 *Array#each
4.93 0.038 0.006 0.000 0.032 1098 *Array#map
Run Code Online (Sandbox Code Playgroud)
这对我来说并不是一个非常有用的信息,因为我已经知道我的程序经常处理字符串和数组,并且可能这些类已经对它们进行了优化.我只关心热点我的代码.
我尝试了一些其他的打印机模式,例如-p graph_html和-p call_stack,但他们都有同样的问题.
我看到它ruby-prof支持一些方法消除和简化:
-x, --exclude regexp exclude methods by regexp (see method elimination)
-X, --exclude-file file exclude methods by regexp listed in file (see method elimination)
--exclude-common-cycles make common iterators like Integer#times appear inlined
--exclude-common-callbacks make common callbacks invocations like Integer#times appear
Run Code Online (Sandbox Code Playgroud)
但似乎没有要任何明显的方式得到我真正想要的,这是我的代码分析数据 …
我用ruby-prof描述了我的基于事件机器的应用程序,发现了以下有趣内容:
5.28 0.00 5.28 0.00 4/4 Mutex#synchronize
90.72% 0.00% 5.28 0.00 5.28 0.00 4 Mutex#sleep
我认为ruby-prof只计算CPU滴答,因此我无法弄清楚为什么互斥锁睡眠会占用CPU时间.我假设它在内核级别上休眠而不计算光纤时间.有任何想法吗?更好的是,我希望Mutex#sleep能够释放对事件机器的控制权,因此它可以做其他事情.
我使用 Jekyll 来构建我的网站,并且开始需要相当长的时间(几分钟)来编译该网站(超过 600 个帖子)。我怀疑某些插件可能对此负责,但似乎必须有一种更好的方法来分析构建的性能,而不是简单地打开和关闭不同的插件和解析器。
构建过程中的最小输出没有给出任何提示——所有时间都简单地花费在“构建站点”步骤中。我认为我可以运行 jekyll 脚本来ruby-prof获得一些想法,所以我jekyll.rb在我的站点根目录中制作了 jekyll 脚本的快速本地副本,然后运行
ruby-prof jekyll.rb
Run Code Online (Sandbox Code Playgroud)
该网站看起来构建得很好,但分析器却因丑陋的核心转储而窒息。
[NOTE]
You may have encountered a bug in the Ruby interpreter or extension libraries.
Bug reports are welcome.
For details: http://www.ruby-lang.org/bugreport.html
Aborted (core dumped)
Run Code Online (Sandbox Code Playgroud)
是否有更智能的方法来分析我的网站的构建过程并找出它如此缓慢的原因?
其次,有什么技巧可以加快编译时间吗?_cache(例如,我看到中存在一个目录_plugins,但不确切知道它的作用。我还看到--autoJekyll 的标志,但不知道如何配置它,以便它始终重新编译某些页面,无论是他们没有改变(例如,twitter 插件每次都需要重新运行),而不重新编译未更改的帖子)。
如果有人想亲自研究一下,该网站的 Jekyll 源代码位于 Github 上,自述文件中有一些关于其他 gem 依赖项的注释。
好像我总是在我的一个脚本上出现这个错误:
/Users/amosng/.rvm/gems/ruby-1.9.3-p194/gems/ruby-prof-0.11.2/lib/ruby-prof/profile.rb:25: stack level too deep (SystemStackError)
Run Code Online (Sandbox Code Playgroud)
有没有人遇到此错误?可能导致它的原因,以及我可以采取哪些措施来防止它发生?
我使用命令运行我的ruby-prof脚本
ruby-prof --printer=graph --file=profile.txt scraper.rb -- "fall 2012"
Run Code Online (Sandbox Code Playgroud)
编辑我在Mac OS X上,如果这很重要.ulimit -s 64000不幸的是,做起来似乎没什么帮助.这是ulimit -a给出的:
$ ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
file size (blocks, -f) unlimited
max locked memory (kbytes, -l) unlimited
max memory size (kbytes, -m) unlimited
open files (-n) 256
pipe size (512 bytes, -p) 1
stack size (kbytes, -s) 64000
cpu time (seconds, -t) unlimited
max …Run Code Online (Sandbox Code Playgroud) 我有一个Ruby程序,大约需要4分钟才能完成任务,我想把它降到1分钟以下.
我尝试了宝石中的ruby-prof,但是它使运行时间增加到约30分钟,甚至看起来都没有特别好地保持单调性(一些变化可靠地提高了性能 - 使用剖析器并且可靠地降低了性能 - 没有剖析器).此任务也无法真正分解为可以独立进行有意义分析的部分.
目前以最低开销分析Ruby代码的最佳方法是什么?
我使用OSX,但如果由于任何原因,探测器需要另一个操作系统,我可能会重新启动.
编辑:perftools.rb具有更低的开销,但结果看起来相当可疑诚实,超出任何合理的抽样错误 - 至少它必须搞乱GC或i/o缓冲或类似的东西,导致很多愚蠢的错误归因.它仍然击败了ruby-prof.
我会保持问题公开,万一有人知道比这更好的事情.
ruby-prof ×12
ruby ×9
profiling ×5
profiler ×2
eventmachine ×1
jekyll ×1
memory ×1
memory-leaks ×1
mutex ×1
newrelic ×1
performance ×1
profile ×1
rake ×1
task ×1