как увеличить память на героку? - PullRequest
8 голосов
/ 24 января 2012

Мое приложение rails использует слишком много памяти:

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

Пока я не решу проблему, как я могу увеличить размер памяти на heroku?

Поможет ли добавление дополнительных веб-динразделить память?

Спасибо

Ответы [ 5 ]

8 голосов
/ 11 апреля 2012

У меня такая же проблема с одним из моих клиентов.Иногда копание в утечках памяти может быть трудной задачей, особенно когда источником утечки может быть сторонний код.

Я каждые несколько часов перезагружаю несколько дин.Я выбрал часы без интенсивного трафика, чтобы сделать перезапуски.

  1. создать хрон:

    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), чтобы запустить этот хрон.

5 голосов
/ 24 января 2012

Вы не можете. Dynos имеют квоты 512M.B, даже если вы получите больше динамов, вы все равно попадете на ту же стену. Исправьте утечки памяти.

Каждый dyno получает 512 МБ памяти для работы. Большинство приложений будет удобно вписываться в это пособие, и как разработчик вы не нужно беспокоиться о памяти вообще.

В некоторых случаях ваш dyno может достигать или превышать эту сумму в 512 МБ. Обычно это происходит из-за утечки памяти в вашем приложении, в в этом случае вы можете использовать инструмент профилирования памяти, такой как Oink для Ruby или Heapy для Python, чтобы отследить утечку и исправить ее.

Dynos, объем памяти которых превышает 512 МБ, отображает ошибку R14 в журналы, как это:

4 голосов
/ 24 января 2012

У вас жесткий предел в 512 МБ ОЗУ для игры без исключений.Эта память на основе Dyno.Поэтому вы не сможете развернуть свое приложение на Heroku в том виде, в котором оно используется с существенным использованием ОЗУ.

Я редко вижу приложения, превышающие пару сотен МБ ОЗУ, поэтому вам действительно нужнопосмотрите на источник проблемы.

При использовании оперативной памяти даже на типичном VPS вам будет сложно запустить сразу несколько процессов.

2 голосов
/ 24 января 2012

Из документов, да.Это должно сделать это ..

"Каждая динамометрическая система получает 512 МБ памяти для работы в пределах."

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

0 голосов
/ 28 апреля 2016

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. Герои аддонов: создать планировщик: стандарт
2. геройку беги грабли my_restart
3. дополнения heroku: открыть планировщик (я запускаю его каждый час из-за некоторых проблем с памятью, которые я еще не решил).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...