Le travail PostAlerter se bloque/OOM depuis peu

Depuis FEATURE: new watched_precedence_over_muted setting (#22252) · discourse/discourse@9cf981f · GitHub (vraisemblablement !) nous avons des files d’attente Sidekiq qui se remplissent/OOM avec des jobs PostAlert bloqués :

Étant donné que ce commit a déjà eu une régression similaire (FIX: error when CategoryList tried to find relevant topics by lis2 · Pull Request #22339 · discourse/discourse · GitHub), il est assez suspect - nous allons essayer de revenir à un commit antérieur à celui mentionné ci-dessus maintenant et nous ferons un retour avec les résultats.

2 « J'aime »

Descendre à 4f7f9ef87cbcd574144f657dd43b7e705d98ff8e a effectivement résolu les workers sidekiq PostAlert bloqués et les problèmes de mémoire insuffisante : les quelques tâches PostAlert qui sont mises en file d’attente se terminent maintenant en quelques secondes, pas en quelques minutes.

2 « J'aime »

Ping @kris.kotlarek

1 « J'aime »

Je viens de voir FIX: improve performance of post alerter job (#22378) · discourse/discourse@7a204e7 · GitHub être poussé - j’essaierai cela plus tard si c’est censé être une correction pour ce problème.

2 « J'aime »

Salut, oui, cela résoudra j’espère ce problème. J’ai testé cette solution sur 3 forums, et une nouvelle requête était toujours beaucoup plus rapide et ne ralentissait pas les serveurs.
Merci d’avoir signalé ce problème, et n’hésitez pas à me faire savoir si vous rencontrez toujours des difficultés.

4 « J'aime »

Malheureusement, même avec ces changements, nous constatons toujours que les tâches PostAlert prennent beaucoup plus de temps qu’auparavant et bloquent entièrement les workers Sidekiq pendant le traitement. :frowning:

(nous avons plus de 10 millions de lignes d’utilisateurs et certaines catégories sont mises en sourdine par défaut, il y a donc beaucoup de mises en sourdine configurées !)

Revenir sur les trois commits qui ont récemment touché cette tâche et redémarrer le conteneur, pendant ce temps, permet aux tâches de se terminer correctement.

3 « J'aime »

Merci, je vais jeter un autre coup d’œil

J’ai récemment fusionné une autre tentative d’amélioration des performances de ce job :

Je l’ai testé sur quelques instances et cela a fonctionné, mais elles étaient plus petites que la vôtre.

S’il échoue toujours avec ce commit, pourriez-vous me fournir le rapport EXPLAIN ANALYSE ? Script pour le générer :

topic = Topic.last
user_option_sql_fragment =
  if SiteSetting.watched_precedence_over_muted
    <<~SQL
    INTERSECT
    SELECT user_id FROM user_options WHERE user_options.watched_precedence_over_muted IS false
    SQL
  else
    <<~SQL
    EXCEPT
    SELECT user_id FROM user_options WHERE user_options.watched_precedence_over_muted IS true
    SQL
  end
user_ids_sql = <<~SQL
  (
    SELECT user_id FROM category_users WHERE category_id = #{topic.category_id.to_i} AND notification_level = #{CategoryUser.notification_levels[:muted]}
    UNION
    SELECT user_id FROM tag_users tu JOIN topic_tags tt ON tt.tag_id = tu.tag_id AND tt.topic_id = #{topic.id} WHERE tu.notification_level = #{TagUser.notification_levels[:muted]}
    EXCEPT
    SELECT user_id FROM topic_users tus WHERE tus.topic_id = #{topic.id} AND tus.notification_level = #{TopicUser.notification_levels[:watching]}
  )
  #{user_option_sql_fragment}
SQL
sql = User.where("id IN (#{user_ids_sql})").to_sql

sql_with_index = <<~SQL
EXPLAIN ANALYZE #{sql};
SQL
result = ActiveRecord::Base.connection.execute("#{sql_with_index}")
puts sql_with_index
result.each do |r|
  puts r.values
end

Cela m’aiderait à trouver un index manquant ou à identifier quelle partie de cette requête est si lente.

3 « J'aime »

Ce changement semble avoir ramené les tâches PostAlert à leur durée normale et ne plus bloquer les instances Sidekiq. Hourra !

3 « J'aime »

Ce sujet a été automatiquement fermé après 3 jours. Les nouvelles réponses ne sont plus autorisées.