0

我有一个部署使用:rails 2.3.2 ruby​​ 1.8.7 mysql db 和 3 个 mongrel 实例(windows 服务),apache 作为负载均衡器 [我知道它应该升级......]

操作系统:Windows2003

我们有许多 CPU 密集型任务,当这些任务发生在 4 核机器上时,mongrel 进程只能在计划任务的核心上使用最多 25% 的 CPU 功率。在运行了许多测试后,我们注意到它只能使用单核的能力,因此完成任务存在时间延迟。

有一个虚拟化的建议......这在客户端服务器上很难做到。有没有人对如何改善这种情况有任何建议?这个过程的内存确实达到了 250MB 到 1GB,但这不是什么大问题。

提前感谢莱纳斯

4

1 回答 1

0

通常使用的 Ruby 版本(MRI 或 YARV,即 1.8 或 1.9)一次不能使用多个内核。MRI 是单线程的,只在内部提供绿色线程。YARV 使用真正的操作系统线程,但有一个 GIL(全局解释器锁),可确保一次只运行一个线程。

因此,您的 mongrel 每个都不能使用多个内核(即使您将 Rails 应用程序编码为线程安全的)。还有其他 Ruby 实现,例如 JRuby 或 Rubinius,它们提供没有全局解释器锁的本地线程,因此允许您的应用程序使用多个内核,但您可能需要稍微调整您的应用程序。

也就是说,即使这样,单个请求也会在单个线程中运行,因此只使用单个内核。但如果不处理自己的线程(或至少 1.9 中的纤维),这是很难实现的,这很可能不值得麻烦。

所以一般来说,建议是启动多个应用服务器进程(在你的情况下是杂种)。我个人每个核心使用大约 1.5 - 3 个(取决于应用程序)。这样,您就能够回答许多并行请求并充分利用它们之间共享的可用 CPU 能力。

于 2012-03-27T19:18:29.607 回答