【问题标题】:How to configure memprof in a Rails 3 application?如何在 Rails 3 应用程序中配置 memprof?
【发布时间】:2012-05-11 08:00:15
【问题描述】:

(首先我的英语说得不太好,希望你能原谅我的错误:S)

我是 Ruby 和 Rails 的新手,我非常困惑和沮丧,因为我的应用程序在生产模式下运行时出现内存泄漏。

我的服务器正在关闭我的应用程序,因为它达到了 800MB 的内存:O 我在谷歌上搜索过它,我发现一种解决方案是使用一种工具来查找泄漏:Bleackhouse(我还没有设法安装应用程序)或 memprof (安装没问题)。

我使用以下方式安装 memprof:

$ gem install memprof

安装后,我可以将它与“irb”一起使用并对其进行测试,但我无法让它与我的 Rails 3 应用程序一起运行,我知道这是因为我对 Rails 非常陌生 :(

我已经阅读了太多关于 memprof 的网站、教程和幻灯片,但我找不到任何参考资料来解释如何在 Rails 中安装它。

我将这些行添加到我的 config/environment.rb

require `gem which memprof/signal`.strip

config/environment.rb:

# -*- encoding : utf-8 -*-

require `gem which memprof/signal`.strip

# Load the rails application
require File.expand_path('../application', __FILE__)

# Initialize the rails application
NameApp::Application.initialize!

但是当我运行我的应用程序(Apache + Phusion Passenger)时,它会抛出一个错误:

"Ruby (Rack) application could not be started"

A source file that the application requires, is missing.
It is possible that you didn't upload your application files correctly. Please check whether all your application files are uploaded.
A required library may not installed. Please install all libraries that this application requires.

Error message:
no such file to load --

/path/to/my/app/config/environment.rb   3   in `require'
...

我真的不知道为什么我可以在 irb 中运行 memprof,但我不能在我的 Rails 应用程序中使用它。


编辑 1:

我按照 Frederick Cheung 的建议做了,现在我让它运行了,但我不知道如何启动它并将数据写入 json 文件:S

如果有人能帮助我解决这个问题,我将不胜感激。

谢谢。

【问题讨论】:

  • 为什么要以这种有趣的方式要求它而不是将其添加到您的 Gemfile 中?
  • 您说我必须将“gem 'memprof'”添加到我的 Gemfile 中,然后执行“$ bundle install”?我必须在我的 config/environment.rb 中添加 require gem which memprof/signal.strip 吗?谢谢。
  • 我不会。如果你想要信号的东西,一个普通的 require 'memprof/signal' 就可以了(可能在初始化程序的某个地方)
  • 请你写一些例子,我不知道放在哪里:(谢谢
  • Stick require 'memprof/signal' in config/initializers/memprof.rb

标签: ruby-on-rails ruby-on-rails-3 memory-leaks memprof


【解决方案1】:

使用信号的东西,你只需要发送一个 URG 信号(kill -s URG pid),它就会写入 /tmp 中的一个文件

你也可以使用 memprof 包含的中间件(see the documentation

有两个中间件,允许您使用Memprof.trackMemprof.trace_request 包装每个请求。您可以通过将其放入初始化程序(在 config/initializers 中)来打开它们

require 'memprof/middleware'
config.middlewares.use(Memprof::Middleware)

require 'memprof/tracer'
config.middleware.insert(0, Memprof::Tracer)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-03
    • 1970-01-01
    • 2016-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-14
    相关资源
    最近更新 更多