2012-01-24 12 views
7

मेरे रेल एप्लिकेशन बहुत अधिक स्मृति का उपयोग कर रहा है:Heroku पर स्मृति कैसे बढ़ाएं?

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

जब तक मैं इस समस्या का समाधान, मैं कैसे Heroku पर स्मृति आकार में वृद्धि कर सकते हैं?

अधिक वेब डायनो जोड़ना स्मृति को विभाजित करने में मदद करेगा?

धन्यवाद

उत्तर

2

दस्तावेज़ों से, हाँ। ऐसा करना चाहिए ..

"प्रत्येक डिनो को संचालित करने के लिए 512 एमबी मेमोरी मिलती है।"

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

+2

तो क्या आपको लगता है कि वेब डायनो जोड़ना अस्थायी तय करेगा? –

5

आप नहीं कर सकते। Dynos के पास 512M.B कोटा है, भले ही आपको अधिक dynos मिल जाए, फिर भी आप एक ही दीवार पर हिट करेंगे। अपनी मेमोरी लीक को ठीक करें।

प्रत्येक डिनो को संचालित करने के लिए 512 एमबी मेमोरी मिलती है। अधिकतर अनुप्रयोग इस भत्ते के भीतर आराम से फिट होंगे, और एक डेवलपर के रूप में आप स्मृति के बारे में चिंता करने की आवश्यकता नहीं है।

कुछ मामलों में, आपका डिनो उस 512 एमबी राशि तक पहुंच या उससे अधिक हो सकता है। आमतौर पर यह आपके अनुप्रयोग में मेमोरी लीक की वजह से है, में यदि आप रिसाव को ट्रैक करने और इसे ठीक करने के लिए पाइथन के लिए रूबी या हेपी के लिए ओंक जैसे मेमोरी प्रोफाइलिंग टूल का उपयोग करना चाहते हैं।

dynos कि स्मृति के उपयोग की 512MB से अधिक इस तरह, लॉग में एक R14 त्रुटि प्रदर्शित करेगा:

4

आप बिना किसी अपवाद के खेलने के लिए 512MB की RAM की एक हार्ड सीमा है। यह स्मृति एक प्रति dyno आधार पर है। इसलिए आप अपने आवेदन को हेरोकू पर तैनात नहीं कर पाएंगे क्योंकि यह पर्याप्त रैम उपयोग के साथ खड़ा है।

मैं शायद ही कभी कुछ सौ एमबी रैम टॉपिंग अनुप्रयोग देखता हूं ताकि आपको वास्तव में समस्या का स्रोत देखना होगा।

अपने रैम उपयोग के साथ, एक सामान्य वीपीएस पर भी आप एक ही समय में दो से अधिक प्रक्रियाओं को चलाने के लिए संघर्ष करेंगे।

8

मुझे अपने ग्राहकों में से एक के साथ एक ही समस्या है। कभी-कभी मेमोरी लीक में खोदना मुश्किल काम हो सकता है, खासकर जब रिसाव का स्रोत तीसरे पक्ष के कोड में हो सकता है।

मैं क्या करता हूं प्रत्येक कुछ घंटों में कई डायनास पुनरारंभ होते हैं। मैंने पुनरारंभ करने के लिए गैर उच्च ट्रैफिक घंटे उठाए।

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 एडऑन) इस क्रॉन को चलाने के लिए:

    1. एक क्रॉन पैदा करते हैं।

  • +1

    वास्तव में इंटरस्टिंग दृष्टिकोण – Jonathan

    +2

    मैंने अभी इसे अपनी तैनाती में जोड़ा है: यहां मैं अधिक सामान्य कार्यान्वयन करता हूं जो _n_ वेब प्रक्रियाओं के साथ काम करता है: https://gist.github.com/2955544 – Jonathan

    +0

    आपको इसे APP_USERNAME, APP_PASSWORD, APP_NAME के ​​लिए चलाने की आवश्यकता होगी $ heroku config: [email protected] –

    0

    हेरोोकू ने अपने एपीआई को अपडेट किया, इसलिए ऊपर दी गई टिप्पणियां अब काम नहीं करती हैं।https://devcenter.heroku.com/articles/scheduler
    में

    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 
    

    निर्देशों का पालन: मैं एक सरल स्पिन बंद टिप्पणियों पर ऊपर किया (फाइल में: # {Rails.root} /lib/tasks/schedualer.rake) 1. Heroku एडऑन: (कुछ कष्टप्रद स्मृति मुद्दों मैं अभी तक हल नहीं किया है की वजह से मैं हर एक घंटे चलने के लिए सेट) खुला अनुसूचक: मानक
    2. Heroku रन रेक my_restart
    3. Heroku एडऑन: अनुसूचक पैदा करते हैं।

    +0

    शुरुआत में मैंने मूल टिप्पणियों की तरह कुछ और जटिल करने का विचार किया (इसलिए get_web_and_workers विधि) लेकिन बाद में मैंने बस सब कुछ पुन: प्रारंभ करने का निर्णय लिया। आप अपनी आवश्यकताओं को बेहतर और उपयोग करने के लिए get_web_and_workers विधि को आसानी से बदल सकते हैं। –

    +0

    हेरोकू एपीआई अपडेट: http://www.rubydoc.info/gems/heroku-api/0.4.2 –