我使用乘客服务我的软件。它产生了许多 ruby 进程。
有时,其中一颗红宝石变得臃肿,我希望它死掉。
我希望用上帝来达到这个目的。我的想法是监控所有这些红宝石,如果它在 3 个周期内消耗超过 500MB 的内存,上帝应该尝试优雅地杀死它。如果它存活超过 5 分钟,那么上帝应该不会优雅地杀死它。
在我看来,上帝总是试图再次运行该服务,因此它迫使我们提供启动命令。是否可以只使用上帝来杀死行为不良的进程并让乘客产卵器在必要时让它们恢复活力?
我使用乘客服务我的软件。它产生了许多 ruby 进程。
有时,其中一颗红宝石变得臃肿,我希望它死掉。
我希望用上帝来达到这个目的。我的想法是监控所有这些红宝石,如果它在 3 个周期内消耗超过 500MB 的内存,上帝应该尝试优雅地杀死它。如果它存活超过 5 分钟,那么上帝应该不会优雅地杀死它。
在我看来,上帝总是试图再次运行该服务,因此它迫使我们提供启动命令。是否可以只使用上帝来杀死行为不良的进程并让乘客产卵器在必要时让它们恢复活力?
你的问题的答案在于问题本身。你可以使用god gem杀死 ruby 进程,这是 github 家伙的 ruby 进程监控框架。
基本上,这是它的工作原理:
这是一个简单的例子(取自docs)。将其视为文件长时间运行的进程,我们要监视它的内存使用情况,我们要监控它的内存使用情况,让我们称之为simple.rb
loop do
puts 'Hello'
sleep 1
end
现在,我们安装god
gem 并将其配置为以超级用户身份运行,以便它可以杀死/生成进程并接下来创建一个配置文件。示例(也取自文档):
God.watch do |w|
w.name = "simple"
w.start = "ruby /full/path/to/simple.rb"
w.keepalive(:memory_max => 500.megabytes)
end
在这里,您可能已经知道如果进程内存使用量超过 500 兆字节,上帝会重新启动它。如果您开始使用god
gem 进行流程管理,这里有一些资源可能会有所帮助:
现在,请记住所有配置god
实际上是合法的 ruby 代码,这样您就可以发挥创意并做各种事情。
最后,如果您经常发现自己运行长时间运行的进程,我建议您尝试JRuby,由于 JVM 和 LOT 比 MRI 更快,它更适合长时间运行的进程
I use the same setup on many of my projects and had the same memory leaking issues. After messing around with monitoring, we decided to use the passenger features to tackle it. Specifically it allows the setting (e.g.) PassengerMaxRequests 300
which shuts down any instance when it has served that number of requests.
If you use it, make sure that PassengerMinInstances
is set to 0 because it preceedes the setting for max requests.