私たちは、中央キャッシュ サービス (redis) の各サーバーのローカル 2 層キャッシュとして、高負荷環境で APC ユーザー キャッシュを展開しようとしています。基本的に、Facebookが何をしたかを調べました(数年前):
http://www.slideshare.net/guoqing75/4069180-caching-performance-lessons-from-facebook http://www.slideshare.net/shire/php-tek-2007-apc-facebook
しばらくは問題なく動作しますが、負荷が高い状態で数時間経過すると、APC で問題が発生し、mod_php 全体で PHP が実行されなくなります。シンプルな PHP スクリプトでさえ応答しなくなりましたが、静的リソースは引き続き Apache によって配信されます。実際にクラッシュすることはなく、segfault もありません。APC の最新の安定版と最新のベータ版を試し、pthreads、スピン ロックを試しましたが、毎回同じ問題が発生しました。私たちは APC が消費できるメモリをはるかに多く提供しました。クラッシュの 1 分前には 2% の断片化があり、メモリの約 90% が空いていました。「クラッシュ」した場合、エラー ログには何も見つかりません。Apache を再起動するだけで解決します。スピン ロックの場合のみ、次のような php エラーが発生します。
PHP 致命的なエラー: 不明: 行 0 の不明でスタック スピンロック (0x7fcbae9fe068) が検出されました
これは、タイムアウトを使用しないため、pthreads では発生しない一種のタイムアウトのようです。
起こっていることはおそらく次のようなものです: http://notmysock.org/blog/php/user-cache-timebomb.html
いくつかの数字: サーバーには 1 秒あたり約 400 の APC ユーザー キャッシュ ヒットと 1 秒あたり約 30 の挿入 (私が思うに多くのことです) があり、1 つのリクエストには約 20 ~ 100 のユーザー キャッシュ リクエストがあります。ユーザーキャッシュには約 300.000 の変数があり、すべて ttl を使用します (中央の redis のみに ttl なしで保存します)。
APC 設定は次のとおりです。
apc.shm_segments=1
apc.shm_size=4096M
apc.num_files_hint=1000
apc.user_entries_hint=500000
apc.max_file_size=2M
apc.stat=0
現在、スピン ロックでコンパイルされたバージョン 3.1.13-beta を使用しており、古い PHP 5.2.6 (これはレガシー アプリです。この PHP バージョンも問題になる可能性があると聞いたことがあります)、Linux 64 ビットで使用されています。
デバッグするのは非常に困難です。apc やシステムなどから 1 分ごとに取得できる限り多くのデータを収集する監視スクリプトを作成しましたが、クラッシュの 1 分前であっても、異常なことは何も確認できません。
ここで同様の問題をたくさん見てきましたが、今のところ、問題を解決する解決策を見つけることができませんでした. そして、私がそのようなものを読んだとき:
http://webadvent.org/2010/share-and-enjoy-by-gopal-vijayaraghavan
高負荷環境では、ローカル ユーザー キャッシュに APC を使用することが最善のアイデアであるかどうかはわかりません。ここでは既に memcached を使用しましたが、APC の方がはるかに高速です。しかし、それを安定させるにはどうすればよいでしょうか。
よろしく、 アンドレアス