Estoy trabajando en una importación a Discourse usando un importador masivo. Esto funciona muy bien para temas y publicaciones, pero en este momento la parte lenta son los archivos. Tenemos alrededor de 50.000 usuarios con avatares y, aunque los datos de los usuarios se importan a la base de datos en solo unos segundos, los avatares están tardando horas en importarse. Solo se está procesando aproximadamente una subida por segundo.
¿Hay alguna forma de acelerar esto? No estoy seguro de qué parte de este proceso es la más lenta. Si no se encuentra ningún archivo de avatar (photo_filename no existía), entonces se ejecuta muy rápidamente, pero me estoy perdiendo un poco al intentar investigar la clase UploadCreator que finalmente es invocada por este código de importador.
Tenemos más de 600.000 archivos adjuntos, así que me preocupa mucho cuánto tiempo tomará importarlos usando la misma llamada 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 "Error: La subida no se persistió para #{u.username} #{photo_real_filename}!"
end
¿Tienes alguna idea sobre esto, @neounix, ya que una vez ejecutaste un importador masivo grande?
Gracias al importador masivo, reducimos 26 millones de publicaciones de una semana a unas 2 horas. El punto doloroso ahora son los archivos adjuntos, que tardan varios días.
No utilicé los scripts de Discourse para mover los archivos reales.
Usamos utilidades normales de transferencia de archivos como tar, gzip, sftp, rsync, etc.
Para ser honestos, utilizamos varias partes de diferentes scripts de migración de Discourse, pero terminamos escribiendo más de la mitad de todo el código que usamos durante la migración; porque pasamos meses escribiendo código con gsub() para limpiar (y revisar) las décadas de publicaciones sobre “codificación”, revisadas por moderadores que habían publicado mucho código a lo largo de los años, y todos querían que su código fuera perfecto, sin ningún error de sintaxis.
Pensamos que los scripts proporcionados por Discourse eran un excelente punto de partida y los usamos extensivamente; además, escribimos muchos propios basados en esos scripts.
Lo siento, quizás se pasó mi pregunta. No necesitamos instrucciones sobre cómo mover archivos al entorno del servidor donde se realiza la importación. Tenemos un script de importación masiva que @Ghan está escribiendo y estamos tratando de averiguar cómo acelerar la carga de los archivos adjuntos. Cambiar del importador normal al importador masivo hizo que la importación de publicaciones pasara de una semana a unas dos horas. Esperaba que alguien pudiera orientarnos sobre cómo gestionar correctamente los archivos adjuntos.
Perdona si interpreté mal tu pregunta y mi respuesta no fue de ayuda.
De todos modos, estoy seguro de que podrás resolverlo. No es algo complicado (solo es software) y ustedes son muy inteligentes.
Mucha suerte. Perdona por no ser más de ayuda. Completamos nuestra migración en el segundo trimestre de 2020 y ese tema (la tarea de migración) ya queda muy atrás para nosotros.
No creo que exista una solución mágica similar. Dado que las cargas no dependen de que las publicaciones anteriores se hayan procesado, podrías organizar la ejecución de varios procesos (por ejemplo, cada uno con un rango de fechas diferente) para reducir el tiempo en un factor igual al número de CPUs que puedas utilizar (siempre que la base de datos y el sistema de archivos no sean el cuello de botella).
Parece que, a medida que se procesan las publicaciones para adjuntos, se generan varias tareas de Sidekiq para manejar otro tipo de procesamiento en estas publicaciones. Como resultado, incluso un solo proceso trabajando en la importación de adjuntos logra elevar gradualmente la carga promedio del servidor a más de 40, incluso con 8 núcleos. (Aumenté el número de trabajadores de Sidekiq para manejar la carga.)
Podría detener el servicio Unicorn hasta que se complete la importación, pero eso solo desplaza la carga a un momento posterior. Parece que el procesamiento debe realizarse de una forma u otra.