【问题标题】:Using god only to kill只用神来杀人
【发布时间】:2026-02-13 11:15:01
【问题描述】:

我使用乘客服务我的软件。它产生了许多 ruby​​ 进程。

有时其中一颗红宝石变得臃肿,我希望它死掉。

我希望用上帝来达到这个目的。我的想法是监视所有这些红宝石,如果它在 3 个周期内消耗超过 500MB 的内存,上帝应该尝试优雅地杀死它。如果它还活着超过 5 分钟,那么上帝应该不会优雅地杀死它。

在我看来,上帝总是试图再次运行服务,所以它迫使我们提供启动命令。是否可以仅使用上帝来杀死行为不良的进程并让乘客生成器在必要时让它们恢复运行?

【问题讨论】:

    标签: ruby-on-rails ruby god


    【解决方案1】:

    问题的答案在于问题本身。您可以使用god gem 杀死 ruby​​ 进程,这是 github 家伙的 ruby​​ 进程进程监控框架。

    基本上,它是这样工作的:

    1. 配置上帝来监控进程,它可以是 apache、passenger、mongrel 中的任何内容,也可以是执行长时间运行任务的简单文件。
    2. 在上帝的配置文件中设置条件,根据上帝将执行一些预定义的代码。

    这是一个简单的例子(取自docs)。将其视为文件长时间运行的进程,我们要监控它的内存使用情况,我们想监控它的内存使用情况,我们称之为simple.rb

    loop do
      puts 'Hello'
      sleep 1
    end
    

    现在,我们安装 god gem 并将其配置为以超级用户身份运行,以便它可以杀死/生成进程并接下来创建配置文件。示例(也取自docs):

    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 进行流程管理,这里有一些资源可能会有所帮助:

    现在,请记住 godALL 配置实际上是合法的 ruby​​ 代码,因此您可以发挥创意并做各种事情。

    最后,如果您经常发现自己正在运行长时间运行的进程,我建议您尝试JRuby,由于 JVM 和 LOT 比 MRI 更快,它更适合长时间运行的进程

    【讨论】:

      【解决方案2】:

      我在我的许多项目中都使用相同的设置,并且遇到了相同的内存泄漏问题。在搞砸了监控之后,我们决定使用乘客功能来解决它​​。具体来说,它允许设置(例如)PassengerMaxRequests 300,当它服务于该数量的请求时,它会关闭任何实例。

      如果您使用它,请确保将 PassengerMinInstances 设置为 0,因为它先于最大请求的设置。

      【讨论】: