8
メモリのパフォーマンスを改善するためのWordpressのリファクタリング[終了]
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をダウンロードして有効にしました。比較は次のとおりです。 コードの読み込みが大幅に加速され、コードのメモリ容量も少なくなっていることがわかります(おそらく、元のソースではなくオペコードだけを扱っているためです)。ただし、メモリ消費は依然として非常に高くなります。