Ruby on rails 如何增加heroku的内存?

Ruby on rails 如何增加heroku的内存?,ruby-on-rails,memory,heroku,Ruby On Rails,Memory,Heroku,我的rails应用程序占用了太多内存: Process running mem=701M(136.9%) Error R14 (Memory quota exceeded) 在我解决问题之前,我如何增加heroku上的内存大小 添加更多的网络动态会有助于分割内存吗 谢谢医生们,是的。那就行了 “每个dyno都有512MB的内存可供操作。” 你不能。Dynos有512M.B配额,即使你得到更多的Dynos,你仍然会撞到同一堵墙。修复内存泄漏 每个dyno都有512MB的内存可供操作。大多数应用程

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

Process running mem=701M(136.9%)
Error R14 (Memory quota exceeded)
在我解决问题之前,我如何增加heroku上的内存大小

添加更多的网络动态会有助于分割内存吗


谢谢医生们,是的。那就行了

“每个dyno都有512MB的内存可供操作。”


你不能。Dynos有512M.B配额,即使你得到更多的Dynos,你仍然会撞到同一堵墙。修复内存泄漏

每个dyno都有512MB的内存可供操作。大多数应用程序 将舒适地适应此津贴,作为开发人员,您 根本不需要担心记忆

在某些情况下,您的dyno可能会达到或超过512MB。 通常,这是由于应用程序中的内存泄漏造成的 在这种情况下,您可能希望使用内存分析工具,如Oink 让Ruby或Heapy for Python跟踪漏洞并修复它

超过512MB内存使用量的Dynos将在中显示R14错误 日志如下所示:


你有一个512Mb的RAM的硬限制,没有例外。这种记忆是以每一个动态为基础的。因此,您将无法将应用程序部署到Heroku上,因为它大量使用RAM

我很少看到应用程序超过几百Mb的RAM,因此您确实需要查看问题的根源


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

我的一个客户也有同样的问题。有时挖掘内存泄漏可能是一项困难的任务,特别是当泄漏源可能在第三方代码中时

我要做的是每隔几个小时重启几个dynos。我在非繁忙时间重新启动

  • 创建一个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
    
  • 使用小时调度程序(heroku插件)运行此cron


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

    class维护
    定义self.get_web_和_worker(get_ps_数组)
    输出=[]
    获取ps数组。每个都做i|
    type=fetch('process',nil)
    如果键入.match(/^worker\.\d+$/)或键入.match(/^web\.\d+$/)
    输出ENV['APP_USERNAME'],:password=>ENV['APP_password'])
    结束
    #########################################################################   
    描述“重新启动应用程序工作人员/web”
    任务:my_restart=>:环境执行
    HerokumMaintenance.restart_all
    结束
    
    按照中的说明进行操作
    1.heroku插件:创建计划程序:标准
    2.heroku run rake my_重启

    3.heroku插件:open scheduler(我设置它每小时运行一次,因为我还没有解决一些恼人的内存问题)。

    那么你认为添加web动态会带来暂时的修复吗?我刚刚在部署中添加了这个:这里我介绍了一个更通用的实现,它可以与n个web进程一起工作:你需要为APP\u用户名、APP\u密码运行它,APP_NAME$heroku config:add APP_USERNAME=your。email@gmail.comAt一开始我想做一些更复杂的事情,比如最初的评论(因此使用get_web_和_workers方法),但后来我决定简单地重新启动一切。您可以轻松地更改get_web_和_workers方法,以更好地满足您的需要和使用。
        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