Sidekiq se bloque-t-il (sur le travail BotInput ?)

Au cours de la semaine dernière, nous avons constaté que trois instances Sidekiq sur différents forums étaient bloquées. Il ne se passait rien de spécial, Sidekiq ne traitait aucun travail et affichait 5 des 5 tâches en cours de traitement.

Une chose intéressante qu’elles avaient toutes en commun était qu’il y avait une tâche critique BotInput parmi les tâches. C’est une tâche assez courante, mais elle se démarque toujours.

Après avoir redémarré Sidekiq, tout fonctionne normalement à nouveau. La mise en file d’attente manuelle d’une tâche avec les mêmes paramètres ne provoque plus de blocage. Il n’y a rien de spécial avec le message spécifique pour lequel elle a été appelée.

Quelqu’un a-t-il une idée de la façon dont nous pourrions suivre ce qui se passe ici ?

1 « J'aime »

Nous avons également eu des blocages de ce type, et notre hôte ne parvient pas à déterminer la cause.

Avez-vous une capture d’écran de ce que vous voyez dans le tableau de bord ?

Si vous le pouvez, veuillez essayer d’envoyer au processus Sidekiq le signal TTIN et fournir la trace ici.

1 « J'aime »

Désolé, il a fallu un certain temps avant que cela ne se reproduise.

sidekiq-clean.txt (35.8 Ko)

Résumé des journaux

[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] 
[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] 
[default] /usr/local/lib/ruby/3.3.0/bundled_gems.rb:74:in `require'
--
[default] Thread TID-1o0k3 Timeout stdlib thread
[default] 
[default] /usr/local/lib/ruby/3.3.0/bundled_gems.rb:74:in `require'

@tgxworld avez-vous eu la chance de regarder la trace de la pile ?

J’ai des problèmes avec Sidekiq depuis une mise à niveau du forum il y a un mois. Quelle commande utilisez-vous pour redémarrer Sidekiq ? Juste un sv restart sidekiq ?

Désolé, je n’ai pas encore eu l’occasion de regarder. J’essaierai de m’en occuper cette semaine.

1 « J'aime »

Je vois cela depuis quelques jours. Finalement, tous les travaux cessent de s’exécuter. Auparavant, je redémarrais, mais est-il prudent de supprimer la file d’attente critique ? Est-ce une file d’attente Redis ?

Je suis à jour avec la version 3.5.0.beta1-dev.

Juste une supposition, mais parfois, lorsque je discute avec le bot, il cesse de répondre, alors je rafraîchis la page ou j’abandonne. Peut-être que ces cas laissent un travail en suspens ?

1 « J'aime »

Ces travaux sont asynchrones, donc ils ne sauraient même pas que vous avez fait cela.

Il est intéressant d’apprendre que vous rencontrez ce problème également sur Jobs::BotInput. Nous constatons ce problème sur un très petit sous-ensemble de tous nos serveurs (quelques pour cent) et il semble que ce soient les instances qui utilisent le bot narratif de manière assez intensive.

Non, vous perdriez également tous les autres travaux mis en file d’attente.

Le moyen le plus simple et le plus sûr est sv reload unicorn depuis l’intérieur du conteneur.

1 « J'aime »

Ce n’est pas le cas avec notre forum. L’IA n’est visible que par le personnel et j’ai confirmé qu’aucun membre du personnel ne l’utilise.

J’ai désactivé l’IA pour le moment.

BotInput est une tâche du Discourse Narrative Bot (également appelé Discobot), pas du bot d’IA.

Ah. J’ai beaucoup utilisé l’API, en tant que nom d’utilisateur discobot.

J’ai examiné les traces de pile et tout semble indiquer un problème avec la ligne suivante :

Je ne suis pas tout à fait sûr pourquoi cette ligne causerait des problèmes, mais c’est une ligne qui n’est pas nécessaire, donc je l’ai supprimée dans

@RGJ Avez-vous par hasard défini Rails.application.config.eager_load sur false pour une raison quelconque ? :thinking:

2 « J'aime »

Découverte intéressante, merci d’avoir enquêté.
Il est difficile de savoir quand un problème aussi intermittent disparaît. J’ai supprimé cette ligne dans les trois instances qui se bloquaient le plus souvent (l’une d’elles presque quotidiennement). Je reviendrai ici :

  • lorsqu’une de ces instances se bloquera (nous saurons alors que cela n’a pas suffi)
  • vendredi si aucune d’elles ne s’est bloquée (nous pourrons alors commencer à supposer que c’était la solution)

Non, je n’ai rien touché à cela.

Mais quelqu’un l’a fait…

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

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

3 « J'aime »

@loic Te souviens-tu pourquoi nous ne chargeons pas à l’avance le répertoire lib même en production ?

1 « J'aime »

Bien que les problèmes se soient produits cette semaine, ils ne se sont pas produits sur les trois instances où nous avons supprimé cette ligne require, donc je pense que nous pouvons supposer sans risque que c’est le coupable :tada:. Merci de l’avoir repéré @tgxworld, je ne l’aurais jamais trouvé.

Serait-il possible de rétroporter ce correctif vers la version stable ?

1 « J'aime »

C’est lié à ce qui est expliqué ici (lors de notre mise à niveau vers Rails 7.1) : Upgrading Ruby on Rails — Ruby on Rails Guides

Je ne me souviens pas du problème exact, mais nous avons en fait conservé le comportement précédent, devant requérir des éléments de lib.