ロバート様
新しい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%は異常です。
負荷とCPU使用率以外はすべて順調です。
アクセスログに何か変わったことはありますか?
ああ、それなら解決するはずです!
うーん、SSDを目指すべきだ
よく見つけたね、ベンジャミン!
Scaleway などは NVMe SSD を搭載しています。ずっと良いですね!
CPU がディスク待ちになっている可能性があります。
すみません、間違った仕様を貼り付けてしまいました。
仕様は以下の通りです。
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です。![]()
インストールしたプラグインが負荷を増加させた可能性があります。
そのプラグインはユーザーモデルにそのような変更を加えたため、ディスカバリールートにアクセスすると、トピックモデルのユーザーモデルのポイントが何度も計算されてしまいます。
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
セーフモードですべてのプラグインを無効にしましたが、データベースは変更されていません。![]()
著者と話し合うべきことだと思います。
ユーザー数が多いため、スケーリングの問題があるのではないでしょうか?
プラグインなしで再構築する必要があるかもしれません。比較になり、問題がプラグインによって引き起こされているかどうかを確認できるかもしれません。
クエリが実行されていない場合、テーブルの存在は問題になりません。
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 テーブルは巨大です。
それを完全に削除してください(ビルドからは、テーブルを破棄する必要はありません)、何が起こるか見てください。
ありがとうございます。今すぐ試してみます。
ロバート、プラグインなしで再構築したところ、ディスカバリー ルートのページの応答時間が以前の 2〜3 秒から 200 ミリ秒未満に短縮されました。![]()
それでは、以上です。著者に最適化について相談するか、スキルがあればプルリクエストを送信しますか?
データベースに詳しい友人に助けを求めていますが、彼はJAVAで作業しています。時間がかかると思います。




