Drupalのパフォーマンスをどのように改善しますか?


54

Drupalは開発が速いですが、パフォーマンスは非常に劣っています。1秒あたり50件のリクエストに到達するのは困難です。

そして、単純なWebページには非常に多くのSQLクエリがあります。Drupal.orgでフォーム送信のリクエスト時間をテストする場合、終了するのに常に数秒かかります。

Webサイトの速度をどのように改善しますか?


3
実際にサイトを検索しましたか?これがこれまで繰り返し議論されていなかったとは想像できません。
レサリオン

1
私のスライドをチェックしてくださいgoo.gl/30yi39はあなたを助けるべきです
mikeytown2 14

回答:


61

キャッシュ、キャッシュ、およびキャッシュ。

doに関する同様の質問に対して私が以前に与えたいくつかの提案

  1. 置くニスあなたのhttp-デーモンの前で、または別のリバースプロキシは、おそらくあなたが行うことができ、単一の最善のことです。
  2. DrupalCon Copehagenの間、Rasmusは、APCなどのphpオペコードキャッシュを使用することは、PHPを一般的に高速化するためにできる最善のことの1つであると述べました。PHPの新しいバージョンではパフォーマンスが向上します。DrupalをアップグレードするときにPHPをアップグレードすることには、追加の利点もあります。6から8にかけて、Drupalはオブジェクト指向への大きなシフトを経ます。これは、新しいPHPバージョンでパフォーマンスの改善が最も行われた場合でも同様です。
  3. Memcacheは、キャッシュをディスクではなくメモリに配置することにより、キャッシュを高速化するための一般的な選択肢です。
  4. パネル +キャッシュとキャッシュアクションを組み合わせることで、非常に複雑なロジックをサポートするため、ログインしているユーザーでもパフォーマンスを大幅に向上させることができます。
  5. エンティティキャッシュは、 Drupalの7を使用して、誰のための素晴らしいとゼロ-confのスピードブーストです。
  6. 書き込みが多いサイトには、「確立された」ソリューションがほとんどありません。いくつかのオプションが含まれます。
    1. 頻繁な書き込みを完全に移動します。たとえば、Googleアナリティクスなどの統計情報などです。
    2. NodeJSのようなカスタムソリューションで頻繁な書き込み操作をキャッシュし、X秒ごとに1回DBに書き込みます。
    3. 神聖なACIDを犠牲にし、MongoDBのようなデータベースを使用します。(以下のBerdirのコメントを参照)
    4. SQLデータベースをクラスター化します。1つのデータベースからの読み取り、別のデータベースへの書き込みを行います。これはD7固有のものであり、PressflowはD6のそれを支援します。

これらはすべて追加されましたが、これらはすべて読み取りキャッシュ用であり、書き込みが多いサイトには適していません。
ブルースドゥ

書き込みについて具体的なことは何も言わなかった。:)私は答えにそれについて何かを追加します。
レサリオン

1
MongoDBの説明。データベース全体をMongoDBに切り替えることはできません。MongoDBはMySQLのようなDBMSとはまったく異なるものであり、たとえばSQLを使用しません。特定のプラグ可能なコンポーネントのみを交換し、それらを使用して、MongoDBのデータの一部(フィールド、ログ、ブロックなど)を保存できます。
ベルディール

@Letharion >> SQLデータベースをクラスター化します。1つのデータベースからの読み取り、別のデータベースへの書き込みを行います。Pressflowはそれを支援します。どうすればこれを達成できますか?
GoodSp33d

1
素晴らしい答えです!決定的。これに追加するには、高度なCSS / JS集約モジュールをご覧ください。これは、集約によって単一のCSSおよびJSファイルに対する要求が減り、それによりパフォーマンスの向上に役立つということです。
therobyouknow

23

これらは私の経験からのメモであり、他の人が経験するものとは異なる場合があります。私は主にLAMPスタックを使用しており、私の提案では同じことを考慮しています。

私が一般的に従うキャッシングの経験則。

  1. 一度使用して複数回処理します。
  2. 可能な場合、古いデータでライブ
  3. まれにキャッシュをクリアし、非常に具体的にします。
  4. 可能な場合、スタックの最下位レベルで変更を行います。LAMP-DCCc:Linux、Apache、Mysql、PHP、Drupal Core、Contrib、およびカスタムモジュール。

