디스코드 속도가 너무 느립니다

저희 웹사이트가 너무 느려서 4코어 CPU, 8GB RAM, 8GB 스왑 메모리를 갖춘 서버(저희 웹사이트)로 이전했는데, 여전히 웹사이트가 느립니다. 사이트를 최적화하는 방법을 찾을 수 없습니다.

광고가 적으면 좋은 시작이라고 생각해요. :slightly_smiling_face:

와

와. 과장이 아니었네요! 아예 쓸 수가 없습니다. 포기하기 전에 이 사이트가 대체 뭘 하는 곳인지조차 알 수 없었습니다.

단일 CPU 속도와 SSD 속도가 큰 요인입니다. CPU는 얼마나 빠른가요? 회전하는 금속 디스크(HDD)를 사용하고 있지는 않죠? RAM 용량을 변경한 이후에 discourse 설치를 실행했거나 메모리 설정을 변경해 보셨나요? 데이터베이스 설정을 조정해 보셨나요? Discourse 공식 표준 설치를 사용하고 계신가요?

하지만 여러분의 사이트가 대부분 광고를 서빙하고 있으므로, discourse의 성능이 어떤지 판단하기는 불가능합니다.

저희 서버에는 SSD를 사용하고 있습니다.


애드블로커를 켜고 사이트를 테스트해 봤는데 속도가 여전히 느립니다.

discourse는 digitalocean에서 설치했습니다.

아니요, 변경하지 않았습니다.

아니요!

discourse-setup을 다시 실행하거나 app.yml의 주석을 확인하여 메모리 구성을 조정해야 합니다.

스왑은 필요하지 않아야 합니다.

데이터베이스가 매우 큰가요?

이미 discourse-setup을 실행해 봤는데 속도에 변화가 없었습니다.

네, 저희 사이트에는 27,000개 이상의 주제(topics)가 있습니다.

제 경험상, Topic List Previews (Plugin)은 Discourse의 속도를 상당히 떨어뜨립니다. Topic List Previews (TC)로 전환해 보시는 것을 추천드리며, 이쪽이 Plugin보다 훨씬 빠르게 로드됩니다.

Topic List Previews를 완전히 비활성화하면 Discourse의 속도가 몇 배로 빨라집니다. :grinning:

저희는 메타 OG를 통해 소셜 미디어에 공유할 때 토ピック에서 공유된 CDN 이미지가 여전히 표시되도록 허용하는 커스텀 플러그인을 사용하고 있습니다. 해당 CDN 지원 플러그인은 @fzngagan (Faizan)이 개발했습니다. Faizan, 작성하신 플러그인을 TLP TC로 이동시켜 사이트 로딩 속도를 높일 수 있는 방법이 있을까요?

@pfaffman 데이터베이스와 웹사이트 속도를 높이기 위해 정확히 무엇을 해야 하는지에 대해 구체적인 기술적 조언이 있으신가요? howtodiscuss.com에는 5만 개 이상의 토ピック이 있고 트래픽이 높은 웹사이트라고 가정하고 있습니다.

저의 질문은 다음과 같습니다:

  1. Discourse에서 설정할 수 있는 멀티 스레딩 또는 병렬 CPU/코어 구성이 있나요? NodeBB는 높은 트래픽을 처리하기 위해 이를 제공합니다.
  2. Discourse에 서버 측 캐싱 지원이 있나요? 어디서 어떻게 설정해야 하나요?
  3. https://howtodiscuss.com에서 Google 페이지 속도 점수 100%를 달성하려면 어떻게 해야 하나요?
  4. app.yaml 파일에서 어떤 변경 사항을 할 수 있나요? 저희는 4 VCPU, 8GB DigitalOcean 드롭렛을 사용하고 있습니다.
  5. 저희는 사이트를 서빙하기 위해 Cloudflare를 사용하고 있습니다. 여기서 수행할 수 있는 최적화가 있나요? Cloudflare의 Rocket Loader를 켜면 Discourse가 제대로 작동하지 않고 클라이언트 측 JS 콘솔에서 오류가 발생합니다.
  6. 서버 측에서 CSS, JS, HTML을 자동으로 미니파싱하고 gzip 압축을 활성화하는 방법이 있나요?
  7. meta.discourse.org에서 높은 트래픽을 처리하기 위해 수행한 최적화에 대한 통찰력을 공유해 주실 수 있나요? 저희도 같은 방식을 시도해 보고 싶습니다.
  8. Discourse에서 높은 트래픽을 처리하는 다른 사이트들이 시도한 최적화에 대한 통찰력을 공유해 주실 수 있나요?

