PHPキャッシュの断片化との戦い

普通の人がサイトでデータの出力をキャッシュする必要があるか、データベースを操作した中間結果をキャッシュするか、単に実行を高速化するためにオペコードスクリプトをキャッシュする必要があることを願っています。

開発者はこのために何を提供しますか?



したがって、この問題のリーダー(個人的には、私)はmemcachedシステムと呼ぶことができます。

配布 独自のメモリ(通常のキャッシュはWebサーバーの共有メモリで動作します)には32〜512 MBはありませんが、最大4ギガバイトあります

(4つのギガバイトは、1つのmemcachedプロセス(32ビットアドレス指定)の制限です。32ギガバイトのRAMがあるコンピューターで1ダースのデーモンを実行している場合は、別のコンピューターで1ダース)

しかし、memcachedの何が悪いのでしょう。

1.それはブレーキです-ネットワーク接続は(Localhost内でも)高速ではありません

2.オペコードをキャッシュしません


主なものは、メインプラスを忘れないことです-memcachedは大量のデータをキャッシュします...



したがって、1つのmemcachedにうんざりしないことがわかったようです。

オペコードキャッシュを配置することも必要です。

繰り返しますが、私の意見では、あなたは

1.APC

2.eAccelerator

3.XCache


それらはすべて、memcachedよりも2〜3倍速いキャッシュで動作します。

Memcachedのみのストアには何の費用もかかりません(非同期ですか?)が、データをプルしようとします-パッケージが存在する間に、存在します。 まあ、ミリ秒は確かに、または5つすべてです。



Plus XCache-スクリプトを非常によく最適化します。

さらに、eAccelerator-Lock \ Unlock操作があり、4ユーザーによる1ブロックの同時キャッシュを除外できます。

(どういうわけか、1つのブロック(今週の最も人気のあるニュース)が6つのスレッドに同時にキャッシュされました。データベースはクロスLOCKのためにちょうどベッドに行きました。

さらにAPC-eAcceleratorよりも高速に動作しますが、そのようなことは知りません。



ローカルマシン(Windows)では、XCacheはファイルの最適化に従事し、データキャッシングはeAcceleratorです(ロック\ロック解除のため)

サーバー上およびサーバー上で、システムはそれらを同時にインストールすることを許可しません。

床に横たわって、ハンドルの足をたたいて、XcacheまたはAPCのいずれか、私たちには一夫多妻はありません!

eAcceleratorとは何ですか。

キャッシュ自体は、2つのサーバー上のmemcachedにあります。

それに加えて、読み取り/書き込みキャッシュを使用するすべての操作も、ローカルキャッシュとmemcachedの両方で複製されます。

つまり、ストア操作が完了すると

$ ttl + = rand(0、$ ttl / 10); //一度に作成されるキャッシュは、EXPIREが異なると非常に便利です

cache_storelocal($ name、$ value、$ ttl / 2); //ライフタイムの半分の間eAccを入れます

cache_storeglobal($ name、$ value、$ ttl); //期間全体にわたってmemcachedに入れます



キャッシュを取得するときは、まずローカルキャッシュを調べ、次にグローバルキャッシュを調べ、ローカルキャッシュに追加するかどうかを調べます。



ダックスフント、私はトピックについて話すのを忘れていました...

一般的に、私たちはうまく生きていて、その後プロジェクトはクラッシュし始めました。

あなたは朝起きます。 サイトがハングします(セグメンテーションエラー)。 サービスhttpdの再起動

1時間経ちます。 サイトのスローダウンが始まり(数十から数百回、CPU使用率。7%)、 httpdの再起動サービス

3日間、問題は終わりました。

しかし、問題は単純でした-キャッシュメモリの断片化(ローカルキャッシュを使用しなかったプロジェクトのみが正常に機能しました)...

そして、この断片化はどのように見えましたか-64メートルが割り当てられているため、キャッシュはデータの重量が...ギガバイトであると正直に報告しました(通常1.6Gと言われています)

ハンドル付きの変数が表示されます-特定の60バイト配列の重量は8メガバイトですか?



そもそも、大きなデータ(画像やテキスト)のローカルキャッシュを禁止することでこの問題を解決することにしました。サーバーは50時間立ったままで、再起動しません...



しかし、「セカンダリ」サーバー(Ajaxリクエストの並列処理)にアクセスすると、100%の断片化というrepinの画像が見られました。 保存されたデータはすべて小さくて小さいです(ただし、Ptsがたくさんあります)。

何をすべきか。 フラグメンテーションを殺す方法。



個人的には、これまでのところ1つの解決策しか考えられませんでした-

1.「自分自身」がより多くのメモリを使用できるようにします。

2.ローカルキャッシュからすべてのデータを順番に収集します(64メートルあり、そのうち24メートルがファイルキャッシュで占められており、合計40メートルです-これはゴミです)

3.キャッシュをクラッシュさせます。

4.データを引き出します。

時間-どこか半秒。

そして1時間に1回の冠。

しかし、個人的には、解決策は曲がっています。

他のオプションはありますか?



PS:ローカルキャッシュに変数をキャッシュしないという提案を拒否します。

回して確認-価値がある!



All Articles