2

我目前正在开发 HTML5 手机游戏的后端。我们使用 JSONP 与应用程序通信(因为跨域策略)。

但是 Heroku 上的托管真的很慢,我们的平均响应时间为 900 毫秒。我已经在使用包含来加速数据库访问和生产数据库。我也在运行新的遗物来分析服务器。

大部分时间都用在 Controller 本身。Controller方法中需要800ms中的650ms。

Category     Segment    % Time   Avg calls
(per txn)    Avg 
time (ms)
Controller   TasksController#update  63.4    1.0     650

没错,控制器正在做很多事情,但有没有可能,一些 ruby​​ 代码会花费这么多时间?或者可能是 jsonp 返回的东西?

Newrelic 告诉我,我们的用户最多等待 5 秒才能得到响应。这真的很多!

我们的 ApplicationController 如下所示:

# encoding: utf-8
class ApplicationController < ActionController::Base
  protect_from_forgery

  include ApplicationHelper

  include ProfilesHelper

  before_filter :authenticate, :set_locale

  after_filter :check_for_kpi


  def check_for_kpi
    if (params[:kpi])
      case params[:kpi]
        when Hash
          params[:kpi].each do |k, v|
             #all done in delayed jobs
             Kpi.delay.add(k, :value => v)
          end
        when String
          Kpi.delay.add(params[:kpi])
        when Array
          params[:kpi].each do |k|
            Kpi.delay.add(k)
          end
        else
          logger.warn("Parameters for Kpi not detected. #{params[:kpi]} ")
      end
    end
  rescue
    logger.warn("Something went wrong in the check for kpis. ")
  end

  def set_locale
    I18n.locale = params[:locale] || I18n.default_locale
  end

  def authenticate
    authkey = params[:session_key]

    @error = {}

    @profile = Profile.includes(#some more includes).find_by_authkey(authkey)
    if (@profile.nil?)
          render_json(
              {
                  :authentication_error => true
              }
          )
    else
      if (params[:version]!= @profile.version)
        @profile.delay.update_attributes(:version => params[:version])
      end
    end

  end

  protected

  def render_json(json, profile = nil)
    profile ||= @profile
    respond_to do |format|
      format.js {
        render :js => build_result_string(json, profile, params[:controller], params[:callback])
      }
      format.json {
        render :json => json.merge(profile.try(:getSessionData))
      }
    end
  end
end

您对如何提高性能有任何想法吗?

谢谢!

4

0 回答 0