用回形针上传很慢(独角兽)

时间:2011-03-22 20:51:32

标签: ruby-on-rails-3 imagemagick openmp vps unicorn

坐在这里有一个简单的rails 3 app,其中我有一个简单的Gallery模型,每个画廊都有很多图像。使用回形针和以下选项扩展图像模型

has_attached_file :local, 
   :styles => {
     :large => "800x800>", 
     :medium => "300x300>", 
     :thumb => "100x100#", 
     :small => "60x60#"
   }

在我的galleries_controller中,我执行了以下操作,以便使用jQuery-File-Upload插件。从而json响应。

def add_image
   gallery = Gallery.find params[:id]
   image = gallery.images.new({:local => params[:local]})
   if image.save
     render :json => {:thumb => image.url(:thumb), :original => image.url}
   else  
    render :json => { :result => 'error'}
   end
end

对我而言,这是相当直接的。但问题来了。在Mongrel下的开发中,任何类型的上传都可以正常工作,大约500-1000ms /上传。

然而,当我将它推向生产时,我不断地让我的独角兽工作人员超时,当它发送图像时,一个文件需要30-55秒。

我上传的文件大小约为100k

我已经对我的VPS和我的开发计算机之间的带宽进行了一些测试,并且平均速度大约为77kbps,因此上传应该不是问题。

注意我还使用具有头像的用户模型的相同应用程序进行非ajax文件上传测试。 发展=>完成302发现在693ms 生产=>完成302发现于21618ms

任何人都遇到类似的问题(rails3,unicorn)文件上传?

2 个答案:

答案 0 :(得分:4)

所以在挖掘之后,我设法确定在我的VPS上,ImageMagick中的OpenMP选项导致了非常慢的操作。所以我的第一次尝试是重建原生Ubuntu 10.04包,并添加了--disable-openmp标志。由于某种原因,这失败了,虽然我不确定为什么打包出来的openMP仍然有效。我现在的解决方案现在改为从Ubuntu 10.10向后移植ImageMagick。下面是我采取的步骤:

第1步下载以下文件:

  • imagemagick_6.6.2.6-1ubuntu1.1.dsc
  • imagemagick_6.6.2.6.orig.tar.bz2
  • imagemagick_6.6.2.6-1ubuntu1.1.debian.tar.bz2

来自here

第2步解压缩包

$ dpkg-source -x imagemagick_6.6.2.6-1ubuntu1.1.dsc

第3步编辑规则

$ cd imagemagick-6.6.2.6
$ vim debian/rules

将第二行添加到第25-39行的./configure规则中。我在第34行添加了我的。

34: --disable-openmp \

第4步添加依赖项和构建(我需要这些依赖项)

$ sudo apt-get install liblqr-1-0-dev librsvg2-dev
$ dpkg-buildpackage -b

第5步使用旧版本,使用新版本

$ sudo apt-get remove --purge imagemagick
$ sudo dpkg -i libmagickcore3_6.6.2.6-1ubuntu1.1_amd64.deb
$ sudo dpkg -i libmagickwand3_6.6.2.6-1ubuntu1.1_amd64.deb
$ sudo dpkg -i imagemagick_6.6.2.6-1ubuntu1.1_amd64.deb

第6步再次进行快速图像转换

_before_ (with openmp)
$ time utilities/convert 'image.jpg' -resize "x60" -crop "60x60+10+0" +repage 'thumb'
real    0m11.602s
user    0m11.414s
sys  0m0.069s

_after_
$ time utilities/convert 'image.jpg' -resize "x60" -crop "60x60+10+0" +repage 'thumb'
real    0m0.077s
user    0m0.058s
sys  0m0.019s

答案 1 :(得分:0)

如果处理需要很长时间,请考虑在单独的工作人员中处理缩略图。

请求:接受文件;将其保存到磁盘;将工作岗位排队 工人:队列中的流行工作;创建缩略图;重复

延迟:: Job和Resque是很好的解决方案。