【发布时间】:2010-10-08 15:50:53
【问题描述】:
我正在编写一个 Web 应用程序来监控家具厂的生产流程。它有数千个数据要处理。到目前为止,我在 Mongrel + MySQL 上运行 RoR,它真的很慢(某些视图需要 2-4 分钟)。当我查看 RoR 日志时,数据库查询似乎并不慢(0-10ms)。
将数据库数据转换为对象时,RoR 是否很慢? Mongrel 慢吗?
编辑:第一件事:我在开发。环境。在生产环境中,最慢的视图需要 2 分钟(在一台好计算机上会降低到不到 1 分钟,我的是 5 岁)。通过 ruby-prof 和一些常识,我发现了哪些方法会减慢应用程序的速度。问题是在大型数据集上循环调用单个 SQL 查询:
ofs = Ofkb.find_by_sql ["..some large SQL query..."]
for of in ofs # About 700-1000 elements
ops = Operation.find(..the single query..)
etc.
end
以下是这些方法的 ruby-prof 结果:
%self total self wait child calls name
32.19 97.91 97.91 0.00 0.00 55 IO#gets (ruby_runtime:0}
28.31 86.39 86.08 0.00 0.32 32128 Mysql#query (ruby_runtime:0}
6.14 18.66 18.66 0.00 0.00 12432 IO#write (ruby_runtime:0}
0.80 2.53 2.42 0.00 0.11 32122 Mysql::Result#each_hash (ruby_runtime:0}
问题是:我无法真正避免那些单一的查询。我有数以千计的事件,我必须从中计算复杂的数据。现在我在那些方法上使用 memcached,除非你是第一个请求页面的人。
【问题讨论】:
-
也不是,可能是您编写的代码速度慢,或者您在开发中运行在生产环境中。如果您可以发布适当的视图内容,我们也许可以给出正确的答案。
-
同意@Tomh - 这一点都不典型,即使是大型数据集。我们需要更多信息才能做出任何类型的诊断。
-
这听起来可能很愚蠢,但请确保您在生产模式下运行。开发模式将在每次请求时重新加载所有类。
-
第一件蠢事:我在开发环境中。切换到生产,性能更好但仍然不能接受。我正在寻找可能会降低应用程序速度的错误逻辑。
标签: mysql ruby-on-rails ruby mongrel