メモリのパフォーマンスを改善するためのWordpressのリファクタリング[終了]


63

Wordpressのメモリ消費量を詳しく見ました。私のサイトでは、すべてのプラグインを実行する快適な環境を準備するために、各ページに20MBのRAMが割り当てられているようです。このようにプロットしました。

最適化する単一の場所はなく、ほとんどのメモリを消費する悪意のある人はいません。消費はすべて、多くの多くのphpモジュールに広がっています。

Wordpressでメモリ内の環境を1回だけ初期化し、ヒットごとに何度も再利用するにはどうすればよいですか?遅いPHPでユーザーがクリックするたびに20 MBを消費させたくない-多くのメモリを搭載したサーバー上でも、すべての作業を完了するのに数秒かかります。基本的には、再利用可能な読み取り専用のメモリチャンクが必要になります。

また...なぜ20MBですか?誰でもこれに関する洞察を提供できますか?

編集:これは、開発マシンで実行されているWordpressでのWinCacheGrind出力です(共有ホスティングよりも非常に高速です)。ご覧のとおり、メインページのHTMLを生成するためだけに1秒以上かかります。共有ホスティングによって速度を落とすと、トラブルのレシピがあります。ほとんどの時間を費やす方法を選びました。これをどのように最適化しますか?

編集:これはこの素晴らしいfunctions.phpプロファイリングツールからのクエリ統計です

ロード:12クエリ-532ms-19.1MB-43キャッシュヒット/ 53
クエリ:15クエリ-563ms-19.0MB-72キャッシュヒット/ 86
ディスプレイ:21クエリ-705ms-19.2MB-234キャッシュヒット/ 257

編集:あなたを驚かせる何かが見たいですか?index.phpの最後に次の行を挿入します。


echo "<pre>\n";
print_r(get_defined_vars());
echo "</pre>\n";

現在の投稿の本文がメモリに保存されている回数を数えようとしました。20個のインスタンスをカウントしました。次に、PHPに参照カウントがあるため、コピーの量が3つに減ったことに気付きました。2つはWP_Queryにあり、1つはオブジェクトキャッシュにあるようです。さらに調査中です。

これが、WordPressがメモリの問題をターゲットにしたリファクタリングを必要としている理由です。メモリの消費を、それが行うことの完全な複雑さのせいにすることはできなくなりました。それは単に間違ったことをしているだけです。

編集:これを理解しようとした1日後、ここに私の発見があります:

1)すべてのメモリの88%は、require、include、またはinclude_onceタイプの呼び出しに由来します。

2)phpファイルのインクルードは、ほとんどの場合、リクエストを処理する最初の部分で発生します(当然ですが)。これは、すべてのメモリが使い果たされる場所でもあります。

3)リクエストの実行中に実行されているすべての関数をプロットすることは非常に興味深いです。合計12000を超えるコールがあります。私はそれらをより見やすくするためにジッターしました(レベル軸は基本的にスタックの深さです):

4)考えられる唯一の方法は、含まれる.phpファイルの量を最小限にすることです。関数を元のファイルごとに分割すると、多くのファイルが最大でも1回または2回ヒットしていることがわかります。それらが必要でないときにそれらをスキップする方法が必要です。たとえば、リモートデータベースバックアッププラグインはロードされて登録されますが、まったく使用されません。以下は、上記のプロットをファイル名で分割したものです。

私のブログのメモリフットプリントを30%以上削減することにつながるリファクタリングのために、私の評判すべてに値する賞金を提供しています。

編集:WP 3.1をインストールしました。これは古いバージョンとの比較です。

青はWP 3.1、赤は3.0.4です。新しいWPはより高速ですが、より多くのメモリを消費します。

インクルードファイルごとのリストを次に示します。

これにより、「オールインワンSEOパック」がどれだけのメモリを消費しているかがわかります。1つの方法は、プラグインの機能のごく一部を使用して必要なものを取得することです。また、私自身のプラグインはかなり悪いようです。

たとえば、comment.php(ブログへのコメントは許可していません)および他のいくつかの条件付きロードを試してみたいと思います。非推奨のコードをすべて削除しました。グローバルテーブルをオンデマンドでロードするためにkses.phpを削除しました。l10nを単純化し(ローカライズは行いません)、その関数がルックアップなしで文字列をすぐに返すようにしました。私が勝手に設定した30%のマークにはまだ程遠い。

編集:デフォルト設定(32MBのオペコードキャッシュ)でAPCをダウンロードして有効にしました。比較は次のとおりです。

コードの読み込みが大幅に加速され、コードのメモリ容量も少なくなっていることがわかります(おそらく、元のソースではなくオペコードだけを扱っているためです)。ただし、メモリ消費は依然として非常に高くなります。


cachegrindファイル自体をどこかにアップロードできますか?プライベートな価値があるものが含まれているかどうかは覚えていませんが、含まれている場合は覚えていません。
11

@Rarstそれは問題ないはずです。foxloft.com/files/mbala/cachegrind.out
ローマン

