Ruby on rails 如何增加heroku的内存?
我的rails应用程序占用了太多内存: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的内存可供操作。大多数应用程
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。我在非繁忙时间重新启动
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更新了他们的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