خلال الـ 18 ساعة الماضية تقريبًا، يستخدم خادمنا ما يقرب من 100٪ من وحدة المعالجة المركزية.
بالنظر إلى Sidekiq، فهو مشغول بتشغيل نفس 5 مهام:
إنها دائمًا في “الآن” ويبدو أنها تعيد التشغيل دائمًا على نفس معرفات المواضيع الثلاثة.
حاولت إعادة تشغيل Discourse، لكن الوضع ظل كما هو.
لست متأكدًا مما إذا كان الأمر متعلقًا، ولكن هذا بدأ بعد حوالي 24 ساعة من التحديث من 3.3.3 إلى 3.3.4. لا أرى أي تغييرات حديثة على app/jobs/regular/sync_topic_user_bookmarked.rb ولم أتمكن من اكتشاف أي تغيير في 3.3.4 قد يكون ذا صلة، ولكني لا أعرف قاعدة الكود.
أي فكرة عما قد يحدث؟
تحديث لهذا. لاحظنا للتو أن معرفات المواضيع الثلاثة التي تستمر المهام في إعادة تشغيلها هي مواضيع قمنا بتفعيل الحذف التلقائي للردود عليها بالأمس، بالقرب من وقت بدء ذلك. كلها مواضيع كبيرة جدًا.
لذا نحن نعرف المحفز، ولكن استعلام SQL الذي يتم تكراره لا يبدو أنه يقوم بأي تجميع، لذلك لا أفهم لماذا يتم إعادة تشغيله مرارًا وتكرارًا.
هل يتم تشغيل هذا بواسطة وظيفة أخرى لا تزال تحذف العدد الكبير من الردود ويتم تنفيذ Jobs::SyncTopicUserBookmarked لكل منشور محذوف؟ أم أن هذه مشكلة؟
لقد أزلنا الحذف التلقائي من أحد المواضيع الكبيرة ولم يكن له تأثير على المكالمات المتكررة لـ Jobs::SyncTopicUserBookmarked على معرف الموضوع هذا.
لقد قللت SIDEKIQ_WORKERS إلى 2، وبعد فترة وجيزة، تم مسح قائمة الانتظار (مع العديد من الأشياء المعلقة) ولم يعد هناك أي Jobs::SyncTopicUserBookmarked قيد التشغيل… 
قبل تجربة ذلك، لاحظت أن الاستعلام أدناه كان يعمل عدة مرات في وقت واحد (باستخدام نفس معرف الموضوع):
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 لعدة استعلامات في استعلام واحد، ولكن إذا تم تنفيذه عدة مرات بشكل متزامن، فهل يمكن أن يسبب حلقة؟