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

标签 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. 数据库管理系统需要多长时间才能找到数据?这取决于查询的复杂性、索引的存在和表的大小。
  2. Rails 从结果构建 ActiveRecord 对象需要多长时间?这取决于每个页面上的结果数量。
  3. 将请求从网络服务器发送到数据库服务器需要多长时间以及将结果从数据库服务器发送回网络服务器需要多长时间?此延迟取决于服务器之间的距离。

如果您的 Web 服务器由美国 (us-east-1) 的 Heroku 托管,但您的数据库位于圣保罗的 Amazon RDS 上,则对数据库的每个请求都会在总响应时间中增加另外 150 毫秒的延迟的网页。在一个 Web 请求中完成对数据库的请求越多,这个问题就越严重。

我建议将数据库移动到尽可能靠近网络服务器的位置。如果可能的话,在美国的同一个数据中心内(在同一个服务器上是最快的)。或者考虑在圣保罗自己托管网络服务器(可能使用 Amazon OpsWorks)。

关于mysql - Rails 应用程序在 Heroku 中真的很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23830936/

相关文章:

php - 我如何在 PHP 中的另一个数组中转换这个 M-N mysql 数组? (里面的例子)

ruby-on-rails - 应用程序布局文件中的 Controller 相关标题 - Ruby on Rails

python - 相当于 Python 在 Ruby 中的 "with"

ruby - SSL_connect 返回=1 错误号=0 状态=错误 : certificate verify failed in ruby and Ubuntu 14. 04

php - SQL 查询适用于 phpMyAdmin 但不适用于 Codeigniter

mysql - CodeIgniter UPDATE 查询不适用于列值添加

mysql - 返回天数范围内的唯一日期

ruby-on-rails - 在不编辑源代码的情况下调用方法并从 Rails 控制台启动调试?

ruby-on-rails - rails 3 : javascript_include_tag :all - what's it do exactly?

ruby - 在使用 ruby​​ 中的 "mail"gem 阅读电子邮件时需要帮助