Sidekiq trava (na tarefa BotInput?)

Na última semana, vimos três instâncias do Sidekiq em diferentes fóruns travadas. Não havia nada de especial acontecendo, era apenas que o Sidekiq não estava processando nenhum trabalho e mostrava 5 de 5 trabalhos sendo processados.

Uma coisa interessante que todos tinham em comum era que havia um trabalho crítico BotInput entre os trabalhos. Agora, este é um trabalho bastante comum, mas ainda se destaca.

Após reiniciar o Sidekiq, tudo volta a funcionar normalmente. Enfileirar manualmente um trabalho com os mesmos parâmetros não faz com que ele trave novamente. Não há nada de especial com a postagem específica para a qual foi chamado.

Alguém tem alguma ideia de como podemos rastrear o que está acontecendo aqui?

1 curtida

Nós também estamos tendo travamentos como este, e nosso host não consegue descobrir o que está causando isso.

Você tem uma captura de tela do que está vendo no painel?

Se puder, tente enviar ao processo Sidekiq o sinal TTIN e forneça o backtrace aqui.

1 curtida

Desculpe, demorou um pouco para isso acontecer novamente.

sidekiq-clean.txt (35,8 KB)

Resumo dos logs

[default] Thread TID-1ow77
[default] /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/cli.rb:199:in `backtrace'
--
[default] Thread TID-1o1jr
[default] /var/www/discourse/lib/demon/base.rb:234:in `sleep'
--
[default] Thread TID-1o1j7
[default] /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/redis-4.8.1/lib/redis/connection/ruby.rb:57:in `wait_readable'
--
[default] Thread TID-1o1j3
[default] /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/message_bus-4.3.8/lib/message_bus/timer_thread.rb:130:in `sleep'
--
[default] Thread TID-1o1ij AR Pool Reaper
[default] /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/connection_adapters/abstract/connection_pool/reaper.rb:49:in `sleep'
--
[default] Thread TID-1o1hj
[default] <internal:thread_sync>:18:in `pop'
--
[default] Thread TID-1o1gz AR Pool Reaper
[default] /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/connection_adapters/abstract/connection_pool/reaper.rb:49:in `sleep'
--
[default] Thread TID-1o1gv
[default] /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/mini_scheduler-0.18.0/lib/mini_scheduler/manager.rb:18:in `sleep'
--
[default] Thread TID-1o1gb
[default] /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/mini_scheduler-0.18.0/lib/mini_scheduler/manager.rb:32:in `sleep'
--
[default] Thread TID-1otmb
[default] /var/www/discourse/app/models/top_topic.rb:8:in `refresh_daily!'
--
[default] Thread TID-1otkn
[default] /var/www/discourse/app/models/top_topic.rb:8:in `refresh_daily!'
--
[default] Thread TID-1otjz
[default] /var/www/discourse/app/models/top_topic.rb:8:in `refresh_daily!'
--
[default] Thread TID-1otif
[default] /var/www/discourse/app/models/top_topic.rb:8:in `refresh_daily!'
--
[default] Thread TID-1othr
[default] /var/www/discourse/app/models/top_topic.rb:8:in `refresh_daily!'
--
[default] Thread TID-1o1fb
[default] /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/mini_scheduler-0.18.0/lib/mini_scheduler.rb:80:in `sleep'
--
[default] Thread TID-1o1er
[default] /var/www/discourse/lib/mini_scheduler_long_running_job_logger.rb:87:in `sleep'
--
[default] Thread TID-1o1en heartbeat
[default] /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/launcher.rb:76:in `sleep'
--
[default] Thread TID-1o1e3 scheduler
[default] /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/connection_pool-2.5.0/lib/connection_pool/timed_stack.rb:79:in `sleep'
--
[default] Thread TID-1ot4n processor
[default] /var/www/discourse/app/models/email_log.rb:58:in `unique_email_per_post'
--
[default] Thread TID-1ot67 processor
[default] /var/www/discourse/app/models/email_log.rb:58:in `unique_email_per_post'
--
[default] Thread TID-1ot8j processor
[default] /var/www/discourse/app/models/email_log.rb:58:in `unique_email_per_post'
--
[default] Thread TID-1ot5n processor
[default] /usr/local/lib/ruby/3.3.0/bundled_gems.rb:74:in `require'
--
[default] Thread TID-1ot6b processor
[default] /var/www/discourse/lib/distributed_mutex.rb:5:in `<main>'
--
[default] Thread TID-1o0kn final-destination_resolver_thread
[default] <internal:thread_sync>:18:in `pop'
--
[default] Thread TID-1o0k3 Timeout stdlib thread
[default] <internal:thread_sync>:18:in `pop'

@tgxworld você teve a chance de olhar o backtrace?

Tenho tido problemas com o Sidekiq desde uma atualização de fórum há um mês. Qual comando você usa para reiniciar o Sidekiq? Apenas um sv restart sidekiq?

Desculpe, ainda não tive a chance de dar uma olhada. Tentarei resolver isso esta semana.

1 curtida

Tenho visto isso nos últimos dias. Eventualmente, todos os trabalhos param de rodar. Anteriormente, eu reiniciava, mas é seguro excluir a fila crítica? É uma fila do redis?

Estou atualizado em 3.5.0.beta1-dev.

Apenas um palpite, mas às vezes, quando estou conversando com o bot, ele para de responder, então eu atualizo a página ou desisto. Talvez esses casos deixem um trabalho pendente?

1 curtida

Esses trabalhos são assíncronos, então eles nem saberiam que você fez isso.

É interessante saber que você está tendo isso também em Jobs::BotInput. Estamos vendo esse problema em apenas um pequeno subconjunto de todos os nossos servidores (alguns por cento) e parece ser nas instâncias que usam o bot narrativo com bastante intensidade.

Não, você perderia todos os outros trabalhos enfileirados também.

A maneira mais fácil e segura é sv reload unicorn de dentro do contêiner.

1 curtida

Não é o caso do nosso fórum. A IA é visível apenas para a equipe e confirmei que nenhum membro da equipe a está usando.

Desativei a IA por enquanto.

BotInput é uma tarefa do Discourse Narrative Bot (também conhecido como Discobot), não do bot de IA.

Ah. Tenho usado a API intensamente, como o nome de usuário discobot.

Eu dei uma olhada nos backtraces e tudo aponta para algum problema com a seguinte linha:

Não tenho certeza por que essa linha causaria problemas, mas é uma linha que não é necessária, então eu a removi em

@RGJ Você por acaso tem Rails.application.config.eager_load definido como desativado por algum motivo? :thinking:

2 curtidas

Achado interessante, obrigado por investigar.
É difícil dizer quando um problema intermitente como esse desaparece. Removi essa linha nas três instâncias que travaram com mais frequência (uma delas quase diariamente). Voltarei aqui:

  • quando uma dessas instâncias travar (então saberemos que isso não resolveu)
  • na sexta-feira se nenhuma delas travar (então poderemos começar a supor que foi a solução)

Não, não mexi nisso.

Mas alguém mexeu…

Rails.autoloaders.main.do_not_eager_load(config.root.join("lib"))

em Blaming discourse/config/application.rb at main · discourse/discourse · GitHub

3 curtidas

@loic Você se lembra por que não fazemos o carregamento antecipado do diretório lib mesmo em produção?

1 curtida

Embora os problemas tenham ocorrido esta semana, eles não aconteceram nas três instâncias onde removemos essa linha require, então acho que podemos assumir com segurança que este é o culpado :tada:. Obrigado por identificar isso @tgxworld, eu nunca teria encontrado isso.

Você seria capaz de fazer o backport dessa correção para a versão estável?

1 curtida

Está relacionado ao que é explicado aqui (quando atualizamos para o Rails 7.1): Upgrading Ruby on Rails — Ruby on Rails Guides

Não me lembro do problema exato, mas na verdade mantivemos o comportamento anterior, tendo que incluir coisas de lib.