Drupalサイトのパフォーマンスを改善する(複雑さの順に)

  1. コアを最新の状態に保ち、contribモジュールとテーマを最新の状態に保ちます。はい、重要です。

  2. サーバーにAPCをインストールします。(レサリオンからの提案に基づいてトップに移動)

  3. ページキャッシュ:admin / config / development / performance 最小キャッシュライフタイムとキャッシュページの有効期限の違い

  4. ブロックキャッシュhttps://drupal.org/project/blockcache_alterすべてのブロックのキャッシュオプション。
  5. javascriptおよびcssファイルの集約-フロントエンドの改善 https://www.drupal.org/project/advagg
  6. 不要なモジュールを無効にします。すべてのモジュールは、ページの読み込みに必要なコードの量を増やします。また、ルックアップの回数も増えます。可能であれば、特定の機能を実行する複数のモジュールの代わりに汎用モジュールを使用します。
  7. ビューコンテンツのキャッシュ-ビューのコンテンツ認識キャッシュ https://www.drupal.org/project/views_content_cache
  8. DBロギングを無効化-https ://drupal.org/project/syslog_ngを使用
  9. 404エラーの削減-http ://www.brokenlinkcheck.com/
  10. 高速404応答-https://drupal.org/project/fast_404-サーバーレベルで処理してみてください。
  11. クライアント側の検証-https ://www.drupal.org/project/clientside_validation
  12. 画像の圧縮-https://www.drupal.org/project/imageapi_optimize
  13. 画像の遅延読み込み-不要な画像を読み込まないで ください-https://www.drupal.org/project/lazyloader
  14. スプライトシートを使用する-https ://www.drupal.org/project/spritesheets

  15. [最小キャッシュライフタイム値]を高い数値に設定し、キャッシュクリアモジュールを使用して特定のページのキャッシュをクリアします- ノードを編集/更新するたびに、匿名ユーザーのすべてのページキャッシュが失われます

  16. Develモジュールを使用してクエリを監視します。
  17. ビュークエリの書き換え/ビューが過剰な場合はビューを回避します。
  18. XHProf- https: //www.drupal.org/project/XHProf
  19. FPM、HHVM。
  20. DBプロファイリングとチューニング-https ://www.drupal.org/project/dbtuner
  21. Boostを使用し、不要な場合はDBをブートストラップしないでくださいhttps://drupal.org/project/boostほとんどの小規模から中規模のサイトでは、Boostで十分であり、リバースプロキシなども必要ない場合があります。
  22. CDNを使用する-https : //www.drupal.org/project/cdn セットアップは簡単です。
  23. キャッシュテーブルが非常に大きい場合は、Memcachedを使用します-memcachedをインストールしてRAMを設定できる場合、見た目ほど複雑ではありません。
  24. Etags-Etagsを適切に構成します。 https://developer.yahoo.com/blogs/ydnfiveblog/high-performance-sites-rule-13-configure-etags-7211.html
  25. リバースプロキシサーバーを使用する -ワニス(少なくともアセット用)。ほとんどのユーザーが匿名の場合に役立ちます。
  26. 圧縮転送-gzip圧縮を有効にします
  27. キープアライブ-可能な場合は永続的な接続を使用します。
  28. プログレッシブJPEGS-
  29. コードのキャッシュ-Eatonのブログは素晴らしいです。 http://www.lullabot.com/blog/article/beginners-guide-caching-data-drupal-7
  30. キャッシュウォーミングの実装-https ://www.drupal.org/project/cache_warmer-キャッシュエンドユーザーがヒットする前にページをウォームします。
  31. マスタースレーブDB構成-https ://www.drupal.org/project/autoslaveを使用すると、セットアップが簡単になります。
  32. データベースクラスター-https ://stackoverflow.com/questions/1163216/database-cluster-and-load-balancing
  33. ロードバランサー-http ://en.wikipedia.org/wiki/Load_balancing_(computing)
  34. ヒューリスティックキャッシュウォーミングを使用する-https ://www.drupal.org/project/cache_graceful
  35. 認証ユーザーのキャッシュ-https ://www.drupal.org/project/authcache

drupal.stackexchange.com/questions/118990/…のために書いた答えを再投稿します。ところで、それは広すぎると言って閉鎖されました。これら2つの質問に大きな違いがあるかどうかは
わかりませ

18

Boostモジュールも非常に便利です。Webページから静的ファイルキャッシュを作成します。これは主に、多くの匿名ユーザートラフィックがあるWebサイト用です。

BoostはDrupalに静的ページキャッシングを提供し、ほとんど匿名のトラフィックを受信するサイトのパフォーマンスとスケーラビリティを大幅に向上させます。共有ホスティングの場合、これはパフォーマンスの向上という点で最適なオプションです。専用サーバーでは、代わりにワニスを検討することをお勧めします。

