Наш сайт работал так медленно, что мы перенесли его на сервер с 4-ядерными процессорами, 8 ГБ ОЗУ и 8 ГБ swap-памяти. Сайт наш сайт всё ещё работает очень медленно. Я не могу найти способ оптимизировать его.
Меньше рекламы — это, я думаю, хорошее начало. ![]()
Вау
Вау. Вы не шутили! Сайт совершенно непригоден для использования. Я даже не смог понять, о чём этот сайт, прежде чем сдался.
Скорость одного ядра процессора и скорость SSD — важные факторы. Насколько быстр ваш процессор? У вас точно нет жёстких дисков с вращающимися пластинами? Вы запускали установку Discourse или меняли настройки памяти после того, как изменили объём оперативной памяти? Вы настраивали параметры базы данных? Вы используете стандартную официальную установку Discourse?
Но поскольку ваш сайт в основном показывает рекламу, невозможно оценить производительность Discourse.
Вам следует либо снова запустить discourse-setup, либо изучить комментарии в app.yml, чтобы настроить параметры памяти.
Своп вам, скорее всего, не понадобится.
Ваша база данных очень большая?
Я уже запускал discourse-setup, но это никак не повлияло на скорость.
Да, на нашем сайте более 27 000 тем.
По моему опыту, плагин «Предварительный просмотр списков тем» значительно замедляет работу Discourse. Вы можете попробовать переключиться на «Предварительный просмотр списков тем (TC)» — он загружается намного быстрее, чем плагин.
Если полностью отключить «Предварительный просмотр списков тем», Discourse ускорится в несколько раз. ![]()
Мы используем собственный плагин, чтобы темы по-прежнему отображали изображения с CDN, размещенные в темах, в мета-тегах Open Graph при их публикации в социальных сетях. Этот плагин поддержки CDN разработан @fzngagan (Фаизан). Есть ли у вас возможность перенести ваш плагин в TLP TC, чтобы сайт загружался быстрее?
@pfaffman, есть ли у вас конкретные технические рекомендации, что именно нужно сделать для ускорения нашей базы данных и веб-сайта? Я предполагаю, что на howtodiscuss.com более 50 тысяч тем, и это сайт с высокой посещаемостью.
Мои вопросы:
-
Есть ли возможность настроить многопоточность, параллельную работу процессора или ядер в Discourse? NodeBB предоставляет такую возможность для работы с высокой нагрузкой.
-
Есть ли поддержка кэширования на стороне сервера в Discourse, и где и как её настроить?
-
Как достичь 100% оценки Google PageSpeed для https://howtodiscuss.com?
-
Какие изменения можно внести в файл app.yaml? У нас используется Droplet от DigitalOcean с 4 vCPU и 8 ГБ ОЗУ.
-
Мы используем Cloudflare для обслуживания нашего сайта. Какие оптимизации можно там применить? Когда я включаю Rocket Loader в Cloudflare, Discourse работает некорректно и выдает ошибки в консоли JavaScript на стороне клиента.
-
Есть ли способ автоматически минифицировать CSS, JS, HTML и включить сжатие gzip на стороне сервера?
-
Поделитесь, пожалуйста, опытом оптимизаций, которые вы применили на meta.discourse.org для работы с высокой нагрузкой, чтобы мы могли попробовать то же самое.
-
Поделитесь, пожалуйста, опытом оптимизаций, которые применяли другие сайты с высокой нагрузкой на платформе Discourse.
Как только нам удастся ускорить наш сайт, мы будем рады, если вы добавите наш ресурс в список успешных сообществ Discourse. Спасибо.
Что ж, количество тем не равно количеству сообщений или размеру базы данных, но это не так уж и много.
Сайт сейчас недоступен, поэтому я не могу увидеть количество сообщений.
Рекомендую вам вручную отредактировать файл app.yml, изучить информацию о настройке там и пересобрать систему. Есть несколько тем, в которых обсуждаются способы оптимизации базы данных.
Также вы можете перейти на один из новых более быстрых CPU-инстансов Digital Ocean.
Привет, @ahmed_khan1! Не рискуйте простоями — даже несколько минут без работы могут серьёзно подорвать вашу репутацию в глазах Google.
Лучше наймите профессионала, который решит эту проблему раз и навсегда. Судя по всему, ваш сайт получает значительный трафик, поэтому следуйте здравому смыслу и не экономьте на этом.
Я рекомендую обратиться к таким специалистам, как @pfaffman и @angus.
Я запускаю сайт с 20 000 тем на машине с 2 ядрами и 2 ГБ памяти без проблем (хотя, возможно, он не так активен, как ваш…)
Но да, если проблема связана с запуском большого количества JavaScript, то производительность бэкенда не имеет значения.
Вы установили это значение в ноль?
Это немного поможет.
Вы можете перейти на TC, чтобы ускорить работу TLP, но у него есть ограничения рендеринга в браузерах на движке Chromium (поэтому я пока не отключил плагин: жду обновления LayoutNG для Grid CSS).
У нас появился новый DigitalOcean Droplet. Просто купите его на 1
Вот app.yml
## Это шаблон контейнера Docker Discourse «всё в одном», автономный
##
## После внесения изменений в этот файл ОБЯЗАТЕЛЬНО выполните пересборку
## /var/discourse/launcher rebuild app
##
## БУДЬТЕ *ОЧЕНЬ* ОСТОРОЖНЫ ПРИ РЕДАКТИРОВАНИИ!
## YAML-ФАЙЛЫ ЧРЕЗВЫЧАЙНО ЧУВСТВИТЕЛЬНЫ К ОШИБКАМ В ПРОБЕЛАХ ИЛИ ВЫРАВНИВАНИИ!
## Посетите http://www.yamllint.com/, чтобы при необходимости проверить этот файл
templates:
- "templates/postgres.template.yml"
- "templates/redis.template.yml"
- "templates/web.template.yml"
- "templates/web.ratelimited.template.yml"
## Раскомментируйте эти две строки, если хотите добавить Lets Encrypt (https)
#- "templates/web.ssl.template.yml"
#- "templates/web.letsencrypt.ssl.template.yml"
## Какие TCP/IP-порты должен открывать этот контейнер?
## Если вы хотите, чтобы Discourse использовал один порт с другим веб-сервером, например Apache или nginx,
## см. https://meta.discourse.org/t/17247 для деталей
expose:
- "2045:80" # http
# - "443:443" # https
params:
db_default_text_search_config: "pg_catalog.english"
## Установите db_shared_buffers максимум в 25% от общего объёма памяти.
## Будет установлено автоматически при загрузке на основе обнаруженного объёма ОЗУ, либо вы можете переопределить
db_shared_buffers: "2048MB"
## Может улучшить производительность сортировки, но увеличивает использование памяти на соединение
#db_work_mem: "40MB"
## Какую ревизию Git должен использовать этот контейнер? (по умолчанию: tests-passed)
#version: tests-passed
env:
LANG: en_US.UTF-8
# DISCOURSE_DEFAULT_LOCALE: en
## Сколько одновременных веб-запросов поддерживается? Зависит от объёма памяти и количества ядер CPU.
## Будет установлено автоматически при загрузке на основе обнаруженных процессоров, либо вы можете переопределить
UNICORN_WORKERS: 8
## TODO: Доменное имя, на которое будет отвечать этот экземпляр Discourse
## Обязательно. Discourse не будет работать с чистым IP-адресом.
DISCOURSE_HOSTNAME: "howtodiscuss.com"
## Раскомментируйте, если хотите, чтобы контейнер запускался с тем же
## именем хоста (опция -h), что указано выше (по умолчанию "$hostname-$config")
#DOCKER_USE_HOSTNAME: true
## TODO: Список email-адресов через запятую, которые станут администраторами и разработчиками
## при первой регистрации, например 'user1@example.com,user2@example.com'
DISCOURSE_DEVELOPER_EMAILS: "admin@gmail.com"
## TODO: SMTP-сервер, используемый для проверки новых учётных записей и отправки уведомлений
## Для SMTP необходимы адрес, имя пользователя и пароль
## ВНИМАНИЕ: символ '#' в пароле SMTP может вызвать проблемы!
DISCOURSE_SMTP_ADDRESS: smtp-relay.smtp.com
DISCOURSE_SMTP_PORT: 587
DISCOURSE_SMTP_USER_NAME: admin@gmail.com
DISCOURSE_SMTP_PASSWORD: smtp_password
#DISCOURSE_SMTP_DOMAIN: discourse.example.com # (требуется некоторыми провайдерами)
#DISCOURSE_NOTIFICATION_EMAIL: nobody@discourse.example.com # (адрес, с которого отправляются уведомления)
#DISCOURSE_SMTP_ENABLE_START_TLS: true # (опционально, по умолчанию true)
## Если вы добавили шаблон Lets Encrypt, раскомментируйте ниже, чтобы получить бесплатный SSL-сертификат
#LETSENCRYPT_ACCOUNT_EMAIL: me@example.com
#DISCOURSE_MAXMIND_LICENSE_KEY: 1234567890123456
## Адрес http или https CDN для этого экземпляра Discourse (настроен на извлечение)
## см. https://meta.discourse.org/t/14857 для деталей
#DISCOURSE_CDN_URL: https://discourse-cdn.example.com
## Контейнер Docker не сохраняет состояние; все данные хранятся в /shared
volumes:
- volume:
host: /var/discourse/shared/standalone
guest: /shared
- volume:
host: /var/discourse/shared/standalone/log/var-log
guest: /var/log
## Плагины размещаются здесь
## см. https://meta.discourse.org/t/19157 для деталей
hooks:
after_code:
- exec:
cd: $home/plugins
cmd:
- git clone https://github.com/discourse/docker_manager.git
- git clone https://github.com/discourse/discourse-sitemap.git
- git clone https://github.com/discourse/discourse-math.git # пользовательский плагин для поддержки MathJAX
- git clone https://github.com/discourse/discourse-solved.git # пользовательский плагин для вопросов и ответов и выбора лучшего ответа
- git clone https://github.com/discourse/discourse-voting.git # пользовательский плагин для голосования только по темам
- git clone https://github.com/discourse/discourse-yearly-review.git # пользовательский плагин для автоматической публикации ежегодной темы с активностью форума
- git clone https://github.com/discourse/discourse-user-notes.git # пользовательский плагин, позволяющий сотрудникам добавлять заметки о пользователе
- git clone https://github.com/paviliondev/discourse-question-answer.git # пользовательский неофициальный плагин для голосования в стиле Stack Overflow по вопросам и ответам в постах
- git clone https://github.com/discourse/discourse-adplugin.git # пользовательский официальный плагин для рекламы
- git clone https://github.com/discourse/discourse-whos-online.git # пользовательский плагин для просмотра, кто онлайн
- git clone https://github.com/paviliondev/discourse-topic-previews.git # пользовательский плагин для красивого отображения превью тем
- git clone https://github.com/paviliondev/discourse-ratings.git # пользовательский плагин, позволяющий пользователям оценивать темы
- git clone https://github.com/discourse/discourse-cakeday.git # официальный плагин для празднования дней рождения и дат присоединения
- git clone https://github.com/discourse/discourse-saved-searches.git # официальный плагин для уведомлений о сохранённых поисках
- git clone https://github.com/paviliondev/discourse-follow.git # пользовательский плагин, позволяющий пользователям следить друг за другом
- git clone https://github.com/FaizanZahid/discourse-amp-htd-plugin.git # пользовательская сборка поддержки AMP для HTD
- git clone https://github.com/discourse/discourse-assign.git # пользовательский плагин для назначения тем сотрудникам
- git clone https://github.com/paviliondev/x-discourse-tlp-thumbnail.git # пользовательский плагин для отображения миниатюр из изображений CDN
## Любые пользовательские команды для запуска после сборки
run:
- exec: echo "Начало пользовательских команд"
## Если вы хотите установить адрес электронной почты «От» для первой регистрации, раскомментируйте и измените:
## После получения первого письма о регистрации закомментируйте строку обратно. Она должна выполниться только один раз.
- exec: rails r "SiteSetting.notification_email='noreply@howtodiscuss.com'"
- exec: echo "Конец пользовательских команд"
Похоже, вы запускаете несколько сайтов на этом единственном экземпляре. Не уверен, как это влияет на проблемы с производительностью.
Мы запускаем только этот сайт на этом сервере.
Вы можете увеличить db_work_mem до 100.
У вас могут возникнуть проблемы с обратным прокси-сервером, который замедляет работу.
Что показывает мини-профайлер?
Вы также можете установить плагин Prometheus, чтобы получить дополнительные данные.
Попробовали ли вы отключить плагин «Кто онлайн»?
Я пробовал, но не вижу значительного улучшения
@pfaffman
вот использование процессора и памяти
Я изменил количество воркеров unicorn на 24
и размер буферов памяти на 4096 МБ
Вы смотрели на сторону браузера?
Конечно, это лишь снимок, но использование вашего процессора выглядит очень низким. Думаю, вы выбрали избыточную конфигурацию.
Высокое использование памяти обусловлено только количеством процессов-единорогов. Уменьшите их число, если система начнёт активно использовать файл подкачки.
Настоятельно рекомендую проверить задержки при извлечении данных и выполнении JavaScript в инструментах разработчика браузера.
Воспринимаемая медлительность может быть связана с объёмом работы, которую выполняет браузер.
Судя по HTTP-заголовкам, похоже, что вы используете и Ezoic, и Cloudflare. Так ли это? Я не уверен, что именно это делает, но это может быть ещё одним фактором, влияющим на воспринимаемую медлительность.
Моя рекомендация: начните с простой настройки без каких-либо прокси и без размещения вашего Discourse за Cloudflare. Убедитесь, что сайт работает с приемлемой скоростью, и только после этого приступайте к оптимизации, следуя инструкциям по адресу Enable a CDN for your Discourse или, если вы действительно хотите использовать Cloudflare, по адресу Full site CDN acceleration for Discourse.
Верно, на этом сервере через NGINX обслуживается только один сайт — https://howtodiscuss.com. Есть ли у вас какие-либо способы ускорить его работу?


