Rails的新手,这种表现是否正常?

时间:2009-07-27 13:25:34

标签: ruby-on-rails ruby performance

我有一个应用程序,并且在它唯一的控制器中,因此配置了一个动作:

def do_call
    response = <<EOF
<real-time-stat>
<awt type="integer">1</awt>
<cc type="integer">5</cc>
<cp type="integer">0</cp>
<dc type="integer">0</dc>
<ef type="float">100.0</ef>
<rc type="integer">6</rc>
<sl type="float">100.0</sl>
<state type="integer">0</state>
<ts type="datetime">2009-07-24T10:36:57Z</ts>
<wc type="integer">0</wc>
<wprc type="float">0.0</wprc>
<real-time-stat>
EOF
    respond_to do |format|
      format.xml { render :xml => response }
    end
  end

这是对将来从MySQL数据库中检索字段的操作的测试。但是,在生产模式下运行此代码,从运行在Pentium 4(有点旧的,但是双核)机器上的端口3000上的 LOCAL WEBrick服务器,我得到了响应时间(由YSlow测量,对于Firebug的Yahoo!附加组件测量)为175到500毫秒(波动很大)!

这是正常的吗?我做错了吗?考虑到我希望在单个响应和XML-ify中聚合多个查询(与ActiveResource一起使用),我得知它无法扩展...:

感谢您的反馈!

编辑:改为Mongrel不会改变这种情况,每次响应仍然是175-300毫秒。但是,日志显示每个“已完成”请求0到15毫秒(200 OK)。差异是否都归因于Firefox的XML渲染?如果没有,它可以从哪里来?

7 个答案:

答案 0 :(得分:4)

Webrick很慢。尝试在一个漂亮的Passenger设置下再次运行它然后报告回来。

答案 1 :(得分:4)

有几个含义导致您的测试不具有太多代表性。 让我解释一下:

  1. 您正在开发环境中运行测试。开发环境(在config/environments/development.rb中定义)与生成环境(在config/environments/development.rb中定义)大不相同。首先,它不会缓存您的类,因此大多数应用程序库都可以在任何请求时重新加载。在生产时,Rails会在启动时缓存您的对象,并且不会再次解析代码库。这是一种超级性能提升。

  2. 正如您所知,您使用的是运行状况最差的Web服务器。您应该使用Mongrel,或者,要运行真正的基准测试,您应该使用将要在生产中使用的相同服务器。

  3. 在与最终环境相同或相似的环境上运行测试通常是一个很好的规则。在开发模式下运行测试并尝试猜测它将如何在线执行并不能为您提供任何有用的信息。

  4. 您缺少缓存。 Rails提供了许多不同的缓存级别。要提高性能,您可以考虑使用页面/操作/片段缓存来缓存模型请求和/或响应。此外,您可能希望在未修改内容时使用HTTP标头发送304 http标头并设置反向代理。

  5. 对于这种特定的响应情况,您可能希望跳过完整的Rails操作/控制器堆栈并实现Rails :: Metal层,以便在响应准备就绪后立即提供响应

    < / LI>

答案 2 :(得分:4)

如果您只是在本地运行网络服务器并使用Firefox来测量性能,那么您将会得到不稳定,误导性和可疑的结果。

尝试关闭除您的网络服务器之外的所有内容,并使用abHTTPerf获取更可靠的性能指标。

如果你仍然看到只回吐一个字符串的响应时间很短,那么一个好的工具是RubyProf,你可以运行它并看看Rails花费时间的地方。

答案 3 :(得分:3)

我唯一能想到的就是使用不同的网络服务器。 webrick很慢。

使用Mongrel或Thin可以提供更好的性能。

此外,即使您处于生产模式,只需仔细检查production.rb配置设置,并确保仍然打开类缓存等。

答案 4 :(得分:2)

袖口响应:不要使用WebRick。这很慢。真的很慢。安装mongrel和Rails将自动使用它。在生产中,使用杂种或乘客。

答案 5 :(得分:1)

将你的电话包裹在

  start = Time.now
  ...
  elapsed_time = Time.now - start

并查看需要多少秒。

您的开发平台上的其他测试将不可靠,直到您将其部署到制作服务器

答案 6 :(得分:0)

WEBrick默认在连接IP时进行反向DNS查找。换句话说,它试图查看您的IP地址是否与域名相关联。这是不必要的,耗时太长,所以你可以禁用它。

打开文件&#34; l / ruby​​ / lib / ruby​​ / 1.9.1 / webrick / config.rb&#34;并使用&#34;:DoNotReverseLookup =&gt;找到该行。零&#34 ;. 将nil更改为true。

享受!