1
ええと、私はあなたの結論に同意します-何も本当に飛び出して、修正を求めません。ローカルテストスタック(3.1、MS、Twenty Ten、テーマユニットテストデータ)に新しいプロファイルをダンプし、1,5を取得しました(違いのほとんどはカスタムメニューによるものです-物事は遅いです)。ですから、修正するものは何もないと思います。
11

@Rarstご協力ありがとうございます。修正する必要があると思いますが、Wordpressのアーキテクチャをまったく異なる哲学に変更する必要があり、それは大変な作業です。
ローマンゼンカ

回答:


25

トラブルの価値はありません。WordPressは、多くのメモリを消費しません。内部で多くの機能を実行するため、大量のメモリを消費します。

静的キャッシュプラグインを使用して結果(ページ生成)をキャッシュし、提供する方がはるかに簡単で効率的です。そうすれば、ほとんどの訪問者はWP自体にヒットすることさえありません。


2
既にキャッシュを使用していますが、実際には本当に動的なページがいくつかあります(ショッピングカートなど)。星が正しく配置されていない場合、ユーザーは20秒間待つことができます。つまり、GoDaddyで許可されますが、そうでなくても、少なくとも3秒はかかると思います。私は、人々がGoogleに慣れているような、本当にすてきな体験を提供することはできません。
ローマンゼンカ

8
@Roman Zenkaは、特定のパフォーマンスニーズがある場合、WordPress自体が魔法のように超高速でリソースが軽くなることを望んでいるのではなく、特定のソリューションを探した方がよいでしょう。最初に検討することをお勧めするのは、オペコードキャッシュとフラグメント静的キャッシュです...しかし、その前に、ベンチマークを実行して、メモリがどこに行くのかだけでなく、どこに時間が費やされるのかを判断する必要があります。WordPressは環境であり、それ自体がボトルネックではありません。ボトルネックは、あなたがそれをやらせることにあります。
11

@Rarst私は実際にCPU使用率のベンチマークを行いましたが、トラブルを引き起こす特定の場所を特定することはできません。記憶に似ています-それはいたるところに広がっているようです。ただし、私のベンチマークは最適な方法で実行されない場合があります-XDebugプロファイラーとCachegrindを使用します-たとえば、データベース呼び出しのためにレイテンシを分解するのは非常に困難です。より良いプロファイリング技術へのポインタに感謝します。
ローマンゼンカ

@Rarstプロファイリングのスクリーンショットが追加されました。
ローマンゼンカ

4
GoDaddyのサーバーが遅いことも考えられます。彼らは最高のハードウェアを持っていないことで知られており、「サーバーをアップグレードするよりもむしろテレビ広告にお金を払う
ザック

23

そして、これがWordPressが書き換えを真剣に必要としていると思う理由です。メモリの消費を、それが行うことの完全な複雑さのせいにすることはできません。それは単に間違ったことをします。

なんて素朴な結論。してはいけないこと、パートIをお読みください

ただし、メモリ使用量のプロットをありがとう。

かなり後の編集: Autommaticはpreforkと呼ばれるライブラリをリリースしましたこれはあなたが求めていることを行うようです:RAMにWordPressコードを一度だけロードします。


確かに、それは素朴です。「書き換え」の代わりに「リファクタリング」と言ったほうがいいかもしれません。投稿を更新しました。
ローマンゼンカ

2
:あなたが特定の提案(特にパッチ)を持っている場合だけでなく、[OK]を、あなたはTracの上でそれらを投稿して歓迎しているcore.trac.wordpress.org
scribu

私は今取り組んでいます。私はメモリ内のオブジェクトのマップをプロットしようとしているので、何によって何が使用されているかを見ることができます。メモリダンプを取得してプロットするツールはありますか?
ローマンゼンカ

5
@scribu-ジョエルの投稿へのリンクに+1!
-MikeSchinkel

1
WP_Object_Cacheはmemcached実装などに置き換えることができることに注意してください。
scribu

17

WordPress 3.2以降、PHP 5.2が最小要件になります。これにより、コアの一部が再構築され、自動読み込みでクラスを使用できるようになると思います。これにより、実際に必要でない限り、コードの一部をロードすることを回避できます。たとえば、ページビューに埋め込みやギャラリーがない場合、多くのメディアコードの読み込みを回避できる可能性があります。

ただし、彼らがそのルートに進むことを決めたとしても、それは遅い進化であると予想されます(発生した他の内部の変更の多くと同様)。多くのファイルとコードの場所をシャッフルする必要があり、一部のプラグインの後方互換性を壊す可能性があります。

問題の一部(実際にそれを呼び出すことができる場合)は、そのような条件付きロードなしでは、コアフレームワークがコンテンツビューを生成するために必要な機能または不要な機能を事前に知ることができないということです。そのため、必要な場合に備えて多くの関数をロードする必要があります。


@Dougal Campbell私はこの質問について賞金を開始しました。少なくとも30%のメモリ消費の改善を得るのに十分なWordPressの少なくとも1つのインスタンスを比較的簡単にハッキングできるかどうかを確認しました。将来の開発の一部を刺激する可能性があります。
ローマンゼンカ