웹사이트 속도를 높일 수 있게 되면, 성공적인 Discourse 커뮤니티 목록에 저희 사이트도 게시해 주셔도 좋습니다. 감사합니다.

글쎄, 토픽 수는 게시글 수나 데이터베이스 크기를 의미하지는 않지만, 그 정도는 크지 않습니다.

현재 사이트가 다운되어 있어서 게시글 수를 확인할 수 없습니다.

app.yml 파일을 수동으로 편집하여那里的 튜닝 정보를 확인하고 다시 빌드하는 것을 권장합니다. 데이터베이스 튜닝 방법에 대해 논의하는 여러 토픽이 있습니다.

또한 더 빠른 CPU를 제공하는 Digital Ocean의 새로운 드롭렛으로 전환해 볼 수도 있습니다.

야, @ahmed_khan1 다운타임 위험을 감수하지 마세요. 몇 분의 장애라도 구글의 평가에서 소중한 평판을 해칠 수 있습니다.

전문가에게 한 번에, 영구적으로 이 문제를 맡기세요. 사이트가 상당한 트래픽을 받고 있는 것으로 보이니, 상식을 따르고 절대 저렴한 업체를 선택하지 마세요.

@pfaffman과 @angus 같은 분을 추천합니다.

저는 2코어, 2GB RAM 환경에서 20,000개 토픽 규모의 사이트를 문제없이 운영하고 있습니다(다만, 여러분 사이트만큼 활동이 활발하지는 않을 수 있지만요 …).

하지만 많은 양의 JavaScript 실행에 문제가 있다면, 백엔드 성능은 무관합니다.

이 값을 0으로 설정해 보셨나요?

이렇게 하면 약간 도움이 될 것입니다.

TLP(토픽 목록 미리보기) 속도를 높이기 위해 TC(토픽 카드)로 전환할 수 있지만, Chromium 기반 브라우저에서 렌더링 제한이 있습니다(LayoutNG가 Grid CSS를 업그레이드할 때까지 기다리고 있기 때문에 아직 플러그인을 폐기하지 않았습니다).

새로운 DigitalOcean Droplet를 하나 확보했습니다. 1에서 바로 구매하면 됩니다.
아래는 app.yml 파일입니다.

## 이 파일은 올인원(All-in-One) 스탠드얼론 Discourse Docker 컨테이너 템플릿입니다

##

## 이 파일을 수정한 후에는 반드시 다시 빌드해야 합니다

## /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 포트는 무엇인가요?

## 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%로 설정하세요.

  ## bootstrap이 감지된 RAM 기반으로 자동으로 설정하거나, 직접 오버라이드할 수 있습니다

  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 코어 수에 따라 다릅니다.

  ## bootstrap이 감지된 CPU 기반으로 자동으로 설정하거나, 직접 오버라이드할 수 있습니다

  UNICORN_WORKERS: 8

  ## TODO: 이 Discourse 인스턴스가 응답할 도메인 이름

  ## 필수 항목입니다. Discourse는 IP 주소만으로는 작동하지 않습니다.

  DISCOURSE_HOSTNAME: "howtodiscuss.com"

  ## 컨테이너가 위에서 지정한 도메인 이름(-h 옵션)과 동일한 이름으로 시작되도록 하려면 주석을 해제하세요 (기본값 "$hostname-$config")

  #DOCKER_USE_HOSTNAME: true

  ## TODO: 초기 가입 시 관리자 및 개발자로 설정될 쉼표로 구분된 이메일 목록

  ## 예: '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

  ## 이 Discourse 인스턴스의 http 또는 https CDN 주소 (pull 설정)

  ## 자세한 내용은 https://meta.discourse.org/t/14857 을 참고하세요

  #DISCOURSE_CDN_URL: https://discourse-cdn.example.com

