Problema: Processamento do Sidekiq extremamente lento após grandes importações em instância Multisite

Estamos executando vários sites do Discourse com multisite sob um único aplicativo. Recentemente, fizemos um lote de grandes importações de usuários (centenas de milhares de usuários em 6 sites). Após as importações, o Sidekiq está processando trabalhos em segundo plano muito lentamente. O painel do Sidekiq mostra uma enorme fila de espera, e os trabalhos estão sendo liberados a uma taxa muito mais lenta do que o esperado.

Detalhes do ambiente:

  • A VM foi atualizada para 16 CPUs / 16 GB de RAM.
  • No entanto, na interface do Sidekiq, vemos apenas 5 threads e parece que apenas uma pequena parte dos recursos está sendo utilizada.
  • A fila de importação principal (“nursingjobs” como pai multisite) está lidando com trabalhos de todos os sites filhos, mas a taxa de transferência de trabalhos é muito baixa.
  • Métricas do servidor: CPU às vezes em 80-90%, memória em torno de 6,7/7,2 GB.

Estamos buscando:

  • Acelerar o processamento de trabalhos em segundo plano/Sidekiq para limpar grandes filas de espera pós-importação.
  • Garantir que o Discourse esteja utilizando todos os recursos disponíveis (CPU/RAM).
  • Entender se existem limites de threads/processos que precisam ser ajustados.

Perguntas:

  1. Qual é a melhor maneira de configurar o Sidekiq/Discourse para alta taxa de transferência pós-importação?
  2. Quais são as configurações recomendadas para UNICORN_SIDEKIQS e DISCOURSE_SIDEKIQ_WORKERS em sistemas grandes com múltiplos núcleos?
  3. Existem configurações do Postgres ou outras configurações do app.yml que devemos ajustar para evitar erros de pool de banco de dados ao aumentar a concorrência do Sidekiq?
  4. Alguma prática recomendada para limpar grandes filas de espera do Sidekiq rapidamente e com segurança após as importações?

Estatísticas/capturas de tela do Sidekiq disponíveis, se úteis!

A resposta para todas essas perguntas é, mais ou menos, aumentar DISCOURSE_SIDEKIQ_WORKERS.

Eu sugeriria aumentar isso para talvez 32, já que você sabe que tem bastante CPU sobrando. Se ainda sobrar bastante CPU depois que isso estiver rodando por um tempo, sinta-se à vontade para aumentar mais.

Você provavelmente pode reduzir isso para, digamos, 8 ou 12 para operação normal.

Certifique-se de que você tem conexões max_connections suficientes para o Postgres. Você provavelmente já aumentou isso, já que está executando multisite, mas fique de olho nisso.

2 curtidas

Obrigado @supermathie, está funcionando agora.
Atualizei a configuração para o abaixo

  UNICORN_WORKERS: 8
  UNICORN_SIDEKIQS: 7
  DISCOURSE_SIDEKIQ_WORKERS: 10
  DISCOURSE_DB_POOL: 20

E aumentei a CPU para

8vCPU
16GB de Memória
1 curtida