カスタムプラグインによるディスコースの過負荷。助けてください

ロバート様
新しいVPS(Ryzen 9 5950x、4コア)に移行しましたが、CPU使用率が依然としてほぼ100%です。何が問題なのか本当にわかりません。



Scalewayの8コアサーバーに移行すると思っていたのですが?

このサーバーの帯域幅はどのくらいですか? 低帯域幅が接続不良/切断のボトルネックになる可能性があるのでしょうか?

Scalewayには、毎秒30メガビットではなく、毎秒数百メガビットの帯域幅を持つVPSがあります。

30は私には非常に低いように思えます。

これはスペックです。

4096MB DDR3 ECC RAM
4 CPU vCores (3.4+ GHz E3-1231 v3/1241 v3/1240 v5)
200GB Raid 10 HDD Storage
5TB bandwidth @ 1Gb/s (割り当て使用後は5Mb/sに速度制限)
1 IPv4, /64 IPv6
20Gb/s TCP DDoS Protection, 200Gb/s upgrade available
シアトル、ワシントン州、米国
Virtualizor Control Panel
マネージドなし

時間の遅延のため、最終的にこのクラウドサービスプロバイダーを選びました。彼らは私たちの国からの訪問者のためにネットワークの最適化を行いました。

ちなみに、htopの出力は次のとおりです。


CPU使用率100%は異常です。:fearful:
負荷とCPU使用率以外はすべて順調です。

アクセスログに何か変わったことはありますか?

落ち着いてきたようです。


バックアップからの復元はCPU使用率の急増を引き起こすようです。
とにかく、ロバートさん、本当にありがとうございました!

「いいね!」 2

ああ、それなら解決するはずです!

うーん、SSDを目指すべきだ

「いいね!」 2

よく見つけたね、ベンジャミン!

Scaleway などは NVMe SSD を搭載しています。ずっと良いですね!

CPU がディスク待ちになっている可能性があります。

「いいね!」 1

すみません、間違った仕様を貼り付けてしまいました。
仕様は以下の通りです。

4096MB DDR4 ECC RAM
4 CPU vCores (3.4GHz AMD Ryzen 5950X)
100GB Raid NVMe SSD ストレージ
5TB bandwidth @ 10Gb/s (割り当て使用後は5Mb/sに制限)
1 IPv4, /64 IPv6
20Gb/s TCP DDoS Protection, 200Gb/s upgrade available
シアトル、ワシントン州、米国
Virtualizor Control Panel
Unmanaged

NVMeです。:flushed:

「いいね!」 3

インストールしたプラグインが負荷を増加させた可能性があります。
そのプラグインはユーザーモデルにそのような変更を加えたため、ディスカバリールートにアクセスすると、トピックモデルのユーザーモデルのポイントが何度も計算されてしまいます。

add_to_class(:user, :total_earned_points) do
    self.user_points.sum(:reward_points)
  end

  add_to_class(:user, :available_points) do
    self.total_earned_points - self.user_rewards.sum(:points)
  end

  add_to_class(:user, :rewards) do
    DiscourseRewards::Reward.where(created_by_id: self.id)
  end

  add_to_serializer(:basic_user, :total_earned_points) do
    user&.total_earned_points
  end

  add_to_serializer(:basic_user, :available_points) do
    user&.available_points
  end

  add_to_serializer(:current_user, :total_earned_points) do
    scope.user.total_earned_points
  end

  add_to_serializer(:current_user, :available_points) do
    scope.user.available_points
  end

  add_to_serializer(:current_user, :user_rewards) do
    scope.user.user_rewards
  end

  add_to_serializer(:current_user, :rewards) do
    scope.user.rewards
  end

プラグインはすべて削除したと言っていませんでしたか?それで同じように動作するはずですよね?

これにはインデックスがありますか?

user_rewards テーブルには何行ありますか?ユーザーごとに区別されていないのが興味深いですね…(しかし、このレベル以下で何らかの方法で区別されていると仮定します)。

インデックスが設定されていません。
モデルを以下に示します。

module DiscourseRewards
  class Reward < ActiveRecord::Base
    self.table_name = 'discourse_rewards_rewards'

    has_many :user_rewards
    belongs_to :created_by, class_name: 'User'

    default_scope { where(deleted_at: nil) }
  end
end
module DiscourseRewards
  class UserPoint < ActiveRecord::Base
    self.table_name = 'discourse_rewards_user_points'

    belongs_to :user
    belongs_to :user_badge
    belongs_to :user_points_category

    def self.user_total_points(user)
      UserPoint.where(user_id: user.id).sum(:reward_points)
    end
  end
end
module DiscourseRewards
  class UserReward < ActiveRecord::Base
    self.table_name = 'discourse_rewards_user_rewards'

    belongs_to :user
    belongs_to :reward

    enum status: [:applied, :granted]
  end
end

セーフモードですべてのプラグインを無効にしましたが、データベースは変更されていません。:smiling_face_with_tear:

著者と話し合うべきことだと思います。

ユーザー数が多いため、スケーリングの問題があるのではないでしょうか?

プラグインなしで再構築する必要があるかもしれません。比較になり、問題がプラグインによって引き起こされているかどうかを確認できるかもしれません。

クエリが実行されていない場合、テーブルの存在は問題になりません。

「いいね!」 2

discourse_rewards_user_points | 233525 | 27 MB | 5152 kB | 32 MB
discourse_rewards_user_rewards | 61 | 16 kB | 16 kB | 32 kB
discourse_rewards_user_points_categories | 9 | 16 kB | 16 kB | 32 kB
discourse_rewards_rewards | 4 | 16 kB | 16 kB | 32 kB

discourse_rewards_user_points テーブルは巨大です。

「いいね!」 1

それを完全に削除してください(ビルドからは、テーブルを破棄する必要はありません)、何が起こるか見てください。

「いいね!」 2

ありがとうございます。今すぐ試してみます。

「いいね!」 1

ロバート、プラグインなしで再構築したところ、ディスカバリー ルートのページの応答時間が以前の 2〜3 秒から 200 ミリ秒未満に短縮されました。:fearful:

「いいね!」 1

それでは、以上です。著者に最適化について相談するか、スキルがあればプルリクエストを送信しますか?

「いいね!」 1

データベースに詳しい友人に助けを求めていますが、彼はJAVAで作業しています。時間がかかると思います。

「いいね!」 1