지난 약 18시간 동안 서버가 CPU 사용률 100%에 근접하고 있습니다.
Sidekiq를 살펴보니 동일한 5개의 잡이 계속 실행되고 있습니다:
항상 “Just now” 상태로 표시되며, 동일한 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가 더 이상 실행되지 않는 것을 확인했습니다… 
이것을 시도하기 전에, 동일한 토픽 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이 단일 쿼리 내에서 여러 문장을 어떻게 실행하는지 명확하지 않지만, 이것이 동시에 여러 번 실행될 경우 루프를 유발할 수 있을까요?