跟踪正在运行的ruby进程

时间:2009-10-13 17:40:16

标签: ruby profiling tracing

我正在运行一个ruby代码,它有大量的http(web和api)请求,以及一些相当密集的数据处理。正如您所料,它很慢,我想找出主要瓶颈的位置。我认为我还不需要一个完整的分析器(但是),但是想要在运行过程中跟踪进程的某种方式(不需要在整个文件中写入puts语句)

我想这会是非常普遍的想法,有关如何实现这一点的想法,也许是这样做的宝石/插件?

4 个答案:

答案 0 :(得分:3)

您可以尝试Hijack,它会为您提供现有ruby进程的irb会话。在上下文中,您可以对可疑请求进行基准测试,例如:

require 'benchmark'
puts Benchmark.measure { the_slow_Http_Request }

Joe Damato的ltrace hack看起来也很不错,但我自己没试过。

答案 1 :(得分:1)

基准测试!

我发现一些好的基准调用通常可以很快缩小问题的范围 - 剖析器很好但是一个简单的自己动手解决方案通常运行良好。

对我来说,使用这种方法的一个主要好处是找到了批处理数据库插入的差异。

事实上,我已经在几个程序中保留了基准,只是为了不断检查性能是否在可接受的范围内

答案 2 :(得分:1)

你可以在调试器下运行它并在它缓慢时手动暂停吗?如果你多次这样做,你会发现最大的瓶颈是什么。

例如,如果它正在等待web或api请求,那么它将位于堆栈的顶部。然后查看堆栈下一级代码,这是一个函数调用。 I / O请求正在中完成,因为该函数调用的。然后看下一行 - 同样的事情。

如果它是进行I / O,就像是计算一样,也是如此。 调用堆栈中的每一行代码都对所使用的那段时间负全部责任。

所以,如果你暂停几次,那么在多次暂停时出现在调用堆栈上的任何代码行都会告诉你它是一个瓶颈,如果你有任何方法可以删除它或者不经常执行它

Here's a more complete explanation.

答案 3 :(得分:0)

https://rbspy.github.io非常令人印象深刻,而且很容易使用。只需将它发送给你的pid就可以获得分析和漂亮的火焰图。