Обновление тем в реальном времени зависает при высокой активности

@sam

При таких настройках пользовательский опыт был лучше. Да, было несколько «заторов», и в инспекторе Chrome зафиксировано множество ошибок 429. Нагрузка на процессор была низкой. Но, с другой стороны, это была довольно спокойная домашняя игра (многие активные участники находились на месте, но не общались в чате).

Я не могу назвать конкретные параметры, которые нужно изменить, но, исходя из моего довольно субъективного опыта:

  • Функция кода всё ещё слишком оберегает сервер от нагрузки. Возможно, можно было бы допустить чуть более высокий уровень стресса для сервера.
  • Когда клиент замедляет запросы, задержка слишком велика с точки зрения UX. Игра продолжается, и за минуту может произойти многое. Чат рассинхронизируется: пользователи ссылаются на разные события игры. (Это усугубляет проблему различных задержек между прямым эфиром, кабельным ТВ, IPTV и буфером Chromecast в 20 секунд и т. д.).
  • Пользователь видит лишь то, что чат завис, но не получает никаких указаний на то, что сайт всё ещё работает и активен. Скорее всего, он обновит страницу или предпримет другие действия, что лишь увеличивает нагрузку.

Чтобы исключить возможные причины, я обновил сервер до 8 vCores и 32 ГБ ОЗУ. Настроил буферы БД на 16 ГБ и количество процессов Unicorn на 16. Остальные настройки вернул к значениям по умолчанию.

К сожалению, обновление мало что изменило. Быстрые обсуждения постоянно зависают, даже при средней активности.

Производительность в последнее время ужасна. Похоже, мне пора начать изучать Prometheus и подобные инструменты. Я на 95% уверен, что производительность программного обеспечения серьёзно ухудшилась после версии 2.3.

Комментарий брата @Iceman в сентябре в основном был проигнорирован. Он сообщает, что зависания возникают независимо от того, какое оборудование он использует?

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

Если мои подозрения верны, это также объяснит, почему добавление более медленных ядер процессора и оперативной памяти не дает никакого эффекта: поскольку Redis работает в одном потоке, масштабирование возможно только за счет использования высокопроизводительных ядер.

Мы выпустим новый образ вместе с финальным релизом версии 2.6 в конце месяца; он будет включать Redis 6 и новые переменные в файле app.yml, которые позволят эффективно использовать эти улучшения. Дайте знать, если хотите протестировать это раньше — я могу предоставить соответствующие инструкции.

Только что заметил это в закрытой теме. @codinghorror — это неверно. Вот что на самом деле видит конечный пользователь при высокой нагрузке:

  1. Уведомление о том, что он разлогинен
  2. Перенаправление на главную страницу сайта
  3. На главной странице отображается баннер с уведомлением о высокой нагрузке

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

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

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

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

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

Скорее всего, вы правы. Это Redis. Новый базовый образ немного улучшил ситуацию, но теперь мы превышаем возможности серверов.

Возможно, но на практике всё работает иначе. Я только что воспроизвёл это.

Что ж, по крайней мере, у этого есть известное решение: :moneybag:

Решение: Пишите более эффективный и жёсткий код :wink:

Так что если Redis является узким местом, как бы вы масштабировались горизонтально?

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

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

Вся разница может заключаться в том, что ваш провайдер VPS переместил вас с одной физической машины на другую, или что у вас появился «шумный сосед», или что ваш VPS теперь работает с 17 против 13 в среднем количество совместно размещённых служб на машину.

Пожалуйста, не стоит строить догадки о том, чтобы перекладывать проблему на провайдера VPS. UpCloud — один из лучших на рынке, и они проверили свою сторону на предмет каких-либо аномалий. Они размещают рекламу на нашем сайте, и для нас было бы не очень хорошо с точки зрения PR, если бы сайт начинал «спотыкаться» :smiley:

Но исторических данных нет, и если честно, я не уделял так много внимания этому вопросу, так как всё работало как часы, пока в августе не начались первые выставочные матчи. Конечно, поведенческие паттерны людей изменились благодаря COVID, и кто знает, что ещё. Хотя я не вижу этого в метриках нашего сайта или сервера. :man_shrugging:

Но это отличный материал для тестирования. Я только что предоставил @riking скриншоты того, что происходит, когда начинается перегрузка сервера. Думаю, вы сталкиваетесь с этим не так часто.

