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)?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top