おぎろぐはてブロ

なんだかんだエンジニアになって10年以上

facebookでのAPCの設定

php|tek 2007で発表された、facebookの中の人のAPCの設定についての話です。軽く中身を説明します。

2007/09/21 追記

サイトの構成が変わって、スライドがデッドリンクになっていたため差し替えました。また、今月開催されたphp|works 2007での講演もアップされています。こちらのが読みやすくなっている部分があるので、こちらを参照したほうがいいかも。

内容

  • 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
    • apc.num_files_hintは、キャッシュされるファイルの総数のヒント情報。(要はハッシュテーブルの最適化に使われるみたい) デフォルト1000のところ、そんなに使わないということで100に
    • apc.user_entries_hintは、ユーザキャッシュ変数の総数のヒント。デフォルト4096から大幅アップ
  • ロック機構を pthread mutex lock に
    • デフォルトはFile Lock。pthred mutex lockは"Experimental"扱い。(--enable-apc-pthreadmutexでビルド。その他のオプションはconfig.m4参照)
  • apc.stat=FALSE
    • ファイルが更新されたかチェックのための stat()コールをしない。ファイルが更新されても、キャッシュが更新されることはない。更新したいときは、apc_cache_clear()叩くか、サーバを再起動する必要がある

Getting Started

  • インストールは "pecl install apc" もしくは http://pecl.php.net/packages/APC/ からソースをダウンロード
  • 基本的な apc.ini から始めよう
    • apc.enabled=1
    • apc.shm_size=100M
  • apc.phpをドキュメントルート下に配置して、USERとPASS変数を設定しよう
    • 利用状況をモニタリングして、設定を調節しよう
  • アプリケーションに応じて設定項目をいろいろ調整してみよう
    • APCユーザ変数(apc_store/fetchで格納・取得するもの)を追加してみる
    • ロック方式を変えてみる
    • apc.stat=0 設定を試してみる
  • CPU利用率と、最大の秒間リクエスト数の変化を計測しよう

APCには様々な設定項目があり、アクセスの多いサイトでは、うまく設定することで、よりよい効果が得られるのかなと思います。また、apc_store()、apc_fetch()をうまく使ってファイルやDBアクセスを減らすと、効果があるかもしれません。 (自分だと、例えば設定がXMLで書かれているときに、1度だけXMLを解析、配列にしてapc_store()しておくってのをよくやります)
しかし、ロック機構まで変えられるとは知らなかったす。