Загрузка с скрепкой очень медленно (единорог) - PullRequest
4 голосов
/ 22 марта 2011

Сидя здесь с простым приложением rails 3, в котором у меня есть простая модель галереи, и в каждой галерее много изображений.Модель изображения расширена с помощью скрепки и со следующими параметрами

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-1000мс / загрузка.

Однако, когда я запускаю его в производство, я постоянно получаю тайм-ауты моих рабочих-единорогов, и когда он отправляет изображение через него, требуется от 30 до 55 секунд для одного файла.

файлы, которые я загружаю, имеют размер около 100 КБ

Я провел некоторое тестирование пропускной способности между моим VPS и моим компьютером dev с ipref и получил среднюю скорость около 77 Кбит / с, поэтому загрузка не должна бытьпроблема.

Примечание. Я также провел тест с загрузкой файлов без AJAX, используя то же приложение с пользовательской моделью, в которой есть аватар.Разработка => Завершено 302 Обнаружено за 693 мс Производство => Завершено 302 Обнаружено за 21618 мс

Кто-нибудь сталкивался с подобной проблемой при загрузке файлов (rails3, unicorn)?

Ответы [ 2 ]

4 голосов
/ 06 ноября 2011

Так что, покопавшись, мне удалось определить, что на моем VPS это была опция OpenMP в ImageMagick, которая вызывала очень медленную работу.Поэтому моей первой попыткой было перестроить нативный пакет Ubuntu 10.04 с добавленным флагом --disable-openmp.По какой-то причине это не удалось, и хотя я не уверен, почему пакет продолжал выводиться с openMP, все еще активным.Мое текущее решение теперь вместо этого сделать бэкпорт ImageMagick из Ubuntu 10.10.Ниже приведены шаги, которые я предпринял:

Шаг 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

Шаг 3 изменить правила

$ cd imagemagick-6.6.2.6
$ vim debian/rules

Добавитьследующая строка в ./configure statment в строке 25-39.Я добавил свой в строку 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
0 голосов
/ 23 марта 2011

Если обработка занимает много времени, рассмотрите обработку миниатюр у отдельных работников.

Запрос: принять файл; сохранить его на диск; разместить работу в очереди Работник: всплывающее задание из очереди; создавать эскизы; повторить

Задержка :: Job и Resque - отличные решения для этого.

...