Как определить узкое место производительности?

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

Недавно я перешёл с других форумов. Там первая загрузка страницы происходит достаточно быстро, но в Discourse страница загружается, а затем появляется вращающийся кружок, пока она отрисовывается. Я не уверен, связано ли это с задержкой на стороне сервера или с задержкой на стороне клиента (JavaScript) при построении страницы на основе полученных данных с сервера.

Задержка составляет около 5–10 секунд, но после этого производительность в целом нормальная.

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

Вы можете увидеть, насколько далеко рендерится первая страница. CDN может помочь.

Как далеко? Где именно?

Какая версия Discourse у вас установлена?

Сколько сообщений в темах, которые вы просматриваете/тестируете?

Быстро и Мета, я подозреваю :wink:

Последняя версия 2.8.x и всего около 30 пользователей. Я работаю на виртуальном процессоре с двумя ядрами, 2 ГБ оперативной памяти и SSD-диске.

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

Так что, нечего проверять или отслеживать — просто установите и молитесь, чтобы всё было в порядке??

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

Когда вы говорите о 30 пользователях, вы имеете в виду одновременных или это вся база пользователей?

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

Какой уровень использования памяти в среднем? 30–50–80%???

Случайно я просматривал графики скорости и производительности в Google Analytics и заметил изменения после перехода с версии 2.2 на 2.9 — ухудшение, хотя мне нужно изучить это подробнее. На самом деле я не замечаю заметного замедления, скорее наоборот, всё кажется даже быстрее. Так что я знаю? Или что знает Google Analytics, а?

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

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

Это VPS на хостинге или что-то другое? Как он был установлен? Знание того, какой именно 2-ядерный процессор используется, полезно — не все процессоры одинаковы.

Между инстансом и клиентами есть что-то промежуточное? Обратный прокси или что-то вроде CloudFlare?

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

Событие FetchEvent для "https://35.212.139.150/fonts/Roboto-Regular.ttf?v=0.0.9" завершилось ошибкой сети: промис был отклонён.
Promise.then (async)
(anonymous) @ Router.mjs:60
Событие FetchEvent для "https://35.212.139.150/fonts/Roboto-Bold.ttf?v=0.0.9" завершилось ошибкой сети: промис был отклонён.
Promise.then (async)
(anonymous) @ Router.mjs:60
NetworkFirst.mjs:167 Необрабатываемое исключение (в промисе): no-response: no-response :: [{"url":"https://35.212.139.150/fonts/Roboto-Regular.ttf?v=0.0.9"}]
    at a.makeRequest (https://community.hubivue.com/javascripts/workbox/workbox-strategies.prod.js:1:2145)
makeRequest @ NetworkFirst.mjs:167
color_definitions_light_4_1_530ebcc4a553d42866a6f343d784841cf5c0b816.css:1          GET https://35.212.139.150/fonts/Roboto-Regular.ttf?v=0.0.9 net::ERR_FAILED
NetworkFirst.mjs:167 Необрабатываемое исключение (в промисе): no-response: no-response :: [{"url":"https://35.212.139.150/fonts/Roboto-Bold.ttf?v=0.0.9"}]
    at a.makeRequest (https://community.hubivue.com/javascripts/workbox/workbox-strategies.prod.js:1:2145)
makeRequest @ NetworkFirst.mjs:167
color_definitions_light_4_1_530ebcc4a553d42866a6f343d784841cf5c0b816.css:1          GET https://35.212.139.150/fonts/Roboto-Bold.ttf?v=0.0.9 net::ERR_FAILED

Google Cloud VM, ничего между хостом и веб-сервером, без CDN

Хорошо, похоже, что вы размещаете этот экземпляр на Google.

Кто-нибудь пытался установить его по IP-адресу до использования DNS-имени?

Далеко… Я сбросил выбор шрифтов на значения по умолчанию (то есть Arial), и всё работает нормально. Похоже, это баг или что-то не так с выбором шрифтов в настройках. Дело закрыто, и я пока буду пользоваться Arial.

Наверное. Не уверен. Если это проблема, есть способ сбросить это обратно?

Это зависит от того, как они перешли на использование имени хоста после попытки использовать IP-адрес.

Установка выполнялась ли по шагам из руководства «Стандартная установка»? Я бы поговорил с тем, кто настраивал этот экземпляр, чтобы выяснить, что именно было сделано. Возможно, IP-адрес всё ещё упоминается в других местах.

Есть ли команда, чтобы сбросить установку обратно или исправить это? Кажется глупым, что имя хоста нельзя изменить ни разу. Это ограничение задумано так?

Обратите внимание, что производительность в порядке, теперь когда используются базовые шрифты — проблема, похоже, связана с использованием шрифтов Google Roboto.

Правильно ли я понимаю, что мне нужно просто в целом следовать этому руководству…

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