在过去的约 18 小时里,我们的服务器 CPU 使用率接近 100%。
查看 Sidekiq,它正在忙于运行相同的 5 个作业:
它们一直显示为“刚刚”,并且似乎一直在重新运行这 3 个主题 ID。
我尝试重启 Discourse,但情况依然如此。
不确定这是否相关,但这发生在我们从 3.3.3 更新到 3.3.4 大约 24 小时后。我没有看到 app/jobs/regular/sync_topic_user_bookmarked.rb 有任何近期更改,也无法在 3.3.4 中发现任何可能相关的更改,但我并不熟悉代码库。
有什么线索可能是什么原因吗?
这是对此的更新。我们刚刚注意到,任务一直在重新运行的 3 个主题 ID 是我们昨天刚刚激活了自动删除回复的主题,就在这开始的时候。它们都是非常大的主题。
所以我们知道触发器,但重复的 SQL 似乎没有进行任何批处理,所以我不知道为什么它一遍又一遍地重新运行。
这是由另一个正在删除大量回复的作业触发的,并且 Jobs::SyncTopicUserBookmarked 为每个已删除的帖子执行一次?还是这是一个错误?
我们从其中一个大型主题中删除了自动删除,但似乎没有对该主题 ID 重复调用 Jobs::SyncTopicUserBookmarked 产生影响。
我将 SIDEKIQ_WORKERS 减少到 2,不久之后,队列(有很多待处理的事情)就清空了,并且没有更多的 Jobs::SyncTopicUserBookmarked 正在运行…… 
在尝试此操作之前,我注意到下面的查询同时运行了多次(使用了相同的 topic id):
SELECT bookmarks.user_id, COUNT(*)
INTO TEMP TABLE tmp_sync_topic_user_bookmarks
FROM bookmarks
LEFT JOIN posts ON posts.id = bookmarks.bookmarkable_id AND bookmarks.bookmarkable_type = 'Post'
LEFT JOIN topics ON (topics.id = bookmarks.bookmarkable_id AND bookmarks.bookmarkable_type = 'Topic') OR
(topics.id = posts.topic_id)
WHERE (topics.id = 51303 OR posts.topic_id = 51303)
AND posts.deleted_at IS NULL AND topics.deleted_at IS NULL
GROUP BY bookmarks.user_id;
UPDATE topic_users
SET bookmarked = true
FROM tmp_sync_topic_user_bookmarks
WHERE topic_users.user_id = tmp_sync_topic_user_bookmarks.user_id AND
topic_users.topic_id = 51303 AND
tmp_sync_topic_user_bookmarks.count > 0;
UPDATE topic_users
SET bookmarked = false
FROM tmp_sync_topic_user_bookmarks
WHERE topic_users.topic_id = 51303 AND
topic_users.bookmarked = true AND
topic_users.user_id NOT IN (
SELECT tmp_sync_topic_user_bookmarks.user_id
FROM tmp_sync_topic_user_bookmarks
);
DROP TABLE tmp_sync_topic_user_bookmarks;
我不清楚 PostgreSQL 如何在单个查询中运行多个语句,但如果它并发执行多次,是否会导致某种循环?