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:
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.
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?
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.
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
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!
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.
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.
@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;