Query causando 400% CPU Load

Hemos estado experimentando sobrecarga de CPU recientemente.
Hemos logrado identificarla en una consulta que se ejecuta continuamente durante horas (ver abajo).
La tarea en ejecución es postmaster; una vez que todas se eliminan, la CPU se reduce hasta que se reconstruye cada cinco minutos.

SELECT “users”.“id”, ARRAY_AGG(ARRAY [uccm.id, c_msg.id]) AS memberships_with_unread_messages
FROM “users”
         INNER JOIN “user_options” ON “user_options”.“user_id” = “users”.“id”
         INNER JOIN user_chat_channel_memberships uccm ON uccm.user_id = users.id
         INNER JOIN chat_channels cc ON cc.id = uccm.chat_channel_id
         INNER JOIN chat_messages c_msg ON c_msg.chat_channel_id = uccm.chat_channel_id
         LEFT OUTER JOIN chat_mentions c_mentions ON c_mentions.chat_message_id = c_msg.id
WHERE “user_options”.“chat_enabled” = TRUE
  AND “user_options”.“chat_email_frequency” = 1
  AND (users.last_seen_at < ‘2023 - 11 - 15 09:54:26.931723’)
  AND (c_msg.deleted_at IS NULL AND c_msg.user_id <> users.id)
  AND (c_msg.created_at > ‘2023 - 11 - 08 10:09:26.931848’)
  AND ((uccm.last_read_message_id IS NULL OR c_msg.id > uccm.last_read_message_id) AND
       (uccm.last_unread_mention_when_emailed_id IS NULL OR c_msg.id > uccm.last_unread_mention_when_emailed_id) AND
       (uccm.user_id = c_mentions.user_id AND uccm.following IS true AND
        cc.chatable_type = ‘Category’

¿Alguien puede ayudar o sugerir una solución?

Más información:

  • ejecutando 3.2.0.beta4-dev, pero esto ha estado sucediendo durante al menos unos meses
  • Aquí hay una lista de plugins que tenemos instalados:

¡Gracias!

2 Me gusta

@andrei trabajó recientemente en la optimización de las consultas de chat, ¿sigue ocurriendo esto después de actualizar a la última versión?

4 Me gusta

Trabajé en otra consulta similar y esa corrección fue local para esa consulta, por lo que probablemente no ayudará aquí. Aún así, vale la pena actualizar a la última versión, puede haber otras optimizaciones.

2 Me gusta

Estamos en la última versión, de hecho.

Creo que fue un problema de chat con la consulta. ¿Hay algo que podamos ajustar en la configuración para solucionarlo?

1 me gusta

Tuvimos un cliente que activó las menciones a @all en el chat, con dos canales de 16k usuarios. ¡Eso fue divertido!
Después de 19 menciones a todos, rápidamente lo desactivaron de nuevo. 12 horas después, su (potente) sistema todavía tenía una alta carga de CPU.

El problema se resolvió al eliminar los 320k registros infractores de la tabla de menciones

delete from chat_mentions
where chat_message_id in (
  (select chat_message_id
   from chat_mentions
   group by chat_message_id having count(*) > 100)
);

pero todavía nos preguntábamos por qué esto estaba causando tantos problemas.
Todavía se estaban ejecutando varias instancias de esta consulta.

Como las filas ya no estaban, un explain no arrojó buenos resultados, pero está claro que estaba haciendo un trabajo pesado. Todos los índices están en su lugar.

1 me gusta

Creo que alguien mencionó que la consulta también fue intensiva ayer:

2 Me gusta

Gracias, debería aprender a buscar en este foro de manera más efectiva.

1 me gusta

Eso no lo resolvió para nosotros.

También hemos visto que los mensajes de chat desaparecen durante unos minutos antes de volver a aparecer.

En general, creo que hay mucho que mejorar en el chat, aunque me gusta totalmente la dirección que está tomando. Mi principal preocupación es cómo un chat puede causar esencialmente una sobrecarga que no se detiene. Desactivamos la capacidad de mencionar y eso tampoco funcionó.

¿Hay alguna forma de evitar que vuelva la consulta que mencioné? @andrei @JammyDodger

Gracias de antemano.

Hola @sok777 , gracias por dar seguimiento. Tenemos a varios ingenieros investigando esto y nos pondremos en contacto contigo aquí una vez que tengamos una actualización. ¡Agradecemos tu paciencia mientras tanto!

2 Me gusta

Un truco que funciona bien es Administrador - Personalizar - Palabras vigiladas y añadir ambas menciones a la lista de “Censurar”.

¿‘all’ y ‘here’ con un prefijo de @?

¡Gracias!

1 me gusta

¡Genial! ¡Gracias!

1 me gusta

Una actualización rápida @lindsey @RGJ

Tuvimos un mensaje con @all que eliminamos. Sin embargo, esto no ha resuelto el problema. La consulta sigue volviendo cada 5 minutos y está tardando una eternidad, hasta el punto de que hay una cola de muchas otras consultas.
Una vez que deshabilitamos el chat, la carga de la CPU bajó al 15%. Una locura.

Necesitas ir a la base de datos y eliminar los registros de menciones

psql: delete from chat_mentions where chat_message_id = X
donde X es el ID del mensaje que eliminaste.

Una consulta más genérica se describe en mi mensaje aquí, ajusta el número como consideres oportuno.

1 me gusta

Sí, ya intentamos esto.

Como referencia, estas son nuestras estadísticas:

usuarios: 239251
canales_chat: 2864
borradores_chat: 205
menciones_chat: 155527 ->7500~
mensajes_chat: 390453
hilos_chat: 25131
reacciones_mensaje_chat: 5993
miembros_canal_chat_usuario: 158480

1 me gusta

La única razón por la que esa consulta puede tardar es por las muchas entradas en la tabla chat_mentions. ¿Has probado la consulta genérica que publiqué? Quizás no sea @all, sino otro grupo grande el que se menciona.

La consulta problemática escanea todas las menciones de chats en los últimos 7 días.

También deberías detener todas las instancias existentes de la consulta.

Sí, los matamos pero siguen volviendo.
Revisamos todas las menciones por encima de 100 y no teníamos ninguna. No estoy seguro de por qué más podría suceder.
Me parece que hay un problema fundamental con la consulta, pero podría estar equivocado.

1 me gusta

Es probable que esta consulta sea lenta incluso con una pequeña cantidad de menciones. Trabajaré en solucionarla.

2 Me gusta

Genial. ¡Encantado de seguir apoyando desde nuestro caso de uso!

2 Me gusta

@sok777 Necesitaré un poco de tu ayuda con esto. Me gustaría ver el plan de consulta que utiliza Postgres en tu sitio. ¿Podrías ejecutar esto en tu base de datos y compartir los resultados:

EXPLAIN VERBOSE SELECT "users"."id", ARRAY_AGG(ARRAY [uccm.id, c_msg.id]) AS memberships_with_unread_messages
FROM "users"
         INNER JOIN "user_options" ON "user_options"."user_id" = "users"."id"
         INNER JOIN "group_users" ON "group_users"."user_id" = "users"."id"
         INNER JOIN "groups" ON "groups"."id" = "group_users"."group_id"
         INNER JOIN user_chat_channel_memberships uccm ON uccm.user_id = users.id
         INNER JOIN chat_channels cc ON cc.id = uccm.chat_channel_id
         INNER JOIN chat_messages c_msg ON c_msg.chat_channel_id = uccm.chat_channel_id
         LEFT OUTER JOIN chat_mentions c_mentions ON c_mentions.chat_message_id = c_msg.id
WHERE "user_options"."chat_enabled" = TRUE
  AND "user_options"."chat_email_frequency" = 1
  AND (users.last_seen_at < '2023-11-27 08:00:00.0000000')
  AND (c_msg.deleted_at IS NULL AND c_msg.user_id <> users.id)
  AND (c_msg.created_at > '2023-11-20 08:00:00.0000000')
  AND ((uccm.last_read_message_id IS NULL OR c_msg.id > uccm.last_read_message_id) AND
       (uccm.last_unread_mention_when_emailed_id IS NULL OR c_msg.id > uccm.last_unread_mention_when_emailed_id) AND
       (
               (uccm.user_id = c_mentions.user_id AND uccm.following IS true AND cc.chatable_type = 'Category') OR
               (cc.chatable_type = 'DirectMessage')
           )
    )
GROUP BY users.id, uccm.user_id
ORDER BY "users"."id" ASC
LIMIT 1000;
1 me gusta