トピック数が多いカテゴリの名前を変更すると502エラーが発生する

こんにちは。
私もこちらに投稿しました:Moving posts returns 502 bad gateway - #63 by Canapin
しかし、エラーは他のコンテキストでも発生しているようです。カテゴリの名前を変更できません:

JS コンソール:

セーフモードでも同様です(カスタムテーマやプラグインは data-explorer 以外ありません)。バージョンは 2.6.0.beta2 です。
私のサーバーは Ubuntu 18 で、4 vCPU、8 GB の RAM、160 GB のディスク容量を備えています。

「いいね!」 3

エラーが発生するまでに時間がかかりますか?重いクエリのためにタイムアウトが発生していると思われます。

「いいね!」 1

20〜30 秒くらいでしょうか?また、他のカテゴリの名前を変更するときは発生しません。:thinking:

追記:開発用フォーラム(Ubuntu サブシステムを搭載したかなり強力な PC)でも発生します。

再追記:

  1. より小規模なバッチに分割して実行すると成功するようです。つまり、Discourse は 3000 件以上のトピックの移動を嫌うようです(サーバーを 16 vCPU / 32 GB にアップグレードしたにもかかわらず)。したがって、この問題はカテゴリの名前変更とは異なる問題のようです。それでもカテゴリの名前を変更できませんでした。

  2. 新しいカテゴリ B を作成し(自由に名前を変更可能)、カテゴリ A(名前を変更不可)からすべてのトピックをカテゴリ B に移動しました。すると、カテゴリ B の名前を変更できなくなり、代わりにカテゴリ A の名前を変更できるようになりました。

カテゴリの名前を変更する際、毎回投稿数の多いカテゴリを選択してみました。コンテンツの多いカテゴリ(投稿数が多い、トピックが大きい)ほど、名前を変更するのに時間がかかるようです。

名前を変更できないカテゴリが 2 つあります(確かに時間がかかりすぎているようです…):

返信のないトピックのみを含む「公開プロフィールメッセージ」は名前を変更できます。

30秒はnginxのタイムアウト設定なので、それは納得がいきます。それよりもっと時間が必要なのでしょう。
もし私なら、rails コンソールから試してみます。

この方法で行おうかと思ったのですが、安全かどうか確信が持てませんでした。Discourse でカテゴリのタイトルをリネームするだけで、なぜあんなに時間がかかるのか不思議です🤔 考えもしないようなチェックが必要なのでしょうか?

どうやらそうですね :slight_smile:
おそらく、いくつかの統計情報を再計算しているのでしょう。Postgres に接続して、以下のようなクエリを実行することで確認できます。

SELECT pid, age(query_start, clock_timestamp()), usename, query 
FROM pg_stat_activity 
WHERE query != '<IDLE>' AND query NOT ILIKE '%pg_stat_activity%' 
ORDER BY query_start desc;

これで、なぜこれほど時間がかかっているのかを確認できます。

ありがとうございます!
ただ、それは詳しくありません。Discourse がカテゴリ名を変更しようとしている間に、このクエリを実行すべきでしょうか?

はい、現在実行中のクエリが表示されますので、待機中に実行してください。30 秒ありますよ :wink:

「いいね!」 2

カテゴリ名の変更を試みてから約 10 秒後にクエリを実行したところ、以下のような結果が返ってきました:

特に異常は見えませんが?:thinking:

非常に些細なクエリ(UPDATE categories...)が表示されており、すでに13秒経過しているようです…
手動で実行するとどうなりますか?

編集:もしこれがインポートされたフォーラムであれば、バックアップを取得してから復元すると役立つかもしれません。

自宅のパソコンにある開発環境でも同じ問題が発生するため、開発用フォーラムで試してみました。

Discourse のインターフェースを通じてカテゴリ名を変更しようとしましたが、最初の投稿で示したエラーが発生し、RAM が満杯になりました:
image

あなたのクエリは以下の通りです:

Rails コンソールから更新を試みました。
以下の 2 つのコマンドを試しました:

ActiveRecord::Base.connection.execute("UPDATE categories SET name = 'General Discussion', topic_template = '', sort_order = '', default_view = '', read_only_banner = '', name_lower = 'general_discussion', updated_at = '2020-09-16 13:36:50.014192' WHERE categories.id = 21")
Category.where(id: 21).update(name: "General")

どちらも問題なく動作しました。

それは……興味深いですね…… :thinking:

更新:別の稼働中のフォーラム(データ/サーバー/OS などは異なりますが、Discourse のバージョンは同じ)でカテゴリ名を変更しようとしました。

カテゴリ名の変更は遅いです(約 10 秒)。複数回試しましたが、一度 502 エラーにも遭遇しました。

これはおそらく最近のアップデートに関連する Discourse の問題ではないでしょうか?:thinking:
両方のフォーラムは 2.6.0.beta2 を使用しています。

同じ Discourse バージョンで、数千件、あるいは数万件のトピックを持つカテゴリの名前を変更して、遅延や 502 エラーが発生するか確認できる方がいらっしゃいませんか?

「いいね!」 2

以前バージョンの Discourse では、多数のトピックを含むカテゴリの名前変更は素早く完了しましたか?

以前のフォーラム(これもインポートされたものですが)では502エラーを思い出せませんが、インポートから3年経ってカテゴリ名を変更したことはありませんでした。カテゴリ名の変更が遅かったかどうかは覚えていません。

新しい大きなフォーラムについては、私が言及しているDiscourseのバージョンでインポートされたため、古いバージョンとの比較はできません。

「いいね!」 1

これについて少し訂正します。以前、トピックを移動させたカテゴリ(または同様の操作を行ったカテゴリ)に対して Category.where(id: 21).update(name: "General") を実行したことがあったと思います。現在、さまざまなカテゴリでこのコマンドを複数回使用する必要があり、コマンドの実行時間が対象カテゴリの投稿数に比例しているように見えます。
つまり、インターフェースからカテゴリを更新した場合と同じ問題ですが、コマンドラインではタイムアウトしないという点のみ異なります。

トピックが 30,000 件を超えるカテゴリでは 1 分以上、15,000 件を超えるカテゴリでは 30 秒以上かかりましたが、トピック数の少ないカテゴリでは高速に処理されました。

「いいね!」 1

過去6ヶ月間、当フォーラムのエラー発生率が徐々に高まっていました。直近でサーバーリソースを倍増させ(16 CPU、64GB RAM)、大幅に改善されましたが、再現性のあるエラーが見つかりました。

カテゴリ名を1つ変更するだけで、毎回502エラーが発生します。

「いいね!」 2

それに応じて app.yml の設定も調整しましたか?

ログを確認して、手がかりがないか探してみてください。そのカテゴリに何か特別なことはありますか?もしかするとデータベースのインデックス破損かもしれません。

「いいね!」 2

はい!

それは単に forumwebsite.com/logs を見ることでしょうか?カテゴリの名前変更に関連する具体的なエラーは見当たりません。

Info に 多数 の項目はありますが、やはりその動作に特化したものは見当たりません。

いかなる エラーも解消すべきでしょうか?

「いいね!」 2

Webインターフェースの /admin/logs(またはそれに似た場所)を確認するか、以下のようなコマンドを実行してみてください。

tail -f /var/discourse/shared/standalone/logs/rails/production.log

これは記憶と手入力によるものなので、タブ補完を活用することをお勧めします。:slight_smile:

「いいね!」 4