2012-01-24 28 views
7

ứng dụng ray của tôi đang sử dụng quá nhiều bộ nhớ:cách tăng bộ nhớ trên heroku?

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

Cho đến khi tôi giải quyết vấn đề, làm thế nào tôi có thể làm tăng kích thước bộ nhớ trên Heroku?

Sẽ thêm nhiều dynos web hơn sẽ giúp chia bộ nhớ?

Cảm ơn

Trả lời

2

Từ các tài liệu, yeah. Điều đó nên làm điều đó ..

"Mỗi dyno nhận được 512MB bộ nhớ để hoạt động bên trong".

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

+2

Vì vậy, bạn có nghĩ rằng việc thêm dynos web sẽ sửa chữa tạm thời không? –

5

Bạn không thể. Dynos có giới hạn 512M.B, ngay cả khi bạn nhận được nhiều dynos hơn, bạn vẫn sẽ chạm vào cùng một bức tường. Sửa lỗi rò rỉ bộ nhớ của bạn.

Mỗi dyno nhận được 512MB bộ nhớ để hoạt động bên trong. Hầu hết các ứng dụng sẽ phù hợp thoải mái trong khoản phụ cấp này và với tư cách là nhà phát triển, bạn không cần lo lắng về bộ nhớ.

Trong một số trường hợp, dyno của bạn có thể đạt hoặc vượt quá số tiền 512MB đó. Thông thường điều này là do rò rỉ bộ nhớ trong ứng dụng của bạn, trong trường hợp nào bạn có thể muốn sử dụng công cụ lược tả bộ nhớ như Oink cho Ruby hoặc Heapy cho Python để theo dõi rò rỉ và khắc phục.

Dynos vượt quá 512MB sử dụng bộ nhớ sẽ hiển thị lỗi R14 trong các bản ghi, như thế này:

4

Bạn có một giới hạn cứng 512Mb RAM để chơi không có ngoại lệ. Bộ nhớ này dựa trên cơ sở dyno. Do đó, bạn sẽ không thể triển khai ứng dụng của mình lên Heroku vì nó đứng với mức sử dụng bộ nhớ đáng kể RAM.

Tôi hiếm khi thấy các ứng dụng đứng đầu một vài trăm Mb RAM vì vậy bạn thực sự cần phải xem xét nguồn gốc của vấn đề.

Với mức sử dụng RAM của bạn, ngay cả trên một VPS thông thường, bạn sẽ cố gắng chạy nhiều hơn một vài quy trình cùng một lúc.

8

Tôi có cùng một vấn đề với một trong các khách hàng của mình. Đôi khi đào vào rò rỉ bộ nhớ có thể là một nhiệm vụ khó khăn, đặc biệt là khi nguồn rò rỉ có thể ở trong mã của bên thứ ba.

Điều tôi làm là mỗi vài giờ khởi động lại một số dynos. Tôi đã chọn giờ giao thông không cao để thực hiện việc khởi động lại.

  1. tạo một 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. Sử dụng scheduler giờ (Heroku addon) để chạy cron này.

+1

cách tiếp cận thực sự intersting – Jonathan

+2

Tôi vừa thêm điều này vào triển khai của mình: Ở đây tôi triển khai chung hơn với các quy trình web _n_: https://gist.github.com/2955544 – Jonathan

+0

bạn sẽ cần chạy ứng dụng này cho APP_USERNAME, APP_PASSWORD, APP_NAME Cấu hình $ heroku: thêm [email protected] –

0

Heroku cập nhật API của họ, vì vậy các nhận xét trên không còn hoạt động nữa. tôi đã làm một spin đơn giản tắt trên các ý kiến ​​ở trên (trong file: # {} 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 

Tiếp theo các hướng dẫn trong https://devcenter.heroku.com/articles/scheduler
1. heroku addons: tạo lên lịch: tiêu chuẩn
2. heroku chạy rake my_restart
3. heroku addons: open scheduler (Tôi đặt nó để chạy mỗi giờ do một số vấn đề bộ nhớ khó chịu tôi chưa giải quyết được).

+0

Lúc đầu, tôi đã nghĩ đến việc làm một cái gì đó phức tạp hơn như bình luận gốc (do đó phương thức get_web_and_workers) nhưng sau đó tôi quyết định khởi động lại mọi thứ. Bạn có thể dễ dàng thay đổi phương thức get_web_and_workers để phù hợp với nhu cầu của bạn tốt hơn và sử dụng. –

+0

Cập nhật API Heroku: http://www.rubydoc.info/gems/heroku-api/0.4.2 –

Các vấn đề liên quan