web-dev-qa-db-ja.com

drupalページ実行時間の原因となるものは何ですか?

調査中のサイトでパフォーマンスに大きな問題があり、memcacheを使用して、クエリの数と実行時間の合計(3秒から230ミリ秒)を下げることができましたが、ページの実行時間がわからない(私はdevelによって出力された値を見る)私の理解は、ページ実行時間= phpの実行にかかった時間であるため、APCをインストールし、php opcodeがキャッシュされていることと、APCコントロールパネル(apc.phpに付属のapc.php)に統計がヒットしていることを確認できます。ページの実行時間が減りません。だから私の質問は2つあると思います:

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

このサイトで使用されているPSのモジュール数は非常に多い(168)が、私は現在、その勧告を行う立場になく、穴の状況での火のようなものです。

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

Output of running xhprof on local instance

16
Dipen

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

4
mikeytown2

編集:私は元の投稿を読み違えました。 168モジュールはたくさんあり、300から700msのSQLクエリはhugeです。使用するモジュールが多ければ多いほど、モジュールがいくつかを実行するとすぐに、クエリが多くなります。

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


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

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

レンダリングにもかなりの時間がかかる可能性があります。drupal_render()(レンダリングAPIが呼び出されることがあります)は、素晴らしいAPI(本当に便利です)ですが、少し遅いです。 PDO(D7)と完全なDBTNG(ちなみにすばらしい)に切り替えると、無視できない遅延が発生します。

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

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

低速のファイルシステム(ネットワークファイルシステムまたは低速のハードドライブ)を搭載したボックスを使用している場合、実行時間に目に見える影響を与える可能性があります。 Drupalはたくさんから作成され、PHPでFSそれらの1つをロードするたび(APCもそのために役立ちます)。

MySQLを使用している場合、微調整を行うことを考えている場合は、DBMSの設定ミスがかなり醜いボトルネックになることもあります。共有ホスティングを使用している場合、Drupal特定の(または準備ができている)DBMSおよびPHPスタックは、正しく構成されていないか、調整されていない可能性があります。本当に遅いサイトにつながります。

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

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

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

1
Pierre