Estou trabalhando em uma importação para o Discourse usando um importador em massa. Isso funciona muito bem para tópicos e posts, mas no momento a parte lenta são os arquivos. Temos cerca de 50.000 usuários com avatares e, embora os dados dos usuários sejam importados para o banco de dados em apenas alguns segundos, os avatares estão levando horas para serem importados. O sistema está processando apenas cerca de um upload por segundo.
Existe alguma maneira de acelerar isso? Não tenho certeza de qual parte desse processo é a mais lenta. Se nenhum arquivo de avatar for encontrado (photo_filename não existia), a execução é muito rápida, mas estou ficando um pouco perdido tentando investigar a classe UploadCreator, que é finalmente invocada por esse código de importador.
Temos mais de 600.000 anexos, então estou muito preocupado com o tempo que levará para importá-los usando a mesma chamada 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 "Erro: Upload não persistiu para #{u.username} #{photo_real_filename}!"
end
Alguma ideia sobre isso, @neounix, já que você já rodou um importador em massa grande uma vez?
Graças ao importador em massa, reduzimos 26 milhões de postagens de uma semana para cerca de 2 horas. O problema agora são os anexos, que estão levando vários dias.
Não usamos os scripts do Discourse para mover os arquivos em si.
Utilizamos utilitários normais de transferência de arquivos, como tar, gzip, sftp, rsync etc.
Para ser sincero, usamos várias partes de diferentes scripts de migração do Discourse, mas acabamos escrevendo mais da metade de todo o código que utilizamos durante a migração; porque passamos meses escrevendo código com gsub() para limpar (e revisar) as décadas de posts sobre “codificação”, revisados por moderadores que postaram muito código ao longo dos anos, e todos queriam que seu código estivesse perfeito, sem nenhum erro de sintaxe!
Achamos que os scripts fornecidos pelo Discourse eram um ótimo ponto de partida e os usamos extensivamente; também escrevemos muitos dos nossos próprios com base nesses scripts.
Desculpe, talvez minha pergunta tenha passado despercebida. Não precisamos de instruções sobre como mover arquivos para o ambiente do servidor onde a importação está ocorrendo. Temos um script de importação em massa que o @Ghan está desenvolvendo e estamos tentando descobrir como acelerar o envio de anexos. A troca do importador normal para um importador em massa fez com que a importação de posts passasse de uma semana para cerca de duas horas. Eu esperava que alguém pudesse indicar o caminho certo sobre como lidar corretamente com os anexos.
Desculpe se interpretei mal sua pergunta e minha resposta não foi útil.
De qualquer forma, tenho certeza de que você consegue resolver. Não é nada complicado (é apenas software) e vocês são inteligentes.
Boa sorte. Peço desculpas por não ser mais útil. Concluímos nossa migração no 2º trimestre de 2020, e essa tarefa (a migração) já está bem atrás de nós.
Não acho que exista uma solução mágica semelhante. Como os uploads não dependem de que as postagens anteriores tenham sido processadas, você pode configurar a execução de vários processos (por exemplo, cada um lidando com um intervalo de datas diferente) para reduzir o tempo em um fator igual ao número de CPUs que você pode utilizar (desde que o banco de dados e o sistema de arquivos não sejam o gargalo).
Parece que, à medida que as postagens são processadas para anexos, vários jobs do Sidekiq são iniciados para lidar com algum outro processamento nessas postagens. Como resultado, mesmo um único processo trabalhando na importação de anexos consegue lentamente levar o servidor a uma média de carga superior a 40, mesmo com 8 núcleos. (Aumentei o número de workers do Sidekiq para lidar com a carga.)
Talvez eu possa parar o serviço do Unicorn até que a importação seja concluída, mas isso apenas está transferindo a carga para um momento posterior. Parece que o processamento precisa ser feito de uma forma ou de outra.