乘客托管Rails app*痛苦*慢,但服务器是一个野兽

Mat*_*age 26 ruby-on-rails passenger nginx

我一直在努力部署一个相对较大的Rails应用程序(Rails 2.3.5),并且最近进行了一些负载测试,我们发现该站点的吞吐量远低于预期的流量水平.

我们运行的是标准的32位服务器,带有Centos的3GB内存,我们运行的是Ruby Enterprise Edition(最新版本),Passenger(最新版本)和Nginx(最新版本) - 当网站运行时只有一两个用户很好(正如你所料)然而当我们试图将负载增加到大约50个并发请求时,它完全消失了.(Apache Bench报告~2.3 req/sec,这很糟糕)

我们正在运行RPM并尝试确定加载问题的位置,但它在Rails,SQL和Memcached中的分布非常均匀,因此我们或多或少地经历并优化代码库.

出于绝望,我们开发了一个大型EC2实例(Ubuntu 9.10,7.5GB RAM,2个计算单元/内核)并设置了与原始服务器相同的配置,虽然有更多资源我们仍然看到可悲的结果.

所以,在花了太多时间尝试优化,玩缓存配置等后,我决定测试一些杂种的吞吐量,而ta-da,它们的性能远远超过Passenger.

目前配置是15x Mongrels通过Nginx代理,我们似乎只是满足我们的负载要求,但它还不足以让我对上线感到满意......我想知道的是,如果有人知道这可能的原因...?

我对passenger/nginx的配置是:

  • Nginx工作者:尝试过1到10,通常是3.
  • 乘客最大泳池大小:10 - 30(是的,这些数字相当高)
  • 乘客全球排队:尝试打开和关闭.
  • NGinx GZip:是的

可能需要注意的是,我们已将nginx max客户端主体大小增加到200米,以允许大文件上传.

无论如何建议真的很感激,而杂种工作得很好,它改变了我们做很多事情的方式,我真的更喜欢使用乘客 - 此外,是不是应该让这更容易,表现更好?

hur*_*n77 18

也许你的sql pool太小了?这实际上限制了应用程序中数据库工作负载的并行性,一旦您将工作放在应用程序堆栈上,这反过来会增加负载.

  • 这取决于您的内存大小和应用程序使用的大小.它应该填满这样的东西:"poolsize*process_size <80%*ram"和"accessses_per_second*response_time <poolsize",否则你的服务器将不适合或你的响应时间会受到影响.请记住,这个等式不计算mysql(对于mysql,每个应用程序进程大小增加2 mb + 1或2 gb,如果它在同一台机器上运行). (4认同)