2

私たちは、中央キャッシュ サービス (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 の方がはるかに高速です。しかし、それを安定させるにはどうすればよいでしょうか。

よろしく、 アンドレアス

4

2 に答える 2

1

freebsd から派生したオペレーティング システムを使用していない限り、スピンロックを使用するのは得策ではありません。スピンロックは地球上で最悪の種類の同期です。freebsd でそれらを使用しなければならない唯一の理由は、実装者がミューテックスと rwlocks の PTHREAD_PROCESS_SHARED サポートを含めることを否定したためです。

于 2013-11-11T07:32:52.723 に答える