Wir haben das Problem vorübergehend durch einen Monkey-Patch behoben, indem wir alle */private-messages-all/*-Routen auf */private-messages/* umgeleitet haben. Das Ergebnis ist, dass „Alle Postfächer" denselben Inhalt wie „Persönlich" anzeigt, aber wir müssen uns zumindest nicht ständig mit 100 % CPU-Auslastung auseinandersetzen.
Monkey-Patch-Code:
# name: discourse-private-messages-perf-hotfix
# version: 0.0.1
# authors:
# Voranstellen, um bestehende Routen zu überschreiben
Discourse::Application.routes.prepend do
scope path: nil, constraints: { format: /(json|html|\*\/\*)/ } do
scope "/topics", username: RouteFormat.username do
# Alle */private-messages-all/*-Routen stattdessen auf */private-messages/* umleiten (persönliche Nachrichten)
# Ersteres ist teuer, letzteres ist günstig; potenziell erhebliche Einsparungen der Datenbank-CPU-Auslastung
get "private-messages-all/:username" => "list#private_messages", as: "topics_private_messages_override", defaults: { format: :json }
get "private-messages-all-sent/:username" => "list#private_messages_sent", as: "topics_private_messages_sent_override", defaults: { format: :json }
get "private-messages-all-new/:username" => "list#private_messages_new", as: "topics_private_messages_new_override", defaults: { format: :json }
get "private-messages-all-unread/:username" => "list#private_messages_unread", as: "topics_private_messages_unread_override", defaults: { format: :json }
get "private-messages-all-archive/:username" => "list#private_messages_archive", as: "topics_private_messages_archive_override", defaults: { format: :json }
end
end
end
CPU-Auslastung unserer Forendatenbank nach dem Bereitstellen des oben genannten Monkey-Patches:
@tgxworld Du solltest dir noch einmal ansehen, was genau die */private-messages-all/*-Routen tun. Offensichtlich liegt ein Fehler in der Implementierung vor; sie ist für große Forendatenbanken nicht effizient genug. Entweder wird nicht der richtige Datenbankindex verwendet, oder die Abfragegenerierung führt zu extrem teuren Abfragen (insbesondere bei PSQL 10, bei 12/13 bin ich mir nicht sicher).
Die aktuelle Implementierung hat unser Forum praktisch lahmgelegt: Die CPU-Auslastung stieg von ca. 15 % auf konstant 100 %, was zu langsamer Leistung bei allen anderen Forenfunktionen führte. Ich sehe keinen Grund, warum Abfragen für Persönliche/Gruppen-Postfächer unter 50 ms dauern, während die für „Alle Postfächer" über 20 Minuten benötigen.
Du kannst den von @forkythetoy weiter oben geposteten Analyze-Dump verwenden, um den vorherigen Lauf von über 20 Minuten zu sehen.