Abfrage verursacht 400% CPU Load

Wir haben in letzter Zeit eine CPU-Überlastung.
Wir konnten sie auf eine Abfrage eingrenzen, die stundenlang gleichzeitig läuft (siehe unten).
Die laufende Aufgabe ist postmaster - sobald alle beendet sind, reduziert sich die CPU, bis sie alle fünf Minuten neu aufgebaut wird.

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’

Kann jemand helfen oder eine Lösung vorschlagen?

Weitere Informationen:

  • läuft 3.2.0.beta4-dev, aber das passiert schon seit mindestens ein paar Monaten
  • Hier ist eine Liste der Plugins, die wir installiert haben:

Danke!

2 „Gefällt mir“

@andrei hat kürzlich an der Optimierung von Chat-Abfragen gearbeitet. Tritt dies nach dem Update auf die neueste Version immer noch auf?

4 „Gefällt mir“

Ich habe an einer anderen ähnlichen Abfrage gearbeitet und diese Korrektur war lokal für diese Abfrage, daher wird sie hier wahrscheinlich nicht helfen. Trotzdem lohnt es sich, auf die neueste Version zu aktualisieren, es kann andere Optimierungen geben.

2 „Gefällt mir“

Wir sind auf dem neuesten Stand.\n\nIch vermute, es war ein Chat-Problem mit der Abfrage. Können wir etwas an den Einstellungen ändern, um es zu beheben?

1 „Gefällt mir“

Ein Kunde hat @all-Erwähnungen im Chat aktiviert, mit zwei Kanälen mit jeweils 16.000 Benutzern. Das hat Spaß gemacht!
Nach 19 Erwähnungen an alle haben sie es schnell wieder deaktiviert. 12 Stunden später hatte ihr (leistungsstarkes) System immer noch eine hohe CPU-Auslastung.

Das Problem wurde durch das Löschen der 320.000 problematischen Einträge aus der Erwähnungstabelle behoben.

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

Aber wir waren immer noch verwundert, warum dies so viele Probleme verursachte.
Es gab eine Reihe von Instanzen von dieser Abfrage, die immer noch liefen.

Da die Zeilen bereits weg waren, lieferte eine Erklärung keine guten Ergebnisse, aber es ist klar, dass sie schwere Arbeit leistete. Alle Indizes sind vorhanden.

1 „Gefällt mir“

Ich glaube, jemand hat gestern auch erwähnt, dass die Abfrage intensiv war:

2 „Gefällt mir“

Danke – ich sollte lernen, wie ich dieses Forum effektiver durchsuchen kann.

1 „Gefällt mir“

Das hat uns nicht geholfen.

Wir haben auch erlebt, dass Chatnachrichten für einige Minuten verschwanden, bevor sie wieder auftauchten.

Generell denke ich, dass der Chat viel Verbesserungspotenzial hat, obwohl mir die Richtung, in die er sich entwickelt, sehr gut gefällt. Meine Hauptsorge ist, wie ein Chat im Grunde eine Überlastung verursachen kann, die nicht aufhört. Wir haben die Möglichkeit, Erwähnungen zu machen, deaktiviert, und das hat auch nicht funktioniert.

Gibt es eine Möglichkeit, die von mir erwähnte Abfrage zu stoppen, damit sie nicht wieder auftaucht? @andrei @JammyDodger

Vielen Dank im Voraus.

Hallo @sok777, danke für deine Nachfrage – wir haben ein paar Ingenieure, die sich damit beschäftigen, und wir melden uns hier bei dir, sobald wir ein Update für dich haben. Wir danken dir in der Zwischenzeit für deine Geduld!

2 „Gefällt mir“

Ein Trick, der gut funktioniert, ist Admin - Anpassen - Beobachtete Wörter und fügen Sie beide Erwähnungen zur Liste “Zensieren” hinzu.

Also „alle“ und „hier“ mit dem Präfix @?

Danke!

1 „Gefällt mir“

Großartig. Danke!

1 „Gefällt mir“

Ein kurzes Update @lindsey @RGJ

Wir hatten eine Nachricht mit @all, die wir gelöscht haben. Dies hat das Problem jedoch nicht gelöst. Die Abfrage kommt alle 5 Minuten zurück und dauert ewig, sodass eine Warteschlange vieler anderer Abfragen entsteht.
Als wir den Chat deaktivierten, sank die CPU-Auslastung auf 15 %. Verrückt.

Sie müssen in die Datenbank gehen und die Erwähnungsdatensätze entfernen

psql : delete from chat_mentions where chat_message_id = X
wobei X die ID der Nachricht ist, die Sie entfernt haben.

Eine allgemeinere Abfrage wird in meiner Nachricht hier beschrieben. Passen Sie die Zahl nach Belieben an.

1 „Gefällt mir“

Ja, das haben wir bereits versucht.

Zu Referenzzwecken sind hier unsere Statistiken:

users: 239251
chat_channels: 2864
chat_drafts: 205
chat_mentions: 155527 ->7500~
chat_messages: 390453
chat_threads: 25131
chat_message_reactions: 5993
user_chat_channel_memberships: 158480

1 „Gefällt mir“

Der einzige Grund, warum diese Abfrage lange dauern kann, ist die große Anzahl von Einträgen in der Tabelle chat_mentions. Haben Sie die generische Abfrage ausprobiert, die ich gepostet habe? Vielleicht ist es nicht @all, sondern eine andere große Gruppe, die erwähnt wird.

Die problematische Abfrage sucht nach allen Erwähnungen aus Chats der letzten 7 Tage.

Sie sollten auch alle vorhandenen Instanzen der Abfrage beenden.

Ja, wir haben sie getötet, aber sie kommen immer wieder zurück.
Wir haben alle Erwähnungen über 100 überprüft und keine gefunden. Ich bin mir nicht sicher, warum es sonst passieren würde.
Für mich klingt das nach einem grundlegenden Problem mit der Abfrage, aber ich könnte mich auch irren.

1 „Gefällt mir“

Diese Abfrage ist wahrscheinlich auch bei einer geringen Anzahl von Erwähnungen langsam. Ich werde daran arbeiten, sie zu beheben.

2 „Gefällt mir“

Großartig. Gerne unterstütze ich Sie weiterhin aus unserem Anwendungsfall heraus!

2 „Gefällt mir“

@sok777 Ich bräuchte ein wenig Hilfe von Ihnen. Ich möchte mir den Abfrageplan ansehen, den Postgres auf Ihrer Website verwendet. Könnten Sie das bitte auf Ihrer Datenbank ausführen und die Ergebnisse teilen:

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 „Gefällt mir“