ActiveRecord内存泄漏?我该如何防止这种情况?

时间:2012-09-09 21:45:24

标签: ruby-on-rails-3 activerecord memory-leaks pagination

我正在尝试构建一个页面,根据用户的个人资料有多少次观看对用户进行排名。由于该页面可能会获得大量命中,因此每次配置文件获取视图时,我都会缓存已排序的用户并使该缓存无效。每天只有9个用户和~200页面浏览量,我的应用程序通过了Heroku的512mb内存容量。 New Relic证实了这一点,向我显示用户列表花费了过多的时间:

Slowest Components          Duration        %
-----------------------------------------------
UsersController#index       2,125 ms        80%
users/index.html.erb        506 ms          19%
Memcache get                20 ms           1%
User#find                   18 ms           1%
layouts/_header.html.erb    1 ms            0%
User#find_by_sql            0 ms            0%

Some reading告诉我,ActiveRecord显然没有在请求后将内存交回操作系统。查看UsersController#index,如果User.order分配的内存未被释放,我可以看到这可能会导致问题。

UserController#index:

require 'will_paginate/array'

class UsersController < ApplicationController
  PER_PAGE = 20

  def index
    @users = Rails.cache.read("users")
    if @users.nil?
      # .all is used to force the query to happen now, so that the result set is cached instead of the query
      @users = User.order("views DESC").all
      Rails.cache.write("users", @users)
    end

    @users = @users.paginate(page: params[:page], per_page: PER_PAGE)

    if params[:page].nil? || params[:page] == "1"
      @rank = 1
    else
      @title = "Page #{params[:page]}"
      @rank = (params[:page].to_i - 1) * PER_PAGE + 1
    end
  end
end

index.html.erb

<% @users.each do |user| %>
  image_tag user.profile_picture, alt: user.name
  <h3><%= @rank %></h3>
  <p><%= user.name %></p>
  <p><%= user.views %></p>
  <% @rank += 1 %>
<% end %>
<%= will_paginate %>

我不知道我应该如何解决这个问题。我想可能一次只将一页用户拉到内存中,但只有9个用户,这不会真正改变任何东西,因为每页最多应该列出20个。我是否必须在每次请求后从内存中手动清除@users,或者UsersController#index中的方法是否错误?

非常感谢任何帮助。

0 个答案:

没有答案