Мы временно исправили проблему с помощью патча, перенаправив все маршруты */private-messages-all/* на */private-messages/*. В результате раздел «Все ящики» теперь содержит то же самое, что и «Личные сообщения», но хотя бы нам больше не приходится постоянно сталкиваться с 100% загрузкой процессора.
Код патча:
# name: discourse-private-messages-perf-hotfix
# version: 0.0.1
# authors:
# Prepend to override existing routes
Discourse::Application.routes.prepend do
scope path: nil, constraints: { format: /(json|html|\*\/\*)/ } do
scope "/topics", username: RouteFormat.username do
# Reroute all */private-messages-all/* routes to go to */private-messages/* instead (personal messages)
# Former is expensive, latter is cheap, potentially saves significant database CPU usage
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
Загрузка процессора базы данных нашего форума после развертывания вышеуказанного патча:
@tgxworld Тебе стоит ещё раз посмотреть, что именно делают маршруты */private-messages-all/*. Очевидно, что в их реализации есть проблема: она недостаточно эффективна для крупных баз данных форумов. Либо в реализации не используются правильные индексы базы данных, либо генерация запросов приводит к крайне затратным запросам (особенно в PSQL 10, не уверен насчёт версий 12/13?).
Текущая реализация фактически парализовала наш форум, увеличив загрузку процессора с ~15% до постоянных 100% и вызвав замедление работы всех остальных функций форума. Я не вижу причин, по которым запросы для личных/групповых ящиков выполняются за <50 мс, а запросы для «всех ящиков» занимают более 20 минут.
Ты можешь использовать дамп анализа, который @forkythetoy опубликовал чуть выше, чтобы увидеть выполнение запроса длительностью более 20 минут.