Лучшие настройки для ускорения работы автономного Discourse

Наш сайт на Discourse насчитывает более 10 тысяч пользователей и около 700 активных пользователей в день. Пользователи отправляют в среднем 10 тысяч сообщений в день. Наше сообщество генерирует более 160 тысяч просмотров страниц в день, включая поисковых роботов и анонимных пользователей. Почти все наши пользователи подключаются к нам через мобильные устройства.

Мы запускали сообщество в режиме автономной установки на одном VPS с 16 ядрами CPU и 24 ГБ оперативной памяти, настроив файл app.yml со следующими значениями:

params:
  db_shared_buffers: "6GB"
  db_work_mem: "50MB"
env:
  UNICORN_WORKERS: 16

Мы используем следующие плагины:

docker_manager
discourse-solved
discourse-adplugin
discourse-voting
discourse-push-notifications
discourse-whos-online
discourse-akismet
discourse-data-explorer
discourse-sitemap
discourse-telegram-notifications

При такой конфигурации некоторые пользователи сообщают о медленной загрузке сайта, а иногда при отправке сообщения экран становится пустым (шапка при этом отображается). Кроме того, в часы пик производительность сайта иногда снижается.

Пожалуйста, объясните, допустили ли мы ошибку в конфигурации или нам нужно больше ресурсов.
Большое спасибо :pray:

10 тысяч постов в день — это довольно много по сравнению с количеством просмотров страниц. Учитывая вашу конфигурацию, я могу представить, что вы упираетесь в ограничения ресурсов, и, скорее всего, проблема в базе данных. Вы можете попробовать перейти к настройке с несколькими контейнерами, фактически разгрузив воркеров Unicorn с основного сервера.

Согласно вашему ответу, увеличение ресурсов в данной конфигурации не поможет решить нашу проблему? Например, 24 ядра CPU с 32 ГБ оперативной памяти.

Это вполне возможно, но я бы сначала попробовал масштабировать горизонтально всё, что поддаётся такому масштабированию. Это также даст вам гораздо более чёткое представление о том, где находится «узкое место».

Большинство проблем с производительностью можно решить, просто добавив больше ресурсов. Сложность заключается в том, чтобы делать это разумно, чтобы сэкономить деньги (или, возможно, значительную сумму).

Спасибо за ваши экспертные знания и дружелюбные советы. Я обязательно изучу, как это реализовать. У меня есть ещё один вопрос: какие настройки следует применить в приложении для указанных выше характеристик (24 ядра процессора и 32 ГБ оперативной памяти)?

Текущие настройки подходят или лучше увеличить значения?

Трудно сказать, не проверив систему и не увидев, что происходит.

Поскольку вы упомянули, что большинство проблем возникает при отправке поста, проблема, скорее всего, связана с записями в базу данных. Я не думаю, что дальнейшее увеличение shared buffers значительно поможет, но вы можете попробовать. Я видел, как это значение поднимали выше 50% памяти (вопреки всем рекомендациям), так что вы можете попробовать постепенно увеличить его до 12 ГБ.
Если вы не наблюдаете ошибок 502, то нет смысла увеличивать и UNICORN_WORKERS.

Вы не упоминаете об этом, поэтому, как я думаю, первое, что я бы сделал, — это подключил CDN. Это значительно снизит нагрузку на VPS, так как большие запросы не будут обращаться к серверу.

В дополнение к CDN я бы также использовал S3-подобное хранилище, что позволит вам масштабировать хранилище и ресурсы VPS отдельно (если ваше сообщество активно загружает файлы).

Эти рекомендации сильно помогают снизить нагрузку, а рост стоимости при этом значительно меньше, чем при переходе на более мощный VPS.

Спасибо, @marianord. К сожалению, мы не используем CDN. Скорость загрузки на нашем форуме не очень высока. В основном пользователи обсуждают различные темы. Например, за последний год было опубликовано около 2,8 млн сообщений и получено 2,7 млн лайков, но загружено всего 25 ГБ файлов.

