nginx,乘客,ruby on rails设置的可伸缩性

可能重复:
你如何做网站负载testing和容量规划

嗨,我有一个关于我的RoR应用程序的可伸缩性的问题。

我们一直在优化我们的应用程序在过去几天和运行blitz.io后,请注意,我们的应用程序超时,可能在1000秒后,在30秒内,我们经历了大规模的超时。 在1分钟的testing中,显然有74%的用户会超时。

看看我的网站的性能: http : //blitz.io/report/1c8eb2f395a5eadeabd62fd831ada9e5

不是说现在我们的网站会以任何方式体验这一点,但我希望devise基础设施来处理这个问题。

通常在这种情况下做什么? 目前我们有一个Web服务器和一个数据库服务器。 负载平衡会成为什么路线?

有很多不同的方法来提高你的应用程序的性能。 你已经在做一个优化。 特别是如果你开始优化查询(即修复n + 1个查询)。 还有其他3个领域我也会考虑。 垂直缩放和水平缩放( http://en.wikipedia.org/wiki/Scalability#Scale_horizo​​ntally_vs._vertical )和解释器。

我喜欢先水平放大,至less有一点点。 有2个应用程序服务器和一个负载平衡器将增加您可以处理的请求数量,我最喜欢这种方法,因为一个应用程序服务器是单点故障。 尽pipe在这种情况下负载均衡器成为单点故障。 你可以运行2个LB来冗余,但是我有点儿超出你的问题范围。

之后,我会垂直缩放。 如果您正在运行像AWS EC2实例这样的虚拟机,就像从m1.small移动到c1.medium一样简单。 许多其他的云提供商有不同的方式来移动到更大的服务器。 如果您正在自己的硬件上运行,请对您的应用程序进行基准testing,并查看瓶颈所在(您应该尽可能地执行此操作,然后执行此操作)。 如果瓶颈是内存,只需升级服务器上的内存并重新testing即可。 那么你可能会发现下一个瓶颈是CPU,所以你需要升级它。

你应该考虑的其他领域是你正在使用的Ruby解释器。 如果你正在使用MRI(默认的ruby解释器),那么你在桌面上留下了很多的性能。 核磁共振对发展很有帮助,但是在交通繁重的地方,如果我能避免的话,我不会使用它。 MRI使用全球解释器锁(GIL),基本上使您的应用程序单线程。 我可能是错的,但从我的理解来看,每个进程都需要内存中的应用程序副本。 所以,如果你有8个工作人员提供请求,你的应用程序将占用8倍的内存。

还有其他几个Ruby解释器,如JRuby和Rubinius。 我对Rubinius了解不多,但是从我的理解来看,它不再使用GIL,从性能的angular度来看,它是MRI的一个很好的select。

尽pipe我是JRuby的忠实粉丝。 如果您还没有猜到,JRuby是一个用Java和Ruby编写的Ruby解释器。 这是非常稳定的,并利用JVM,所以你得到本地并发。 如果您select使用Java 7,则invokedynamic可以在JVM热身之后内联方法调用,并且像本地Java代码一样提高JVM语言的性能。 使用JRuby,不需要为每个进程在内存中为应用程序创build新的副本,而是使用在内存中共享应用程序的单个副本的线程。

如果您决定使用JRuby,请查看Torquebox,这是一个build立在JBoss之上的令人敬畏的应用程序服务器。 JRuby的首席开发人员最近被红帽雇佣,红帽已经雇佣了JBoss和Torquebox的开发人员,所以我想这三个团队之间有很多沟通。

通用的基准testing几乎没有用,但是在真正的生产应用程序中我看到和听说过所有真正的基准testing,比较MRI和JRuby,性能提升是荒谬的。 我不知道Rubinius是否会获得同样的收益,但是比JRuby迁移Rubinius可能更容易。