Rails应用程序在登台服务器上运行速度快,生产速度慢20倍

时间:2014-12-14 16:22:34

标签: mysql ruby-on-rails ruby performance activerecord

我面临一个奇怪的问题,在测试登台服务器上的一些新功能后,我决定将它们转移到生产上。两个服务器上的数据库完全相同。

我正在运行此代码:

def an_action
  search_start = Time.now
  @a1 = Time.now
  @results = find_hotels
  @a2 = Time.now
  @b1 = Time.now
  @results[:hotels].uniq_by {|x| x["hotel_name"]}.each do |result|
    @markers << "...saving some data..."
  end
  @b2 = Time.now
  search_end = Time.now # search started
  @total_time = search_end - search_start
end

private
def find_hotels
  @hotels = Hotel.includes(:services).within(distance, origin: city).where('nonstop = ?', 0).order("distance ASC")
  return {:hotels => @hotels}
end

在视图中,我打印出我在控制器操作中测量的时间:

<div>
  Hotels: <%= @results[:hotels].count %>, 
  Markers: <%= @markers.count %>, 
  A: <%= @a2-@a1 %>, 
  B: <%= @b2-@b1 %>, 
  Total: <%= @total_time %>
</div>

现在问题出现了:

登台服务器:

  Hotels: 476, 
  Markers: 342, 
  A: 0.254782386, 
  B: 0.863244492, 
  Total: 1.118588403

生产服务器:

  Hotels: 476, 
  Markers: 342, 
  A: 20.257541647, 
  B: 0.422051075, 
  Total: 20.679673465

本地主机:

  Hotels: 476, 
  Markers: 342, 
  A: 0.84956, 
  B: 2.98855, 
  Total: 3.83876

生产和登台服务器是相同的(只有登台有大约10GB的磁盘空间)。我认为问题可能出在MySQL索引中,但在两台服务器上加载的时间是相同的(大约0.90秒)。

为什么生产服务器的加载时间如此之高?我不知道从哪里开始寻找问题,我以前从未遇到过这个问题。

我的localhost也比登台服务器慢,但不如生产服务器慢。

提前感谢你们的时间。

1 个答案:

答案 0 :(得分:1)

要调查使用的索引,请在两台sql服务器上运行以EXPLAINED为前缀的查询。例如EXPLAIN SELECT * FROM users;然后比较两个结果。

要获取sql,请使用此行raise @hotels.to_sql或查看开发日志。