Как вы считаете, исходя из этой информации, использование CDN, подобного S3, снизит нагрузку на наш сервер?

Я не согласен с @marianord. Я не думаю, что CDN внесёт заметную разницу в нагрузку на ваш сервер.
Это просто статические файлы, и они вообще не создают нагрузки при отдаче.

CDN и S3 — это две разные вещи.

  • S3 выгружает файлы и резервные копии на другой сервер, управляемый облачным провайдером (очень общее описание).
  • CDN кэширует статические файлы вашего сервера (изображения, JS, CSS) на множестве серверов (PoP) по всему миру, чтобы ускорить загрузку этих ресурсов.

По крайней мере, это мой опыт: вы уменьшаете количество запросов, поступающих на ваш сервер, тем самым снижая нагрузку. Гораздо проще обработать 10 JSON-запросов на пользователя, чем 100 запросов на пользователя.

Возможно, это не решит все проблемы, с которыми сталкивается @nildarar, но снизит серьёзную нагрузку на сервер, исключив все статические запросы (кэшированные) с сервера Discourse.

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

В общем случае json-запрос — это не статический ресурс, который может быть закэширован CDN. Это динамический контент, который генерируется на лету. Почему вы говорите о json-файлах в контексте CDN?

статические запросы ≠ более высокая нагрузка.

Извините, но это действительно плохой совет.

Вот пример с машины на 6 ЦП (таким образом, суммарная мощность ЦП составляет 600%), на которой запущен Discourse без CDN или S3.

Как видно, nginx отвечает только за 6,7% (то есть это 1/100 от общей мощности). Лишь часть этой мощности используется для статических ресурсов.

Если бы мы перенесли статические ресурсы на S3 и/или CDN, общая нагрузка на сервер снизилась бы менее чем на один процент.

Верно, но в Discourse есть несколько исключений, например, стили, которые обслуживаются через Ruby, поэтому наличие CDN с кэшированием означает, что такие запросы не расходуют процессы Unicorn.

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

Я имею в виду, что запросы к JSON будут обращаться к серверу, а статические — нет.

Спасибо за ваши рекомендации. До нескольких месяцев назад мы использовали CDN-сервис Cloudflare и успешно оптимизировали статический контент с помощью правил страниц. Однако позже я где-то прочитал, что использование прокси-серверов, таких как Cloudflare, значительно снижает производительность Discourse, поэтому мы его отключили.

Вчера мы увеличили количество ядер процессора с 16 до 24 и внесли следующие изменения в файл app.yml:

params:
  # db_shared_buffers: "6GB"
  db_shared_buffers: "7GB"
env:
  # UNICORN_WORKERS: 16
  UNICORN_WORKERS: 24

Эти изменения временно решили нашу проблему, но я считаю, что в ближайшие несколько месяцев нам необходимо внести фундаментальные изменения.

Исходя из ваших рекомендаций, приоритетными мерами для повышения производительности являются использование CDN для раздачи статического контента и разделение Discourse на два отдельных контейнера.

Это может быть устаревшая информация, но я помню, что читал, будто Discourse предпочитает меньшее количество более мощных процессоров, а не большее количество менее мощных… даже если вы измените количество воркеров единорогов.

@codinghorror, можете ли вы подтвердить, что эта информация всё ещё актуальна?

Да, это верно: мощность основного процессора важна, но она влияет на общую скорость.

@nildarar сталкивается с узким местом в производительности, и здесь нужен другой подход.

Существуют ли специальные инструменты для выявления узких мест в производительности дискурса?


Экран htop, отсортированный по использованию CPU

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

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

Снова здравствуйте :waving_hand:
Следуя вашим советам, мы установили Prometheus и некоторое время отслеживали производительность сообщества. Пожалуйста, ознакомьтесь с отчетами ниже и сравните значения с теми, что вы видите в различных установках.

Недавно я прочитал в другом посте, что один сайт отказался от плагина «Кто онлайн» (Who’s Online), так как он якобы является причиной замедления работы.

Вот ссылка: Benefits of the who's online plugin? - #6 by neounix