Nuestra sobrecarga de discurso debido a un plugin personalizado. Por favor, ayúdenme

Oh Robert,
Migramos a un nuevo vps con 4 núcleos (Ryzen 9 5950x),
El uso de la CPU sigue siendo casi del 100%. Realmente no sé qué está mal.



¿Pensaste que te ibas a mudar a un servidor Scaleway de 8 núcleos?

¿Cuál es el ancho de banda que se afirma de este servidor? Me pregunto si un ancho de banda bajo podría causar que las conexiones lentas/desconexiones se conviertan en un cuello de botella?

Scaleway tiene VPS con anchos de banda de cientos de megabits por segundo, no 30.

30 me parece extremadamente bajo.

Esta es la especificación.

4096 MB de RAM DDR3 ECC
4 vCores de CPU (3.4+ GHz E3-1231 v3/1241 v3/1240 v5)
200 GB de almacenamiento HDD Raid 10
5 TB de ancho de banda a 1 Gb/s (velocidad limitada a 5 Mb/s después de usar la asignación)
1 IPv4, /64 IPv6
Protección DDoS TCP de 20 Gb/s, mejora disponible de 200 Gb/s
Seattle, Washington, EE. UU.
Panel de control Virtualizor
No administrado

Debido al retraso, finalmente elegimos este proveedor de servicios en la nube. Hicieron la optimización de la red para los visitantes de nuestro país.

Por cierto, la salida de htop es


El 100% de uso de CPU es anormal. :fearful:
Todo está bien excepto la carga y el uso de la CPU.

¿Algo extraño en los registros de acceso?

Ahora parece que se está calmando.


Suponemos que restaurar desde una copia de seguridad causa un pico en el uso de la CPU.
De todos modos, ¡muchas gracias Robert!

2 Me gusta

¡Oh, sí, eso lo solucionaría!

Mmm, deberías apuntar a SSD

2 Me gusta

¡Buena observación, Benjamin!

Scaleway y otros tienen SSD NVMe. ¡Mucho mejor!

La CPU podría estar esperando en el disco.

1 me gusta

oh lo siento, acabo de pegar una especificación incorrecta.
La especificación es

4096 MB de RAM DDR4 ECC
4 vCores de CPU (AMD Ryzen 5950X de 3,4 GHz)
100 GB de almacenamiento SSD NVMe en RAID
Ancho de banda de 5 TB a 10 Gb/s (velocidad limitada a 5 Mb/s después de usar la asignación)
1 IPv4, /64 IPv6
Protección DDoS TCP de 20 Gb/s, mejora disponible de 200 Gb/s
Seattle, Washington, EE. UU.
Panel de control Virtualizor
No administrado

Es NVMe. :flushed:

3 Me gusta

Creo que es posible que los plugins que instalamos hayan aumentado la carga.
El plugin realizó un cambio en el modelo de usuario de tal manera que cuando vamos a la ruta de descubrimiento, siempre calculamos los puntos del modelo de usuario en el modelo de tema muchas veces

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

¿Pensaste que habías dicho que habías eliminado todos los plugins y que se comportaba igual?

¿Tiene esto un índice?

¿Cuántas filas tiene la tabla user_rewards? Es interesante que no distinga por usuario… (pero supongo que de alguna manera debe ser a un nivel inferior a este).

Oh, me temo que no establece un índice.
El modelo se muestra a continuación.

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

Desactivé todos los plugins en modo seguro. Sin embargo, como sabes, la base de datos no cambió. :smiling_face_with_tear:

Sospecho que es algo que debes discutir con el autor.

¿Parece que no está escalando para tu gran número de usuarios?

Es posible que necesites reconstruir sin el complemento. Sería una buena comparación y tal vez confirmaría si los problemas son causados por el complemento o no.

La presencia de tablas no importará si las consultas no se están ejecutando.

2 Me gusta

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

La tabla discourse_rewards_user_points es enorme.

1 me gusta

Elimínalo por completo (de la compilación, no es necesario destruir las tablas), mira qué sucede.

2 Me gusta

Gracias, lo intentaré ahora mismo.

1 me gusta

Oh Robert, reconstruyo sin el plugin, el tiempo de respuesta de las páginas de la ruta de descubrimiento se reduce a menos de 200 ms desde los 2-3 s anteriores. :fearful:

1 me gusta

Ahí lo tienes. ¿Hablarías con el autor sobre la optimización o, si tienes las habilidades, harías una solicitud de extracción (PR)?

1 me gusta

Le estoy pidiendo ayuda a nuestro amigo que está familiarizado con las bases de datos.
Pero él está trabajando en JAVA. Creo que llevará algún tiempo.

1 me gusta