Postgresは大規模データベースでCPU使用率100%、Discourse 2.7.7

こんにちは、

Docker ベースの Discourse 2.7.7 を非常に大規模なユーザー基盤で運用しています。2.4.2 から 2.7.7 へのアップグレード後、一部の Postgres プロセスが CPU 使用率 100% で停止している現象が発生しています。さらに調査したところ、以下のクエリが問題の原因となっているようです。

discourse_prod=# select pid, datid, query from pg_stat_activity WHERE pid = '244906';
  pid   |  datid  |                         query
--------+---------+-------------------------------------------------------
 244906 | 2068583 | DELETE FROM user_badges                              +
        |         |   WHERE id IN (                                      +
        |         |     SELECT ub.id                                     +
        |         |     FROM user_badges ub                              +
        |         |     LEFT JOIN (                                      +
        |         |       SELECT id user_id, current_timestamp granted_at+
        |         | FROM users                                           +
        |         | WHERE id  IN (                                       +
        |         |        SELECT p1.user_id                             +
        |         |        FROM post_custom_fields pc                    +
        |         |        JOIN badge_posts p1 ON p1.id = pc.post_id     +
        |         |        JOIN topics t1 ON p1.topic_id = t1.id         +
        |         |        WHERE p1.user_id <> t1.user_id AND            +
        |         |                     name = 'is_accepted_answer' AND  +
        |         |             p1.user_id IN (                          +
        |         |                    SELECT user_id                    +
        |         |                    FROM posts                        +
        |         |                    WHERE TRUE OR  p1.id IN (-1)      +
        |         |             )                                        +
        |         |         GROUP BY p1.user_id                          +
        |         |         HAVING COUNT(*) > 9                          +
        |         | )                                                    +
        |         |     ) q ON q.user_id = ub.user_id                    +
        |         |                                                      +
        |         |     WHERE ub.badge_id = 103 AND q.user_id IS NULL    +
        |         |   )                                                  +
        |         |
(1 row)

このクエリが巨大なオーバーヘッドを引き起こしていると思われますが、いかがでしょうか?

        |         |                    SELECT user_id                    +
        |         |                    FROM posts                        +
        |         |                    WHERE TRUE OR  p1.id IN (-1)      +

何かご提案はありますか?
追加の情報が必要であればお知らせください。

よろしくお願いいたします。
Daniel

このクエリは Jobs::BadgeGrant から来ているようです。

問題は、ユーザーバッジ内のカスタムSQLクエリが原因であることが判明しました。したがって、これは上位システムの問題ではありません。ありがとうございます。

「いいね!」 3

PostgreSQL 13 アップデートで説明されているように、VACUUM と再インデックスを実行することも必要になると思います。

「いいね!」 2

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.