【发布时间】:2014-08-23 15:19:58
【问题描述】:
在我的 Rails 应用程序中,我有一个需要大量数据库访问的长计算。
简而言之,我的计算花了 25 秒。
在后台作业(大型单个工作人员)中执行相同的计算时,相同的计算需要两倍的时间(即 50 秒)。我已经尝试了几种技术将工作置于后台进程中,但没有一个会对我的表现产生影响 => 使用 DelayJob / Sidekiq / 在我的 Rails 中执行该过程,但在为工作创建的线程中,但都具有相同的影响我的表演*2。
这种性能差异仅存在于 rails 的“生产”环境中。看起来我的后台工作中没有由 rails 完成的优化。
我的技术环境如下=>
- 我正在使用 ruby 2.0 / rails 4
- 我正在使用独角兽(但没有它我也会遇到同样的问题)。
- 作业使用 Rails.cache 存储部分计算。
- 我正在使用 postgresql
有人知道这种影响可能来自哪里吗?
【问题讨论】:
-
您能否制作尽可能小的样本来重现该问题?
-
后台工作者是否与独角兽在同一台机器上运行(即具有相同的资源)?它是否访问与 Rails 应用程序相同的缓存(即,当使用内存缓存存储时,缓存将是进程本地的,而不是在独角兽和后台工作人员之间共享)?
-
如果经过的时间精确地乘以因子 2,那么您确定您的计算没有运行 两次?以防万一:)
-
您使用的是哪种 Rails 缓存?它是否托管在像 memcache 这样的单独机器上?如果是这样,后台工作者和缓存机器之间是否存在应用程序和缓存之间不存在的任何延迟?