Apacheは完全にサポートされており、Nginx、Lighttpd、およびIIS 7は準サポートされています。Boostは、html、xml、ajax、css、およびjavascriptをキャッシュおよびgzip圧縮します。ブーストキャッシュの有効期限ロジックは非常に高度です。サイトのさまざまな部分に異なるキャッシュ有効期間を設定するのは非常に簡単です。組み込みのクローラーにより、期限切れのコンテンツが迅速に再生成され、ページが高速にロードされます。


1
BoostはDrupal 7に最適です。共有ホスティングソリューションでは、これは優れた方法です(たとえば、多くの場合Varnishが許可されないため)。
セージ

5

SQLIteデータベースドライバーを使用している場合は、ディスクの同期を無効にする必要があるかもしれません。

/**
 * Implements hook_init().
 */
function HOOK_init() {
  db_query('PRAGMA synchronous = OFF');
}

一部のサーバー構成では、パフォーマンスが大幅に向上します。


2
これはすべてのページの読み込みで無効になるため、永続的に無効にするより良い方法があるかどうかを考えていました。チェックアウトに時間をかける必要があります。
Gokul NK

1
'init_commands'要素を$ databases配列に追加することで、sites / default / settings.phpでそれを行うことができます。ここで「PRAGMA同期= OFF」の例を見つけました:bitacoles.enging.com/node/210
dinopmi

4

Drupalのパフォーマンスの秘密は、キャッシングとグッドプラクティスに従うことです。提案:

Drupalバックエンド

  • [ パフォーマンス]セクションでキャッシュを有効にします。
  • パフォーマンスパフォーマンスおよびスケーラビリティのチェックリストモジュールを確認します。
  • Drupal 7パフォーマンス最適化オプションとチェックリストを確認してください。
  • 未使用および非本番モジュール(Devel、Views UI、Rules UIなど)を無効にします。
  • 不安定なモジュールを無効にします。
  • 統計を無効にします
  • dblogコアモジュールを無効にし、syslogに置き換えます。
  • Update Managerコアモジュールを無効にします。
  • Cron:poormanscronではなく、Drupalの組み込みcronを使用します(ElysiaまたはUltimate cronを検討してください)。
  • ビュー:さまざまなレイヤー(データベースクエリ、マークアップ、時間ベース)のビューにキャッシュを使用します。
  • ブロック:ビューがブロック(ページ、ユーザーなど)の場合は、ブロックキャッシュを使用します。
  • ブロック:ブロックキャッシュ変更モジュールによってブロックごとにキャッシュ設定を調整することを検討してください。
  • パネル:可能な限りキャッシュを使用します(D7チェックPCCおよびPHCモジュールの場合)。
  • エンティティ:エンティティキャッシュを有効にします。
  • 複数の環境を使用する場合は、ページの読み込みを改善できるモジュールがないことを考慮しください。
  • 認証されたユーザーのページキャッシュをAuthcacheモジュールで有効にします。
  • ユーザーエクスペリエンスを低下させるリダイレクトを避けます。
  • Expireモジュールを使用して、キャッシュの無効化を強化します。
  • 実稼働前にPHPプロファイリングを使用します(例:XDebug)。

Drupalフロントエンド

  • HTTPリクエストを最小限に抑える:
    • [ パフォーマンス]セクションでJS / CSS集約を有効にします。
    • CSSスプライトを使用して、画像リクエストの数を減らします。
    • 小さな画像をインラインデータ(スタイルシートのURI)として使用します。
    • 画像マップを使用して、複数の画像を単一の画像に結合します。
    • 遅延イメージの読み込みの使用も検討してください(Image Lazyloaderを参照)。
    • BigPipeモジュールをインストールして、ロード時間を短縮します。
    • 遅延読み込みと遅延評価を検討してください。
    • 参照:ブラウザキャッシュの使用-公開!
  • JavaScriptとCSS Externalを作成することを検討してください(場合によってはより高速です)。
  • JavaScriptとCSSを縮小します(Speedyモジュールを参照)。インラインを避けます。
  • JSを参照するときはdeferasync属性または属性を使用します。
  • iframeの数を最小限にします。
  • 画像、フォント、CSSスプライトを最適化し、ファビコンをキャッシュ可能にし、Cookieのサイズを小さくします。
  • DOM要素の数を減らし、アクセスされた要素への参照をキャッシュします。
  • 高速404モジュールを使用して、404ページの読み込みを高速化します。
  • Advanced CSS / JS Aggregationを使用して、フロントエンドリソースの集約とキャッシュを有効にします。
  • スタイルシートを上部に、スクリプトを下部に配置します。
  • ExpiresまたはCache-Controlヘッダーを追加し、ETag追加して応答を減らします。
  • AJAXにGETを使用し、キャッシュ可能にします。
  • ブラウザーがアイドル状態になっている時間を活用するために、コンポーネントをプリロードおよびポストロードします。
  • ドメイン間でコンポーネントを分割すると、並行ダウンロードが最大化される場合があります。
  • HTMLで画像を拡大縮小せず、コンポーネントを25k未満に保ちます。
  • srcまたはhrefが空のフィルター、CSS式、HTML要素は避けてください。
  • Webリクエストをデバッグするには、リバースプロキシを使用します(Charlesなど)。
  • 基本的なパフォーマンスチェックには、Y-SlowやPhantomJSなどのツールを使用します。
  • Google PageSpeedツールを使用して、Webサイトを分析および最適化します。
  • W3C Navigation Timing specs(GitHub)について読んでください。