## Docker 컨테이너는 상태(stateless)를 유지하지 않으며, 모든 데이터는 /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 # 수식 JAX 지원을 위한 커스텀 플러그인

          - 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 # 게시물에 대한 SO 스타일 QnA 투표를 위한 비공식 커스텀 플러그인

          - 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 # HTD를 위한 커스텀 빌드 AMP 지원

          - git clone https://github.com/discourse/discourse-assign.git # 주제를 스태프에게 할당하기 위한 커스텀 플러그인

          - git clone https://github.com/paviliondev/x-discourse-tlp-thumbnail.git # CDN 이미지에서 섬네일을 표시하기 위한 커스텀 플러그인

## 빌드 후 실행할 모든 커스텀 명령

run:

  - exec: echo "Beginning of custom commands"

  ## 첫 번째 가입 시 'From' 이메일 주소를 설정하려면 주석을 해제하고 수정하세요:

  ## 첫 가입 이메일을 받은 후, 해당 줄의 주석을 다시 활성화하세요. 한 번만 실행하면 됩니다.

  - exec: rails r "SiteSetting.notification_email='noreply@howtodiscuss.com'"

  - exec: echo "End of custom commands"

이 단일 인스턴스에서 여러 사이트를 실행하고 있는 것 같습니다. 이것이 성능 문제에는 어떤 영향을 미칠지 확실하지 않습니다.

저희는 이 서버에서 이 사이트만 실행하고 있습니다.

db_work_mem을 100으로 늘려볼 수 있습니다.

요청을 지연시키고 있는 리버스 프록시 설정에 문제가 있을 수 있습니다.

미니 프로파일러(mini profiler)에는 어떤 내용이 표시되나요?

추가 데이터를 얻기 위해 prometheus 플러그인을 설치할 수도 있습니다.

Who’s Online 플러그인을 비활성화해 보셨나요?

시도는 해 봤지만 큰 개선은 보이지 않습니다.
@pfaffman
CPU와 메모리 사용량은 다음과 같습니다.

unicorn 워커를 24개로 변경했고
메모리 버퍼를 4096MB로 설정했습니다.

브라우저 쪽은 확인해 보셨나요?

이것은 스냅샷이지만, CPU 사용량이 매우 낮아 보입니다. 사양을 과하게 잡으신 것 같습니다.

메모리 사용량이 높은 이유는 유니콘의 개수 때문일 뿐입니다. 스왑이 심하게 발생하기 시작하면 유니콘 수를 줄여 보세요.

반드시 브라우저 개발자 도구의 데이터 검색 및 JavaScript 지연 시간을 확인해 보시는 것을 권합니다.

느리다고 느끼는 이유는 브라우저가 수행하는 작업량 때문일 수 있습니다.

HTTP 헤더를 보면 Ezoic와 Cloudflare를 동시에 사용하고 있는 것으로 보입니다. 맞나요? Ezoic가 정확히 어떤 역할을 하는지는 잘 모르겠지만, 이것이 체감 속도 저하의 또 다른 요인일 수 있습니다.

제 추천은 다음과 같습니다: 먼저 프록시나 Cloudflare 뒤로 Discourse를 두지 않는 단순한 설정부터 시작하세요. 합리적인 속도를 확보한 후에 Enable a CDN for your Discourse 또는, 정말로 Cloudflare를 사용하고자 한다면 https://meta.discourse.org/t/full-site-cdn-acceleration-for-discourse/21467을 참고하여 최적화를 시작하는 것이 좋습니다.

맞습니다, 이 서버에서 NGINX를 통해 서빙되는 사이트는 https://howtodiscuss.com 단 하나뿐입니다. 속도를 높일 수 있는 방법이 있을까요?