Ein Downgrade auf einen Commit vor dem genannten hat die feststeckenden PostAlert Sidekiq-Worker und die OOM-Bedenken tatsächlich behoben: Die wenigen PostAlert-Jobs, die jetzt in die Warteschlange gestellt werden, sind innerhalb von Sekunden statt Minuten abgeschlossen.
Hallo, ja, dies wird dieses Problem hoffentlich lösen. Ich habe diese Lösung in 3 Foren getestet, und eine neue Abfrage war immer viel schneller und hat die Server nicht überlastet.
Vielen Dank, dass Sie dieses Problem gemeldet haben, und lassen Sie mich bitte wissen, wenn Sie weiterhin Probleme haben.
Leider dauern PostAlert-Jobs auch mit diesen Änderungen noch viel länger als zuvor und blockieren die Sidekiq-Worker vollständig bei der Verarbeitung.
(wir haben über 10 Millionen Benutzerzeilen und einige standardmäßig stummgeschaltete Kategorien, sodass viele Stummschaltungen eingerichtet sind!)
Das Zurücksetzen der drei Commits, die diesen Job kürzlich berührt haben, und das Neustarten des Containers, währenddessen die Jobs problemlos abgeschlossen werden.
Ich habe gerade einen weiteren Versuch zur Verbesserung der Leistung dieses Jobs zusammengeführt:
Ich habe ihn auf einigen Instanzen getestet und er war in Ordnung, aber sie waren kleiner als Ihre.
Wenn er mit diesem Commit immer noch fehlschlägt, könnten Sie mir dann den EXPLAIN ANALYSE-Bericht zur Verfügung stellen? Skript zum Generieren:
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
Das würde mir helfen, einen fehlenden Index oder den Teil dieser Abfrage zu finden, der so langsam ist.