私のディスコースの速度は非常に遅いです

当社のウェブサイトが非常に遅かったため、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 件以上のトピックがあります。

私の経験では、Topic List Previews(Plugin)は Discourse の動作を著しく遅くします。Topic List Previews(TC)への切り替えをお試しください。Plugin よりもはるかに高速に動作します。

Topic List Previews を完全に無効にすると、Discourse の動作が数倍速くなります。:grinning:

私たちはカスタムプラグインを使用しており、トピックで共有された CDN 画像を依然として表示できるようにしています。また、SNS で共有された際にメタ OG タグにもそれらの画像が含まれるようにしています。この CDN サポートプラグインは @fzngagan(ファイザン)氏が開発されました。作成されたこのプラグインを TLP TC(Topic List Previews)に移行する方法はありますか?そうすればサイトの読み込みがさらに速くなるはずです。

@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 側でできる最適化はありますか?Cloudflare の Rocket Loader を有効にすると、Discourse が正常に動作せず、クライアント側の JavaScript コンソールでエラーが発生します。

  6. CSS、JS、HTML の自動最小化と、サーバーサイドでの gzip 圧縮を有効にする方法はありますか?

  7. 高トラフィックへの対応のために meta.discourse.org で行った最適化について、ご共有いただけますか?同じ手法を試してみたいと考えています。

  8. Discourse を使用している他の高トラフィックサイトで行われた最適化について、ご共有いただけますか?

ウェブサイトの高速化が実現できれば、成功した Discourse コミュニティリストに当サイトも掲載させていただくことを喜んでおります。よろしくお願いいたします。

さて、トピックの数は投稿数やデータベースのサイズとは異なりますが、それほど大きくはありません。

現在サイトがダウンしているため、投稿数を確認することができません。

app.yml を手動で編集し、そこにあるチューニング情報を見て、再構築することをお勧めします。データベースのチューニング方法について議論しているトピックがいくつかあります。

また、新しい Digital Ocean の高速 CPU ドロップレットのいずれかに切り替えることも検討してください。

こんにちは、@ahmed_khan1 さん。ダウンタイムは避けてください。たとえ数分であっても、Google の評価において貴重な評判を損なうことになります。

プロに任せて、一度で永続的に解決することをお勧めします。あなたのサイトには相当なアクセスがあるようですので、常識を働かせ、安価な選択肢を選ばないでください。

@pfaffman さんや @angus さんをお勧めします。

私は 2 コア、2GB のマシンで 20,000 トピックのサイトを実行していますが、問題はありません(ただし、あなたのサイトほど活発ではないかもしれませんが……)。

ただ、大量の JavaScript を実行することが問題であれば、バックエンドのパフォーマンスは関係ありません。

これをゼロに設定しましたか?

これで少しは改善するはずです。

TC に移行して TLP の速度を向上させることもできますが、Chromium ベースのブラウザにはレンダリングの制限があります(そのため、私はまだこのプラグインを廃止していません。LayoutNG が Grid CSS をアップグレードするのを待っています)。

新しい DigitalOcean Droplet を用意しました。1 番目のリンクで購入してください。
以下は app.yml です。

## これはオールインワンのスタンドアロン 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) を追加したい場合は、以下の 2 行のコメントを外してください

#- "templates/web.ssl.template.yml"

#- "templates/web.letsencrypt.ssl.template.yml"

## このコンテナが公開する TCP/IP ポートはどれですか?

## Discourse を Apache や nginx などの他の Web サーバーとポートを共有させたい場合は、

## 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% に設定します。

  ## ブートストラップによって検出された 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

  ## 同時にサポートされる Web リクエスト数はいくつですか?メモリと CPU コア数に依存します。

  ## ブートストラップによって検出された 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 アドレス(取得するように設定)

  ## 詳細は 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 # 数式 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 風の投稿への Q&A 投票用の非公式カスタムプラグイン

          - 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 "カスタムコマンドの開始"

  ## 最初の登録時の 'From' メールアドレスを設定したい場合は、以下の行のコメントを外して変更してください

  ## 最初の登録メールを受け取った後、再度コメントアウトしてください。一度だけ実行すれば十分です。

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

  - exec: echo "カスタムコマンドの終了"

この単一のインスタンスで複数のサイトを稼働させているのだと思います。それがパフォーマンスの問題にどのように影響するかは確実には言えませんが。

このサーバーではこのサイトのみを運用しています。

db_work_mem を 100 に引き上げることを検討してください。

リバースプロキシに問題があり、パフォーマンスが低下している可能性があります。

MiniProfilerには何が表示されていますか?

さらに詳細なデータを取得するために、Prometheusプラグインをインストールすることもできます。

Who’s Online プラグインを無効にしてみましたか?

試してみましたが、大きな改善は見られませんでした。
@pfaffman
CPU とメモリの使用状況は以下の通りです。

Unicorn ワーカーを 24 に変更し、メモリバッファを 4096MB に設定しました。

ブラウザ側を確認されましたか?

もちろんこれはスナップショットですが、CPU 使用率は非常に低いですね。過剰なスペック設定ではないでしょうか。

メモリ使用量が高いのは、ユニコーンの数が多いことが原因です。スワップを悪化させるようであれば、ユニコーンの数を減らしてください。

ブラウザの開発者ツールで、データ取得と JavaScript のレイテンシを必ず確認することをお勧めします。

体感上の遅延は、ブラウザが処理している作業量に起因している可能性があります。

HTTP ヘッダーを見る限り、Ezoic と Cloudflare の両方を使用しているようですが、合っていますか?何をしているのかは確信が持てませんが、それが知覚される遅さの別の要因になっている可能性があります。

私の推奨は、まずプロキシを使わず、Discourse を Cloudflare の背後に配置しないシンプルな設定から始めることです。それが十分に高速であることを確認してから、Enable a CDN for your Discourse に従って最適化を開始するか、どうしても Cloudflare を使いたい場合は Full site CDN acceleration for Discourse を参考にしてください。

その通りです。このサーバーでは NGINX を介して https://howtodiscuss.com の 1 サイトのみが提供されています。速度を向上させる方法はありますか?