错误500导致中间件中的内存膨胀/泄漏

时间:2018-01-09 08:20:44

标签: ruby-on-rails heroku memory-leaks exception-notification

我最近发现当我在Rails应用程序中遇到错误代码500时,我得到了内存膨胀(我运行了几个并且总体上经历了相同的事情)。我发现使用Scout并且每次出现500错误时都会看到内存泄漏的模式(差不多)。以下是最新的例子:

enter image description here

虽然图中似乎exception_notification没有太多的内存分配,但是#34; Middleware"具有。我使用的唯一中间件(据我所知)是异常通知(gem '[exception_notification][2]' v.4.2.1)所以我认为它必须是它,只是我的解释是错误的。

Alexis评论后编辑 - 我跑了:

Rails.configuration.middleware.each do |m|
puts "use #{m.inspect}"
end;0

给出了关于中间件的以下输出:

use UTF8Cleaner::Middleware
use Rack::Sendfile
use ActionDispatch::Static
use #<ActiveSupport::Cache::Strategy::LocalCache::Middleware:0x0055f8e1dd5a60>
use Rack::Timeout
use Rack::Runtime
use Rack::MethodOverride
use ActionDispatch::RequestId
use Rails::Rack::Logger
use ActionDispatch::ShowExceptions
use ActionDispatch::DebugExceptions
use ActionDispatch::RemoteIp
use ActionDispatch::Callbacks
use ActiveRecord::ConnectionAdapters::ConnectionManagement
use Airbrake::Rack::Middleware
use ActiveRecord::QueryCache
use ActionDispatch::Cookies
use ActionDispatch::Session::CookieStore
use ActionDispatch::Flash
use ActionDispatch::ParamsParser
use Rack::Head
use Rack::ConditionalGet
use Rack::ETag
use ExceptionNotification::Rack
use Rakismet::Middleware
use ScoutApm::Middleware

Airbrake和ScoutApm是唯一与错误相关的人。

我的production.rb包含以下信息:

  config.middleware.use ExceptionNotification::Rack, :email => {
      :email_prefix => "[MyApp.se Exception] ",
      :sender_address => %{"Exception Notifier" <support@myapp.se>},
      :exception_recipients => %w{me@myapp.se}
    }

  # Taken from mailer.rb
  config.action_mailer.delivery_method = :smtp

  config.action_mailer.smtp_settings = {
    :enable_starttls_auto => false,
    :return_response => true,
    :raise_delivery_errors => true,
    :address => 'smtp.myapp.se',
    :port => 587,
    :domain => "myapp.se",
    :user_name => 'mailer@myapp.se',
    :password => ENV['MAILER_PWD'],
    :authentication => 'plain'
  } 

由于我上周一直在大记忆膨胀狩猎,我已经读过这封邮件至少曾经引起关注,所以可能有一些关于此的事情。

为什么会这样?我该如何解决,或至少进一步排除故障?它可能是任何其他Rails默认中间件吗?

2 个答案:

答案 0 :(得分:1)

您可以使用ExceptionMailer(whatever).deliver_later将此任务推迟到后台作业,这将释放一些内存。

答案 1 :(得分:1)

IMO是一种通过airbrake gem发送通知的更好方法。您可以运行errbit的实例以节省一些钱或注册以使用空气制动器本身。这也有助于您在收到通知时更加灵活,例如: pushover,你将获得完整的堆栈跟踪,你可以采取行动,而不是通过日志搜索。