如何增加heroku的内存?

时间:2012-01-24 09:51:49

标签: ruby-on-rails memory heroku

我的rails应用程序使用了太多内存:

Process running mem=701M(136.9%)
Error R14 (Memory quota exceeded)

在我解决问题之前,如何在heroku上增加内存大小?

添加更多网络动态是否有助于分裂内存?

谢谢

5 个答案:

答案 0 :(得分:8)

我和我的一个客户有同样的问题。有时,挖掘内存泄漏可能是一项艰巨的任务,尤其是当泄漏源可能是第三方代码时。

我所做的是每几个小时重新启动几个dynos。我选择了非高流量时间进行重启。

  1. 创建一个cron:

    namespace :utils do
      desc "Restart app by process and time table"
      task :restart => :environment do
        time_hash = {
            1 => %w[web.1 web.2 web.3],
            3 => %w[web.4 web.5 web.6],
            5 => %w[web.7 web.8 web.9],
            7 => %w[web.10 web.11 web.12],
            16 => %w[web.13 web.14 web.1],
            18 => %w[web.2 web.3 web.4],
            20 => %w[web.5 web.6 web.7],
            22 => %w[web.8 web.9 web.10],
            0 => %w[web.11 web.12 web.13 web.14],
        }
        processes = time_hash[Time.now.hour]
        processes.each {|process| restart_process(process)} if processes
      end
    
      def restart_process(name)
        puts "restarting process #{name}:"
        heroku = Heroku::Client.new(ENV['APP_USERNAME'], ENV['APP_PASSWORD'])
        heroku.ps_restart(ENV['APP_NAME'], :ps => name)
      end
    end
    
  2. 使用每小时调度程序(heroku addon)运行此cron。

答案 1 :(得分:5)

你做不到。 Dynos有512M.B的配额,即使你得到更多的dynos,你仍然可以击中同一面墙。修复内存泄漏。

  

每个dyno都有512MB内存可供操作。大多数应用   将舒适地放在这个允许范围内,并作为开发人员   根本不用担心记忆。

     

在某些情况下,您的dyno可能达到或超过512MB的数量。   通常这是因为您的应用程序中存在内存泄漏   在哪种情况下,您可能希望使用内存分析工具,如Oink   用于Ruby或Heapy for Python来追踪泄漏并修复它。

     

超过512MB内存使用量的Dynos将显示R14错误   日志,像这样:

答案 2 :(得分:4)

你有一个512Mb RAM的硬限制,没有例外。此内存基于每个dyno。因此,您将无法将应用程序部署到Heroku上,因为它使用了实质性 RAM。

我很少看到应用程序超过几百Mb的RAM,所以你真的需要查看问题的根源。

使用你的RAM,即使在典型的VPS上,你也很难同时运行多个进程。

答案 3 :(得分:2)

来自文档,是的。应该这样做..

“每个dyno都有512MB的内存可供使用。”

http://devcenter.heroku.com/articles/dynos

答案 4 :(得分:0)

Heroku更新了他们的API,因此上面的评论不再有效。 我在上面的评论中做了一个更简单的分拆(在文件中: #{Rails.root} /lib/tasks/schedualer.rake ):

    class HerokuMaintenance
        def self.get_web_and_workers(get_ps_array)
            output = []
            get_ps_array.each do |i|
                type = fetch('process',nil)
                if type.match(/^worker\.\d+$/) or type.match(/^web\.\d+$/)
                    output << type
                end
            end
            return output
        end
        #########################################################################   
        def self.restart_all
            heroku_client.post_ps_restart(ENV['APP_NAME'])
        end
        #########################################################################   
        def self.get_ps_array(heroku_client)
            heroku_client.get_ps(ENV['APP_NAME']).body
        end
        #########################################################################

        def self.heroku_client
            Heroku::API.new( :username => ENV['APP_USERNAME'] , :password => ENV['APP_PASSWORD'])
        end
        #########################################################################   
desc "Restart app workers/web"
task :my_restart => :environment do
    HerokuMaintenance.restart_all
end

按照https://devcenter.heroku.com/articles/scheduler中的说明操作
 1. heroku插件:创建调度程序:标准
 2. heroku运行rake my_restart
 3. heroku插件:打开调度程序(我把它设置为每小时运行一次,因为我还没有解决一些烦人的内存问题)。