条件付きロードは、メモリ消費を削減する可能性がありますが、オペコードキャッシングが関係する場合は速度が低下します。速度を優先する傾向があります。
スクライブ

自動
読み込み

@scribu「条件付きロード」と言うとき、オートロードについて話しているのですか、それとも条件に基づいてコードを実際にロードするのですか?速度はどれだけ低下しますか?
ローマンゼンカ

1
ありがとうございました!言ったように、WPコアがそのルートを取るかどうかはわかりません(必要なリファクタリングが極端すぎるかもしれません)。しかし、私はあなたがこれを分析するために費やした努力とあなたが作成したグラフに非常に感銘を受けました。良い仕事を続けてください!
ダウガルキャンベル

16

Wordpressでメモリ内の環境を1回だけ初期化し、ヒットごとに何度も再利用するにはどうすればよいですか?

オペコードキャッシングと呼ばれます。

http://en.wikipedia.org/wiki/PHP_accelerator


1
APCを試して、何が起こるか見てみましょう。最初にその質問をしたとき、私は単なるオペコードキャッシング以上のことを意味しました-WordPressが構築する環境全体-コード+データを再利用することを意味しました。Memcachedはデータをより速く取得するのに役立ちますが、それでもサーバーメモリ内のデータを複製します。これで、オペコードキャッシングがすべてのメモリ消費の約90%を処理する可能性があるようです。
ローマンゼンカ

いくつかの実験用のリソースがある場合は、FastCGI環境をセットアップすることもできます。mod_phpとFastCGIでの実行の比較に非常に興味があります。
ドゥーガルキャンベル

5

ラムの使用量をそれほど減らすことはおそらくできないでしょう。ただし、を使用mod_phpしている場合は、mod_fcgid代わりに切り替えることができます。

mod_phpはわずかに低速ですが、画像、静的ファイル、またはキャッシングなどの必要がない場合でもphpを読み込みます。リクエストが多い場合、これは大量のRAMです。

fcgidを使用すると、これが大幅に削減されます。

また、静的キャッシュ(w3totalキャッシュなど)を使用すると、PHPの呼び出しがまったく回避されます。これは、非常に大きな利点です。RAM 使用量が少なく、db接続が少なくなります。


4

ハ。共有ホスティングアカウントで処理できる範囲を超えてデータと使用量を完全にオーバーロードする予定であるため、Webアプリの作業を行っています。フレームワークを作成し、特定のユースケースに必要なものだけを構築します。

だから私は、WPの数百のPHPファイルから実際に必要な20個程度のコアファイルにまでコア環境を削減することができましたが、それでもすべてのdb、HTTP、ユーザー管理、フォーマット、cron WordPressで気に入っている機能。

問題は、それが多くの仕事であり、私が自分の個人的な使用を超えて何かのために私のハックジョブを決して信用しないことです。完全なWP環境を使用する場合は、そのまま使用してください。数百人の開発者が数年かけて微調整しているため、それはそれと同じくらい良いことです。ここでみんなが言ったように、コアをハッキングするよりも優れたホスティングプランを見つけてキャッシュテクニックを研究することで、さらに多くのことが得られます。


1
私はWPが長い間微調整されてきたことに同意します。しかし、プラグインの特定の混合物を使用して、安っぽいホスティングで動作するように微調整されたとは思いません。どれだけプッシュできるのか興味があります。変更がコアにならない場合でも、必要と思われる場合は、コアをハッキングする方法を文書化することをお勧めします。
ローマンゼンカ

3

はい、WordPressは最初にすべてをロードし、それから私たちがそれをするように頼みます。RAMに仮想プールを作成してファイルを格納できることをどこかで思い出すことができます。WordPress全体をメモリ(<10MB)に入れるというアイデアがありました。それから、速度を上げるだけの大量のI / Oを節約できます。しかし、私はそれを試す機会を得たことがなく、さらにそのようなことを追求することにそれほど熟練していない。しかし、試してみる価値はあります。


また、処理がまったく行われないように、静的キャッシュプラグインを使用することにRarstに同意します。しかし、それは優れたダイナミクスでも使用できます。:)
Ashfame

私はその考えが好きです。この問題のどれだけがI / Oレイテンシに起因するのか、またPHPがデータをゆっくりと噛むことに起因するのかはわかりません。伝える方法を知っていますか?
ローマンゼンカ

ごめんなさい、それは私の頭の中の単なるアイデアです。データは一般にハードディスクからブロックとして読み取られるため、パフォーマンスにそれほど影響しないため、必要な他の多くのデータがすでにフェッチされている可能性があります。よくわからない。
アシュフェイム

3

いくつかの基本的な提案:

  1. キャッシュ用のw3合計キャッシュプラグイン。
  2. memcacheをインストールして有効にし、w3合計キャッシュ設定からも有効にします(opcodeキャッシュも適切なオプションですが、w3合計キャッシュプラグインではうまくいきません)
  3. テーマファイルの直接リンクへのクエリを最小化します。
  4. すべての余分な未使用のプラグインを無効にして削除します。
  5. データベースを最適化します。

私は毎日大量のトラフィックがある有名なワードプレスサイトを運営しています。

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