すべてがdrupalページの実行時間に寄与するものは何ですか?


17

私は、memcacheを使用して、数と合計実行時間(3秒から230ミリ秒)の両方でクエリの数を減らすことができましたが、ページ実行時間は私を避けています開発によって出力された値を見て)私の理解は、ページ実行時間= phpの実行にかかる時間ですので、APCをインストールし、キャッシュされているphp opcodeとAPCコントロールパネルでヒットを示す統計を見ることができます(APCに付属のapc.php)ページの実行時間は短縮されません。だから、私の質問は2つあると思う:

  • すべてがページ実行時間に貢献します(より遅くなります)。phpを実行するのにちょうど時間がかかりますか?
  • ページの実行時間を短縮するには、どのようなアプローチをとるべきですか。APCを試しましたが、あまり役に立ちません

このサイトで使用されているPSのモジュール数は膨大な数(168)ですが、現時点ではそのような推奨事項を立てる立場にはありません。

編集:ローカルインスタンスで実行されたxhprofの出力(mikeytownが推奨)、これはおかしいようです。後の結果はスラッシングによるものだと思いますか?同じURLに対するdiffの実行には大きな違いがあり、リソースの使用量が多すぎます。また、なぜ今日からではない値を示しているのか分かりません:| (このラップトップにxhprofをインストールしました)

ローカルインスタンスで実行されたxhprofの出力

回答:


4

サイトのキャッシュグラインドを取得します。xdebugまたはxhprofで生成できます。これにより、実行に最も時間がかかっている関数がわかります。あなたがこれをするまで、それは悪い推測ゲームです。


ねえ、提案のためのおかげで、私はちょうど私の地元の開発版(サーバー上のラップトップではない)にxhprofを走り、私はこれを見る- picasaweb.google.com/lh/photo/...は 本物のために、このですか?つまり、1ページで750Mbのメモリを消費する可能性さえありますか?
ディペン

それはスラッシングのコズですか?同じURLのプロファイルされた後のデータ。同じURLの下部を見ると、必要なリソースははるかに少なくなりますが、diffを実行すると完全にdiffと極端なリソース使用率が示されます。
ディペン

1
それは本当に異なりますが、100MB以上のRAMを使用している場合、セットアップの99.9%で何かが間違っています。
mikeytown2

モジュールの数以外に、他に何か問題がありますか?モジュールをすぐに本番環境から削除できるかどうかはわかりません。ところで、ローカルではnginx + php-fpmを使用しており、本番ではサイトは高速cgiでlighspeedを使用しています。
ディペン

1
cachegrindにドリルダウンし、どの関数が常に食い尽くしているのかをリストする必要があります。img715.imageshack.us/i/cgrindout.png
mikeytown2

1

編集:元の投稿を読み間違えました。168個のモジュールが大量にあり、300〜700msのSQLクエリが巨大です。使用するモジュールが多いほど、モジュールが実行するとすぐにクエリが多くなります。

可能な限り積極的なキャッシュを使用し、すべてをキャッシュします。十分でない場合は、リバースプロキシキャッシュを試します。ファイルにCDNを使用すると、全体が大幅に改善されます。リバースプロキシキャッシュは、それを必要としないページにアクセスしたときにいくつかの認証Cookieを削除することによっても役立ちます(コアはユーザーに対してそれらが匿名であると見なし、キャッシュを最大化します)。


Drupalのコアダイナミズムにより、同時に相互作用するモジュールが多すぎると、夜明け全体が遅くなります。

たとえば、フィールドを使用する代わりにhook_node_load()時にデータをロードする多くのモジュールを使用すると、フィールドを使用することでキャッシュの効率が確保される一方で、多くのクエリが実行されます。

レンダリングにも時間がかかる場合があります。drupal_render()(レンダリングAPIが呼び出されることもあります)は、素晴らしいAPI(本当に便利)ですが、少し遅いです。PDO(D7)と完全なDBTNG(これは素晴らしい)に切り替えると、無視できないレイテンシも追加されます。

ただし、コア自体は非常に高速ですが(ほとんど何もインストールされていなくてもSQLクエリが多すぎるため)、コーディングが不十分なモジュールがボトルネックになることがよくあります。

APCは、実行するコードに応じて、実行時間を2または3に分割できます。適切に設定すれば(すべてのAPC最適化を有効にすると、公式のAPCマニュアルが適切に作成され、ガイドされます)。

遅いファイルシステム(ネットワークファイルシステムまたは遅いハードドライブ)のあるボックスを使用している場合、実行時間に目に見える影響があることを意味します。Drupalは多くの小さなファイルから作成され PHPがそれらの1つをロードするたびにFS上でI / Oを強制的に実行します(APCもそのために役立ちます)。

MySQLを使用している場合、DBMSの構成が間違っていると、非常にneckいボトルネックになる可能性があります。共有ホスティングを使用している場合、Drupal固有(または準備完了)でない場合、DBMSおよびPHPスタックの設定が誤っているか、調整されていない可能性があり、サイトが非常に遅くなる可能性があります。

すべてのキャッシュをアクティブにすることを忘れないでください。サイトがユーザー指向の認証を受けていない場合は、積極的なページキャッシュを有効にします(本当に素晴らしいです)。

ブロックが増えると、ページ全体が遅くなり、Viewsのモジュールブロックが夜明けのボトルネックになります(使用するViewsプラグインによっては、OGのブロックは本当に苦痛になります)。ページごと、またはカスタムPHPコード(他のブロックも、常に手動でブロックの可視性を設定し、空のブロックのレンダリングを回避することでフレームワークを大幅に支援します)。

hook_init()を使用するモジュールは避けてください。hook_init()はすべてのページを遅くする403または404を取得した場合でも、すべてのページで実行されます(imagecache | style生成時間を遅くし、ファイルの404エラーもファイルが存在しないことを伝えるためだけに夜明けが遅くなります)。


こんにちは、ここでページ実行時間と言うときは、ページの下部にあるdevelモジュールによって示される値を意味し、SQLクエリなども含むdrupal要求/応答サイクルの一般的な意味では使用しません。私の質問は認証されたユーザーのコンテキストで。それでは、develがページの実行時間をレポートするときに、SQLクエリも含まれますか?
ディペン

15k RPM linuxファイルシステムを使用しているので、ファイルシステムがボトルネックになるかどうかはわかりません。SQLクエリは、ページに応じて約300〜700ミリ秒かかりますが、ページ実行時間は約3秒です(develが報告)。他に何が問題になるのか分かりません。
ディペン

申し訳ありませんが、元の投稿を読み間違えました。Devel値は、ブートからシャットダウンまで計算されます(develモジュールには、これを含む多くのことを行うためのPHPシャットダウンハンドラーがあります)。開始時刻と終了時刻は正確にはわかりませんが、Drupalページのビルド時間とビジネスの詳細のほとんどはそのページ実行時間に含まれています。はい、すべてが含まれます(SQLクエリの時間と待機時間を含む)、および独自の待機時間(開発クエリのログ記録はパフォーマンスにも影響します)。
ピエール
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.