Sube con PaperClip muy lento (unicornio)
-
28-10-2019 - |
Pregunta
Sentado aquí con una aplicación simple Rails 3 en la que tengo un modelo de galería simple y cada galería tiene muchas imágenes. El modelo de imagen se extiende con PaperClip y con las siguientes opciones
has_attached_file :local,
:styles => {
:large => "800x800>",
:medium => "300x300>",
:thumb => "100x100#",
:small => "60x60#"
}
En mi galeries_controller tengo la siguiente acción que se implementa para trabajar con el jQuery-File-Supload enchufar. De este modo la respuesta 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
Para mí esto es bastante sencillo. Pero aquí viene el problema. En el desarrollo bajo Mongrel, cualquier tipo de carga funciona bien con aproximadamente 500-1000 ms/carga.
Sin embargo, cuando lo presiono a la producción, constantemente obtengo tiempos de espera de mis trabajadores de unicornio y cuando envía una imagen a través de él lleva entre 30 y 55 segundos para un archivo.
Los archivos que carto tienen alrededor de 100k en tamaño
He realizado algunas pruebas del ancho de banda entre mi VPS y mi computadora de desarrollo con IPREF y obtuve una velocidad promedio de aproximadamente 77kbps, por lo que la carga no debería ser un problema.
Nota También hice una prueba con una carga de archivos no AJAX utilizando la misma aplicación con el modelo de usuario que tiene un avatar. Desarrollo => completado 302 encontrado en 693ms Producción => 302 completado encontrado en 21618ms
¿Alguien experimentó un problema similar con las cargas de archivos (Rails3, Unicorn)?
Solución
Entonces, después de cavar, logré determinar que en mi VPS era la opción OpenMP en ImageMagick lo que estaba causando la operación muy lenta. Así que mi primer intento fue reconstruir el paquete nativo de Ubuntu 10.04 con la bandera--desesable-openmp agregada. Esto falló por alguna razón y aunque no estoy seguro de por qué el paquete seguía saliendo con OpenMP aún activo. Mi solución actual ahora es para respaldar la imagen de ImageMagick de Ubuntu 10.10. A continuación sigue los pasos que tomé:
Paso 1 Descargue los siguientes archivos:
- 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
de aquí
Paso 2 Desempaquete el paquete
$ dpkg-source -x imagemagick_6.6.2.6-1ubuntu1.1.dsc
Paso 3 editar las reglas
$ cd imagemagick-6.6.2.6
$ vim debian/rules
Agregue la línea de follwing a la estebo ./configure en la línea 25-39. Agregué el mío en la línea 34.
34: --disable-openmp \
Paso 4 Agregar dependencias y construir (necesitaba estas dependencias)
$ sudo apt-get install liblqr-1-0-dev librsvg2-dev
$ dpkg-buildpackage -b
Paso 5 Fuera con el viejo, adentro con el nuevo
$ 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
Paso 6 Una vez más tienen conversiones de imágenes rápidas
_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
Otros consejos
Si el procesamiento lleva mucho tiempo, considere procesar las miniaturas en trabajadores separados.
Solicitud: aceptar archivo; Guárdelo en el disco; Publicar trabajo para cola trabajador: trabajo pop de la cola; crear miniaturas; repetir
Retrasado :: trabajo y resque son excelentes soluciones para esto.