我的rails应用程序使用了太多内存:
Process running mem=701M(136.9%)
Error R14 (Memory quota exceeded)
在我解决问题之前,如何在heroku上增加内存大小?
添加更多网络动态是否有助于分裂内存?
谢谢
答案 0 :(得分:8)
我和我的一个客户有同样的问题。有时,挖掘内存泄漏可能是一项艰巨的任务,尤其是当泄漏源可能是第三方代码时。
我所做的是每几个小时重新启动几个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 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)
答案 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插件:打开调度程序(我把它设置为每小时运行一次,因为我还没有解决一些烦人的内存问题)。