Сохранение поста в большой теме вызывает нереальные задержки загрузки

Эта тема в частности давно меня беспокоила. Я спрашивал, почему загрузка занимает от 1 до 3 минут, если она вообще происходит?

Увидев, что кто-то подтвердил эту проблему в этом сообщении, я решил разобраться: я удалил все закладки из темы, содержащей 4500 сообщений.

Она загрузилась мгновенно, как и любое другое сообщение.

Затем я задался вопросом: как ещё я могу это проверить?

  • Независимо от того, закладывал ли я в закладки первое или последнее сообщение, загрузка всё равно занимала некоторое время, хотя и не минуты, а около 10 секунд.
  • Эффект усиливался в темах с большим количеством сообщений; мне кажется, есть определённый порог около 4000 сообщений, из-за которого время загрузки становится таким медленным.
  • Я проверил это на других темах с более чем 4000 сообщений.
  • Чем больше закладок у темы, тем дольше она загружается.

Я предполагаю, что чем больше закладок у темы с большим количеством сообщений, тем дольше она загружается.


Чтобы воспроизвести: откройте тему с очень большим количеством сообщений и добавьте одно сообщение в закладки. Жаль, что для добавления сообщения в закладки в упомянутой теме требуется вход в систему, а тема с наибольшим количеством ответов на этом сайте содержит всего 925 сообщений.

Если вам потребуется дополнительная информация, спрашивайте.

4 лайка

Думаю, я уже сообщал вам об этом раньше, @martin, в другой теме.

2 лайка

Да, верно, вот этот: Topics load slow or not at all when they have many replies and user has bookmark in them. Извините, похоже, я упустил это из виду; я перемещу эту задачу в начало своего списка.

2 лайка

Это тоже достаточно серьёзно, чтобы это нужно было портировать обратно, если такая проблема существует в стабильной версии.

3 лайка

Я создал аккаунт на форуме Roblox, чтобы посмотреть What are you working on currently? (2020) - #5043 by FLYSLENDY04 - Creations Feedback - Developer Forum | Roblox, и смог воспроизвести проблему там. Без закладки тема загружается примерно за 1,3 с, а с закладкой — около 8 с. Я даже столкнулся с ошибкой 502 Bad Gateway:

Однако я создал локально тему с 5000 сообщениями и добавил закладку, и она загружается за одинаковое время независимо от того, есть ли в теме закладка или нет :man_shrugging:. Мне придётся продолжить поиск… Код, который загружает закладки пользователя в теме, находится здесь:

А код, который ищет закладку для каждого сообщения, находится здесь:

Мне это не кажется чем-то безумным или требующим больших ресурсов. user_post_bookmarks обращается к базе данных только один раз, так как результат кэшируется (memoized), поэтому здесь нет проблемы N+1. Также вот код представления темы, чтобы проверить наличие закладки на уровне темы:

Ничего подозрительного и там…

2 лайка

Может, это ошибка, которую мы уже исправили в более старой версии? :thinking:

2 лайка

Я так не думаю. Форум Roblox находится на версии Version bump to v2.6.0.beta3 · discourse/discourse@2a268bd · GitHub. С тех пор было совершено только два коммита, связанных с закладками, и оба — от меня; ни один из них не касается загрузки или сериализации закладок темы.

Должно быть, здесь играет роль какое-то другое странное совпадение, полагаю?

1 лайк

Я могу воспроизвести это на BBS

В этом запросе что-то не так, из-за чего сбойствует планировщик. Попробуйте посмотреть план выполнения и немного поэкспериментировать с ним.

Мне кажется, что очень незначительные изменения сократят время выполнения с почти 4 секунд до 1 миллисекунды.

Обращение ко всем читателям: включение MiniProfiler здесь критически важно, он поможет вам найти проблемный запрос.

5 лайков

Благодаря совету от @sam я выяснил, что проблема вызвана неоптимальным планом выполнения запроса, который формируется для этой строки:

topic.posts.with_deleted.where(post_number: 1).first

Сгенерированный SQL-запрос содержит LIMIT 1, из-за чего индекс index_posts_on_topic_id_and_post_number никогда не используется, что приводит к значительным задержкам. Мне не удалось воспроизвести эту проблему локально, так как в моей локальной базе данных практически нет записей; по сути, чем больше постов в вашем форуме Discourse в целом, тем серьезнее становится эта проблема. Исправление будет предоставлено в ближайшее время.

3 лайка

Закрываю как дубликат:

@martin, после решения вопроса вы можете написать в оригинальной теме там.

4 лайка