我使用以下部署: 轨道2.3.2 红宝石1.8.7 mysql db 和 使用apache作为负载均衡器的3个mongrel实例(Windows服务) [我知道它应该升级......]
操作系统:Windows2003
我们有许多CPU密集型任务,当这些任务发生在4核计算机上时,mongrel进程只能在计划任务的核心上使用最大25%的CPU功率。 在运行了许多测试后,我们注意到它只能使用单个核心的功能,因此在完成任务时会有时间延迟。
有一个虚拟化的建议......这在客户端服务器上很难做到。 有没有人对如何改善情况有任何建议?对于这个过程,内存确实达到250MB到1GB,但这不是一个大问题。
提前致谢 莱纳斯
答案 0 :(得分:0)
通常使用的Ruby版本(MRI或YARV,即1.8或1.9)一次不能使用多个核心。 MRI是单线程的,只是在内部提供绿色线程。 YARV使用真实的OS线程,但有一个GIL(全局解释器锁),确保一次只运行一个线程。
因此,你的mongrels每个都不能使用多个核心(即使你已经将你的Rails应用程序编码为线程安全)。还有其他Ruby实现,比如JRuby或Rubinius,它们提供没有全局解释器锁的本机线程,因此允许你的应用程序使用多个核心,但你可能需要调整你的应用程序。
即便如此,即使这样,单个请求也会在单个线程中运行,因此只使用单个核心。但是如果没有你处理你自己的线程(或者至少是1.9中的光纤)这很难得到,这很可能不值得麻烦。
所以一般来说,建议是启动多个app服务器进程(在你的情况下是mongrels)。我个人使用大约1.5 - 3每核(取决于应用程序)。这样,您就可以回答那么多并行请求,并充分利用它们之间共享的可用CPU功率。