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.
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.
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.
(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.
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.