在Heroku中,Rails应用程序真的很慢

时间:2014-05-23 13:46:12

标签: mysql ruby-on-rails ruby ruby-on-rails-3 heroku

Rails应用程序具有以下功能:

它的一些模型从外部MySQL数据库访问数据。以下代码用于将外部数据库设置为模型:

class Foo < ActiveRecord::Base

  establish_connection ENV['EXTERNAL_DATABASE_URL']
  self.table_name = 'foos'

  ...

end

在我的笔记本上本地运行应用程序,我有以下请求执行时间:

Completed 200 OK in 374ms (Views: 118.1ms | ActiveRecord: 198.6ms)

当我将其上传到Heroku并在那里使用应用程序时,相同的请求具有以下执行时间

Completed 200 OK in 8000ms (Views: 901.6ms | ActiveRecord: 6609.2ms)

当我在Heroku上运行时,ActiveRecord和Views时间都非常大。

  • 外部数据库可能是问题吗?
  • 我该怎么检查?
  • 如果不是,可能是什么问题?

修改

NewRelic report

NewRelic显示瓶颈是数据库。但是,显然不是DB花在查询上的时间,因为当我在本地运行时,它并不需要那么多。所以我必须假设这是造成它的延迟?

1 个答案:

答案 0 :(得分:2)

数据库请求需要多长时间取决于以下几个因素:

  1. 数据库管理系统需要多长时间才能找到数据?这取决于查询的复杂性,索引的存在和表大小。
  2. Rails从结果中构建ActiveRecord对象需要多长时间?这取决于每页上的结果数量。
  3. 将请求从Web服务器发送到数据库服务器需要多长时间以及将结果从数据库服务器发送回Web服务器需要多长时间?此延迟取决于服务器之间的距离。
  4. 当您的Web服务器由Heroku在美国(us-east-1)托管,但您的数据库位于圣保罗的Amazon RDS上时,对数据库的每个请求都会在整个响应时间内增加150毫秒的延迟的网页。在一个Web请求中对数据库的请求越多,这个问题就越大。

    我建议尽可能将数据库移到Web服务器上。如果可能,在美国的同一数据中心内(在同一台服务器上最快)。或者考虑自己在圣保罗(也许是亚马逊OpsWorks)托管网络服务器。