4

坐在这里,我有一个简单的 rails 3 应用程序,其中我有一个简单的画廊模型,每个画廊都有许多图像。图像模型使用回形针扩展,并具有以下选项

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

在我的 gallery_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-1000 毫秒/上传。

但是,当我将它投入生产时,我的独角兽工作人员经常超时,当它通过它发送图像时,一个文件需要 30-55 秒。

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

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

请注意,我还使用具有头像的用户模型的同一应用程序对非 ajax 文件上传进行了测试。开发 => 完成 302 发现在 693 毫秒 生产 => 完成 302 发现在 21618 毫秒

有人在(rails3,unicorn)文件上传时遇到过类似的问题吗?

4

2 回答 2

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

这里

步骤 2解包

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

第三步修改规则

$ 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
于 2011-11-06T10:34:56.757 回答
0

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

请求:接受文件;将其保存到磁盘;将作业发布到队列 Worker:从队列中弹出作业;创建缩略图;重复

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

于 2011-03-23T13:07:06.170 回答