php|tek 2007で発表された、facebookの中の人のAPCの設定についての話です。軽く中身を説明します。
2007/09/21 追記
サイトの構成が変わって、スライドがデッドリンクになっていたため差し替えました。また、今月開催されたphp|works 2007での講演もアップされています。こちらのが読みやすくなっている部分があるので、こちらを参照したほうがいいかも。
- apc@facebook (PDF) in phpworks2007
- http://tekrat.com/talks
内容
- LAMP構成で、そしてAPCを使ってます
- Facebookのprofile.phpの表示を例にあげると、ノーマルのPHPに比較して、FacebookのチューンしたAPC設定では秒間リクエスト数が12倍に!
- ちょ、、それ速すぎ。。
- PHPがスクリプトをコンパイルして実行する仕組みと、APCのフック
- Opcodeってこんなものです
- webサーバのキャッシュ更新方法 (2007/09/21追記)
- ロードバランサから落とし、Apacheを再起動後に、apc_compile_file()で、ユーザのアクセスをトリガにするのではなく、PHPスクリプトをopcodeキャッシュに変換していく。さらに、Serialize形式で配布されたデータをunserializeしてapc_storeで共有メモリに格納し、それが終わったらサービスインさせる
- ここが特殊かも。ユーザアクセスをトリガにすると、アクセスが多い場合に同時に同じファイルのキャッシュを生成をしようとしたりして無駄が発生するらしい(そんなサービス作ったことないから知らない)のですが、こうやって予め作ってサービスインさせると、最初のアクセスからキャッシュが利用されるようになり効率がいいのかとおもいます。
APC設定 at Facebook
デフォルト値と違うところだけ記していますので、残りの項目及びAPCの設定項目の意味については、PHPマニュアルを参照ください。
apc.shm_segments=1
/apc.shm_size=648
- 共有メモリのサイズ。デフォルトでapc.shm_sizeが30MBのところを648MBと大幅に増やしている
apc.num_files_hint=100
/apc.user_entries_hint=640000
- ロック機構を pthread mutex lock に
- デフォルトはFile Lock。pthred mutex lockは"Experimental"扱い。(
--enable-apc-pthreadmutex
でビルド。その他のオプションはconfig.m4参照)
- デフォルトはFile Lock。pthred mutex lockは"Experimental"扱い。(
apc.stat=FALSE
- ファイルが更新されたかチェックのための stat()コールをしない。ファイルが更新されても、キャッシュが更新されることはない。更新したいときは、apc_cache_clear()叩くか、サーバを再起動する必要がある
Getting Started
- インストールは "pecl install apc" もしくは http://pecl.php.net/packages/APC/ からソースをダウンロード
- 基本的な apc.ini から始めよう
- apc.phpをドキュメントルート下に配置して、USERとPASS変数を設定しよう
- 利用状況をモニタリングして、設定を調節しよう
- アプリケーションに応じて設定項目をいろいろ調整してみよう
- CPU利用率と、最大の秒間リクエスト数の変化を計測しよう
APCには様々な設定項目があり、アクセスの多いサイトでは、うまく設定することで、よりよい効果が得られるのかなと思います。また、apc_store()、apc_fetch()をうまく使ってファイルやDBアクセスを減らすと、効果があるかもしれません。 (自分だと、例えば設定がXMLで書かれているときに、1度だけXMLを解析、配列にしてapc_store()しておくってのをよくやります)
しかし、ロック機構まで変えられるとは知らなかったす。