Carica con Paperclip molto lento (unicorno)
-
28-10-2019 - |
Domanda
Seduto qui con un'app Simple Rails 3 in cui ho un semplice modello di galleria e ogni galleria ha molte immagini. Il modello di immagine è esteso con paperclip e con le seguenti opzioni
has_attached_file :local,
:styles => {
:large => "800x800>",
:medium => "300x300>",
:thumb => "100x100#",
:small => "60x60#"
}
Nella mia Galleries_Controller ho la seguente azione implementata per lavorare con il jQuery-file-upload collegare. quindi la risposta 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
Per me questo è abbastanza semplice. Ma qui arriva il problema. In sviluppo sotto Mongrel, ogni tipo di caricamento funziona bene con circa 500-1000 ms/upload.
Tuttavia, quando lo spingo alla produzione ottengo costantemente timeout dei miei lavoratori unicorno e quando invio un'immagine attraverso esso impiega da 30 a 55 secondi per un file.
I file che carico hanno una dimensione di circa 100k
Ho fatto alcuni test della larghezza di banda tra i miei VP e il mio computer di Dev con iPref e ho ottenuto una velocità media di circa 77kbps, quindi il caricamento non dovrebbe essere un problema.
Nota Ho anche fatto un test con un caricamento di file non AJAX utilizzando la stessa app con il modello utente che ha un avatar. Sviluppo => Completato 302 trovato nella produzione 693ms => completato 302 trovato in 21618ms
Qualcuno ha avuto un problema simile con i carichi di file (Rails3, Unicorn)?
Soluzione
Quindi, dopo aver scavato, sono riuscito a determinare che sul mio VPS era l'opzione OpenMP in ImageMagick che stava causando l'operazione molto lenta. Quindi il mio primo tentativo è stato quello di ricostruire il pacchetto nativo Ubuntu 10.04 con il flag--Disable-OpenMP aggiunto. Ciò non è riuscito per qualche motivo e anche se non sono sicuro del motivo per cui il pacchetto ha continuato a uscire con OpenMP ancora attivo. La mia soluzione attuale è invece invece di backport ImageMagick da Ubuntu 10.10. Di seguito segue i passaggi che ho fatto:
Passo 1 Scarica i seguenti file:
- 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
da qui
Passo 2 Disimballare il pacchetto
$ dpkg-source -x imagemagick_6.6.2.6-1ubuntu1.1.dsc
Passaggio 3 modificare le regole
$ cd imagemagick-6.6.2.6
$ vim debian/rules
Aggiungi la linea Follwing all'ambito ./Configure sulla riga 25-39. Ho aggiunto il mio sulla riga 34.
34: --disable-openmp \
Passaggio 4 Aggiungi dipendenze e costruzioni (avevo bisogno di queste dipendenze)
$ sudo apt-get install liblqr-1-0-dev librsvg2-dev
$ dpkg-buildpackage -b
Passaggio 5 Fuori con il vecchio, in con il nuovo
$ 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
Passaggio 6 Ancora una volta hanno conversioni di immagini veloci
_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
Altri suggerimenti
Se l'elaborazione richiede molto tempo, considerare l'elaborazione delle miniature in lavoratori separati.
Richiesta: accetta il file; Salvalo su disco; Post Job to Fyue Worker: Pop Job dalla coda; creare miniature; ripetere
Ritardato :: lavoro e resque sono ottime soluzioni per questo.