PHP

  • PHPキャッシュ(OpCacheAPCなど)を有効にし、設定を調整します。
  • mod_phpの代わりにPHP-FPMとApacheの代わりにNginxを使用することを検討してください。

データベース

サーバ

  • Drupalの推奨システム要件を確認してください。
  • Drupalの推奨Webサーバー設定を確認してください。
  • Drupalの推奨PHP構成設定を確認してください。
  • ホスティングが高速ストレージデバイス(SSDなど)にあることを確認してください。
  • 共有ホスティングとは反対に、専用の高速で信頼できるサーバーを使用します。
  • Redisまたはmemcached(igbinaryサポート付き)をインストールし、それを使用するようにDrupalを構成します。
  • 検索エンジンの長いTTLを定義します(たとえば、24時間のTTLは、ボットがサーバーに到達するのを防ぎます)。
  • DNSルックアップを減らします(キャッシュされていることを確認してください)。

トラフィックの多いウェブサイト

Webサイトの負荷が高いと予想される場合は、ニスを使用します。CDNの使用も検討してください。

続きを読む:パフォーマンスのスケーリングとチューニングに関する実世界の経験


その他のリソース:


3

パフォーマンスとスケーラビリティに関するいくつかの問題を解決するためのベストプラクティス、例、および詳細な説明を提供するHigh Performance Drupalという本があります。Drupalの内部、アプリケーションのパフォーマンス、データベース、Webサーバー、パフォーマンス分析にコーディングとインフラストラクチャの手法を適用する方法を学びます。

Drupal 7パフォーマンスとスケーラビリティの記事では、Drupal 6とDrupal 7の例と次のリストを見つけることができます。

注目すべきDrupal 7のパフォーマンスおよびスケーラビリティプロジェクト:


2

Drupalサイトのパフォーマンスを最適化するために多くの調整が行われていますが、すべてが必須というわけではありません。Drupalのプラットフォームの最適化につながる特定の代替案と手法を探してみる必要があります。キャッシュ、はい、それはさまざまな手段でウェブサイトを最適化する方法ですが、いくつかの追加のアドオンやヒントを使用すると、手間のかからないプロセスなしでウェブサイトを増やしたり調整したりできます。

最近、私たちのウェブサイトに同様の記事を公開しました。これは、微調整作業を行う際に役立つと思われます。

ソース:http : //www.cloudreviews.com/blog/drupal-performance-optimization-tips


2

新しいモジュールをインストールせずに、Drupalの速度を適切なレベルに向上させる可能性がいくつかあります。はい、Drupalにはパフォーマンス設定があります。

  1. YourSiteDomain / admin / config / development / performanceにアクセスして、これを設定できます。
  2. Chachingで「匿名ユーザーのキャッシュページ」を有効にします
  3. 最小キャッシュ有効期間:1日(定期的な更新を行わない場合)
  4. キャッシュページの有効期限:1日(定期的な更新を行わない場合)
  5. [キャッシュページの圧縮]を有効にする
  6. 「CSSファイルの集約と圧縮」を有効にする
  7. 「JavaScriptファイルの集約」を有効にします

  8. この構成を設定したら、次の場所に移動します:YourSiteDomain / admin / reports / status

  9. 「css」および「js」ディレクトリのアクセス許可の問題があるかどうかを確認します
  10. [ステータスレポート]ページで定義されている権限を修正します

これで、drupal 7サイトの速度の最適化が完了しました。