Обратите внимание, что никто с вами не спорит — мы лишь указываем на то, что врач может сделать не так много для постановки диагноза пациенту, если ограничивается просмотром пациента через веб-камеру в интернете. :movie_camera:

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

Вот тема, которую я создал по этому поводу в то время:

Именно это заставило меня перейти на другие варианты конфигурации CPU и памяти, описанные здесь:

К сожалению, у меня пока не было возможности полноценно перенести сервер на Hetzner из Digital Ocean, как я планировал (начал новую работу), но сделаю это, как только появится возможность в этом месяце.

Опыт конечного пользователя: его либо выкидывало из темы, либо он оставался в теме (с сообщением о выходе из системы). Это действительно зависело от нагрузки. (Больше пользователей перенаправлялось на главную страницу после гола)

У меня недостаточно технических знаний, чтобы быть полезным, но, возможно, будет полезно знать, что спортивный сайт с похожими пиками активности в чате сталкивается с аналогичной проблемой. В моём случае (меньший и более молодой сайт) проблема была решена дальнейшим улучшением сервера.

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

Краткое обновление:

  • Установлено новое окружение из 2 контейнеров на 2 VPS-серверах (web_only, data).
  • Удивительно (для меня), что сервер web_only работает на пределе возможностей, в то время как data нагружен относительно слабо. Оба работают по тарифу UpCloud.com с 4 виртуальными ядрами и 8 ГБ ОЗУ.
  • Сервер web_only обновлён до тарифа UpCloud.com с 6 виртуальными ядрами и 16 ГБ ОЗУ. Количество процессов Unicorn увеличено до 18.

Тем не менее, мы по-прежнему сталкиваемся с различными лимитерами 429. Однако режим система под высокой нагрузкой не сработал.

Хоккейный сезон был испорчен COVID-ом, и теперь они проводят несколько случайных матчей без зрителей. Поскольку у нас есть кредиты на хостинг в UpCloud.com, мы стараемся улучшить опыт, используя имеющиеся ресурсы. Сейчас работает конфигурация: 6 vCore и 16 ГБ для web_only, а также 4 vCore и 8 ГБ для data, с показателем unicorns на уровне 18.

Мы снова отключили ограничитель скорости запросов…

DISCOURSE_MAX_REQS_PER_IP_MODE: none

…что помогает, но мы всё ещё получаем ошибки 429 от POLL-запросов, что вызывает длительные задержки/зависания для конечного пользователя. Мы продолжим настройку, увеличив значение DISCOURSE_REJECT_MESSAGE_BUS_QUEUE_SECONDS.

Но прежде чем мы это сделаем, вопрос к @sam / сотрудникам:

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

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

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

Игр было мало (спасибо COVID), поэтому у нас было очень мало возможностей измерять и экспериментировать с этим.

Мы выяснили, что даже при наших улучшенных аппаратных ресурсах (6+4 vCores и 16+8 ГБ ОЗУ) даже умеренно активная аудитория способна вызывать 429 ошибку «клиент заморожен». Мы наблюдали это во время матчей U20 WC, которые привлекли около ~50% нашей обычной аудитории для чатов.

После измерений, проб и ошибок мы остановились на следующих настройках:

  DISCOURSE_REJECT_MESSAGE_BUS_QUEUE_SECONDS: 0.4
  DISCOURSE_MAX_REQS_PER_IP_PER_MINUTE: 400
  DISCOURSE_MAX_REQS_PER_IP_PER_10_SECONDS: 100

Это, похоже, устраняет 80% ошибок 429, обеспечивая относительно плавный опыт для большинства пользователей.

Следующим шагом могло бы стать приобретение других типов аппаратных ресурсов: либо использование выделенных серверов для однопоточной скорости, либо переход к провайдеру VPS, предлагающему тарифы с огромным количеством vCores. Однако для нас следующим шагом будет работа с командой хостинга Discourse, как намекнул ранее @sam.

Надеемся, эти настройки будут полезны для @iceman, @alec или любого другого пользователя. Обязательно следите за использованием CPU и очередями. Также я узнал из этого опыта, что 2 контейнера намного лучше одного — настройки можно применять с почти нулевым временем простоя, а аппаратные ресурсы используются более гибко.

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