Bypass UploadCreator per l'importazione

Sto lavorando a un’importazione in Discourse utilizzando un bulk importer. Questo funziona molto bene per i topic e i post, ma al momento la parte più lenta riguarda i file. Abbiamo circa 50.000 utenti con avatar e, mentre i dati degli utenti vengono importati nel database in pochi secondi, gli avatar stanno richiedendo ore per l’importazione. Si sta elaborando solo un caricamento al secondo.

Esiste un modo per velocizzare questo processo? Non sono sicuro di quale parte del processo sia la più lenta. Se non viene trovato alcun file avatar (photo_filename non esisteva), l’esecuzione è molto rapida, ma sto avendo difficoltà a esaminare la classe UploadCreator che viene infine invocata da questo codice di importazione.

Abbiamo oltre 600.000 allegati, quindi sono molto preoccupato per quanto tempo richiederà l’importazione utilizzando la stessa chiamata create_upload.

        upload = create_upload(u.id, photo_filename, File.basename(photo_filename))
        if upload.persisted?
          u.import_mode = false
          u.create_user_avatar
          u.import_mode = true
          u.user_avatar.update(custom_upload_id: upload.id)
          u.update(uploaded_avatar_id: upload.id)
        else
          puts "Errore: il caricamento non è stato salvato per #{u.username} #{photo_real_filename}!"
        end
2 Mi Piace

Hai qualche idea su questo, @neounix, visto che hai già gestito un grande importatore di massa una volta?

Grazie all’importatore di massa, abbiamo ridotto l’elaborazione di 26 milioni di post da una settimana a circa due ore. Il punto critico ora sono gli allegati, che richiedono diversi giorni.

Ciao @TheDarkWizard

Non ho utilizzato gli script di Discourse per spostare i file effettivi.

Abbiamo usato normali utility di trasferimento file come tar, gzip, sftp, rsync, ecc.

A dire il vero, abbiamo utilizzato vari pezzi di diversi script di migrazione di Discourse, ma abbiamo finito per scrivere più della metà di tutto il codice che abbiamo usato durante la migrazione; perché abbiamo passato mesi a scrivere codice con gsub() per pulire (e revisionare) i decenni di post contenenti “codice”, revisionati da moderatori che avevano pubblicato molto codice nel corso degli anni, e tutti volevano che il loro codice fosse perfetto, senza alcun errore di sintassi!

Pensavamo che gli script forniti da Discourse fossero un ottimo punto di partenza e li abbiamo utilizzati estesamente; abbiamo anche scritto molto codice nostro basato su quegli script.

Spero ti sia utile.

Mi dispiace, forse la mia domanda è stata ignorata. Non abbiamo bisogno di istruzioni su come spostare i file nell’ambiente server dove avviene l’importazione. Abbiamo uno script di importazione in blocco che @Ghan sta scrivendo e stiamo cercando di capire come accelerare il trasferimento degli allegati. Passare dall’importatore normale a quello in blocco ha ridotto il tempo di importazione dei post da una settimana a circa due ore. Speravo che qualcuno potesse indicarci la strada giusta per gestire correttamente gli allegati.

Scusa se ho frainteso la tua domanda e la mia risposta non è stata utile.

Comunque, sono sicuro che ce la farai. Non è roba da scienziati (è solo software) :slight_smile: e voi siete molto intelligenti.

In bocca al lupo. Mi dispiace non essere stato più d’aiuto. Abbiamo completato la nostra migrazione nel secondo trimestre del 2020 e quel compito (la migrazione) è ormai lontano nel nostro specchietto retrovisore.

1 Mi Piace

Va bene!

Il tuo sito è fantastico :slight_smile:

1 Mi Piace

Non credo esista una soluzione miracolosa simile. Dato che i caricamenti non dipendono dall’elaborazione dei post precedenti, potresti configurare l’esecuzione di più processi (ad esempio, ciascuno per un diverso intervallo di date) per ridurre il tempo di un fattore pari al numero di CPU a tua disposizione (purché il database e il file system non siano il collo di bottiglia).

Sembra che, man mano che i post vengono elaborati per gli allegati, vengano avviati diversi lavori Sidekiq per gestire altre elaborazioni su questi post. Di conseguenza, anche un singolo processo che lavora sull’importazione degli allegati riesce a portare gradualmente il server a un carico medio superiore a 40, nonostante disponga di 8 core. (Ho aumentato il numero di worker Sidekiq per gestire il carico.)

Potrei riuscire a fermare il servizio Unicorn fino al completamento dell’importazione, ma questo significherebbe semplicemente spostare il carico a un momento successivo. Sembra che l’elaborazione debba essere eseguita in un modo o nell’altro.

Questa è una verità fondamentale.