速度を確認するためのオンライン速度テストツールはほとんどありません。上記の設定を更新する前に、必ず速度チェックツールのいずれかを使用してテストを実行してください。そして、パフォーマンス設定を更新したら、速度テストを再度実行します。間違いなく改善が見られます。

PingdomとHTTP Fox(FireFoxプラグイン)は、サイトの速度を確認するための最良のツールです。

上記の設定は、匿名ユーザーのページをキャッシュするだけでなく、CSSファイルとJSファイルも圧縮します。たとえば、サイトで80個のファイルを読み込んでいる場合、これらの設定を送信すると、リクエストの数が少なくとも50%削減されます。ここで、Drupalサイトの速度が2倍に向上します。


2

バックエンド開発者として、ウェブサイトのパフォーマンスを向上させるためにコードを改善する余地が常にあります。バックエンド開発者向けのガイドラインは次のとおりです。

1)ウォッチドッグテーブルをクリーンアップする

2)変数APIを乱用しないでください

3)HTTPリクエストの数を減らすまたは改善する

4)「ドットモジュール」を短くする

フォントエンドとサイトビルダーに関しては、さらに多くのことを達成できますが、あらゆる観点からパフォーマンスを考慮することが重要です。

出典:ライブ配信前に最適化する


2

2 GBのRAMを備えた最適化されていないDrupal 7サイトは、1秒あたり約20〜25の要求を十分に処理できます。それ以上にしたい場合は、サイトを微調整する必要があります。微調整する内容は、サイト上のほとんどのユーザーが匿名か認証済みかによって異なります。パフォーマンス改善のためにできることは次のとおりです。

サイトは主に匿名ユーザーにサービスを提供しています:

1)APC、memcache、およびentitycacheを確実にインストールして構成します。

2)Webサーバーの前にニスプロキシを配置します。インストールと構成には約30分かかりますが、ページのロード時間は大幅に短縮されます。実際、すべてのページがキャッシュされている場合、ワニスは2 GBのマシンで毎秒約300のリクエストを処理できます。Expireモジュールを使用して、コンテンツの更新/削除時に選択したページのみを期限切れにします。

3)高度なCSS / JS集約モジュールを使用して、CSSおよびJSファイルを集約します。すべてのJSファイルをページの下部に移動してみてください。ただし、これによりサイトが破損する可能性があるため、徹底的なテストを行った後、実稼働環境で実装してください。重要なCSSのインライン化も試してください。私の経験では、ページのロード時間が約0.5秒短縮されます。

4)CSS / JS / imagesには、将来の期限切れヘッダーが必要です。これにより、ブラウザーが同じCSS / JS / imagesを何度も要求しないようになります。

5)Webサーバーが圧縮されたページ/ CSS / JSを提供していることを確認します。

上記の5つの手順を実行すると、2 GBのRAMサーバーは1秒あたり50件のリクエストを非常に簡単に処理できるはずです。

サイトは主に認証されたユーザーにサービスを提供しています:

そのようなサイトの最適化はより複雑です。このようなサイトは、最適化の目的で2つのサブカテゴリのいずれかに分類されます。

(a)ユーザー固有の情報を持つ1つまたは2つのブロックを除き、サイト上のほとんどのページは同一です。たとえば、Drupal Commerceサイト。

(b)ほとんどのページはユーザー向けに完全にカスタマイズされています。たとえば、Drupal Commonsサイト。

サイトがカテゴリ(a)に該当する場合は、ほとんど匿名ユーザーにサービスを提供するサイトについて説明したテクニックのほとんどを適用します。唯一の違いは、非管理ページの場合、ニスはヘッダーからSESSION Cookieを削除し、キャッシュされたページを提供する必要があることです。AJAXブロックモジュールを使用して、AJAXを使用してユーザー固有の情報でサーバーブロックをサーバーします。この方法では、ほとんどのページがVarnishを使用して非常に迅速に提供され、ユーザー固有の情報がAJAXを介して提供されます。

サイトがカテゴリ(b)に該当する場合、Authcacheモジュールを使用します。かなりの設定とメンテナンスが必要なため、可能な限り使用しないことを好みます。しかし、それは本当にうまく機能します。Varnishを使用するほど高速ではありませんが、探している1秒あたり50のリクエストを処理できます。

ここで説明した以上のことをお望みの場合は、Drupalパフォーマンス最適化チェックリストをご覧ください。開示:それは私によって書かれました。Drupalサイトを高速化するためにできることの完全なリストを引用しています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.