为什么Rails应用程序运行垃圾收集器?

时间:2012-11-22 12:08:07

标签: ruby garbage-collection rack application-server preemption

我非常确定,所有Rack应用程序服务器(我有UnicornPassenger的经验)都在为每个工作人员创建时创建单个进程,并且其状态被“冻结”了。

每当应用服务器收到要处理的请求时,它就会从主进程分叉,并且对分叉进程的所有进一步更改都与原始进程分开。它们受益于写时复制优化,并且可以安全地被处理请求“损坏”。对环境的所有更改都只影响将被抢占的单个进程。

如果我对RoR应用程序堆栈的看法是正确的,那么几乎不需要垃圾收集,除非提供单个请求会花费大量时间和内存(通常情况并非如此)。

另一方面,question about GC measurements done with NewRelic及其答案让我得出结论,我一定是完全错了。

有人可以澄清这个过程吗?

1 个答案:

答案 0 :(得分:2)

机架应用程序服务器在每个请求时分叉,仅在初始化期间:

  1. 首先,在一个过程中加载环境
  2. 然后,服务器分叉几个工作人员
  3. 然后所有请求都在这些进程之间分发
  4. 这就是垃圾收集器用于保持每个进程内存清洁的原因。稳定。