用上帝来杀人

时间:2012-06-15 21:02:04

标签: ruby-on-rails ruby god

我使用乘客服务我的软件。它产生了许多红宝石过程。

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

我希望将神用于那个意图。我的想法是监控所有这些红宝石,如果它消耗超过500MB的内存3个周期,上帝应该尝试优雅地杀死它。如果它活着超过5分钟,那么上帝不应该优雅地杀死它。

在我看来,上帝总是试图再次运行服务,因此它迫使我们提供启动命令。是否有可能只使用上帝杀死不良的行为过程,并让乘客产生在必要时让他们恢复生活?

2 个答案:

答案 0 :(得分:4)

回答你的问题本身就存在问题。你可以使用god gem来杀死ruby进程,这是github的ruby进程进程监视器框架。

基本上,这是它的工作原理:

  1. 配置上帝来监控进程它可以是来自apache,passenger,mongrel的任何东西,或只是执行长期任务的简单文件。
  2. 根据上帝将执行某些预定义代码,在上帝的配置文件中设置条件。
  3. 这是一个简单的例子(取自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:

    进行流程管理,那么这里有一些可能有用的资源

    现在,请记住god所有配置实际上是合法的红宝石代码,因此您可以获得创意&做各种各样的事情。

    最后,如果你经常发现自己正在运行一个长时间运行的过程,我建议你试试JRuby,由于JVM和JVM,这对于长时间运行的进程更有效。比MRI更快

答案 1 :(得分:2)

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

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