php.ini の設定により動作が変化します。
大半のインストール環境では、APCu はデフォルトの設定で問題ありません。 しかし、本格的なユーザーは以下のパラメータのチューニングを考慮すべきです。
APCuを設定するには、ひとつ決断が必要です。
どれくらいのメモリをAPCuに割り当てるのかということです。
この値を制御するのは apc.shm_size
です。
以下のこれに関するセクションを注意深く読んで下さい。
サーバがいったん起動したら、
拡張機能にバンドルされている apc.php
スクリプトをドキュメントルートのどこかにコピーし、ブラウザから見てみましょう。
APCu の内部動作を詳細に分析した情報が見られるからです。
GD が有効になっている場合、面白いグラフも見られるでしょう。
APCu が動作している場合、(左側の) Cache full count
の数が、キャッシュの容量が一杯になり、apc.ttl
秒間アクセスされていないエントリを強制的に掃除しなければならなかった回数を示しています。
この数字は上手に設定されているキャッシュであれば最小にすべきです。
キャッシュが頻繁に一杯になり、強制的に開放される場合、
スクリプトのパフォーマンスに悪影響が出てしまいます。
この数値を最小にする一番簡単なな方法は、APCu により多くのメモリを割り当てることです。
APCu が mmap (メモリマッピング) のサポートを有効にしてコンパイルされている場合、
APCu はメモリセグメントをひとつしか使いません。
一方で、SHM (SysV共有メモリ) を有効にしてビルドした場合は、複数のメモリセグメントを使います。
SHM は /proc/sys/kernel/shmmax
で最大値を持っていますが、MMAP にはそれがありません。
一般的には、MMAP のサポートを有効にすることをおすすめします。
なぜなら、MMAPはWebサーバが再起動したときのメモリの再要求の速度が速く、
全体として起動時のメモリ割り当ての負荷が減るからです。
名前 | デフォルト | 変更可能 | 変更履歴 |
---|---|---|---|
apc.enabled | "1" | PHP_INI_SYSTEM | |
apc.shm_segments | "1" | PHP_INI_SYSTEM | |
apc.shm_size | "32M" | PHP_INI_SYSTEM | |
apc.entries_hint | "4096" | PHP_INI_SYSTEM | |
apc.ttl | "0" | PHP_INI_SYSTEM | |
apc.gc_ttl | "3600" | PHP_INI_SYSTEM | |
apc.mmap_file_mask | NULL | PHP_INI_SYSTEM | |
apc.slam_defense | "1" | PHP_INI_SYSTEM | |
apc.enable_cli | "0" | PHP_INI_SYSTEM | |
apc.use_request_time | "0" | PHP_INI_ALL | APCu 5.1.19 より前のバージョンでは、デフォルト値は "1" でした。 |
apc.serializer | "php" | PHP_INI_SYSTEM | APCu 5.1.15 より前のバージョンでは、デフォルト値は "default" でした。 |
apc.coredump_unmap | "0" | PHP_INI_SYSTEM | |
apc.preload_path | NULL | PHP_INI_SYSTEM |
以下に設定ディレクティブに関する 簡単な説明を示します。
apc.enabled
bool
APC を無効にする場合、apc.enabled
を0に設定できます。
これはAPCがPHPに静的にコンパイルされている場合に役に立ちます。
なぜなら、これ以外にAPCを無効にする方法がないからです。
(DSO としてコンパイルされている場合、
php.ini
の extension
の行をコメントアウトすれば済みます)
apc.shm_segments
int
コンパイラキャッシュに割り当てる共有メモリセグメントの数。
APC の共有メモリが不足したが、apc.shm_size
にシステムが許可できるできるだけ高い値を設定している場合、
この値を増やすことでAPCがメモリ不足になることを避けられるかもしれません。
apc.shm_size
string
個別の共有メモリセグメントのサイズ。 このFAQ で説明している短縮記法を使います。 デフォルトでは、システムによって(ほとんどのBSD系)は、 共有メモリセグメントのサイズの限界値がとても小さい場合があります。
apc.entries_hint
int
異なる値を保存する数のおおよその"ヒント"。 わからない場合はゼロを設定して下さい。
apc.ttl
int
あるキャッシュエントリのスロットを別のエントリが必要としている場合に、 キャッシュエントリがアイドル状態でいて良い秒数。 この値をゼロに設定すると、新しいエントリがキャッシュされない間は APCのキャッシュは潜在的に古いもので埋められる可能性があります。 キャッシュのメモリが不足した場合、ttl が0の場合、キャッシュは完全に削除されます。 0より大きな場合、APC は期限切れのエントリから削除しようとします。
apc.gc_ttl
int
キャッシュエントリがガベージコレクションのリストに残っても良い秒数。 この値はキャッシュされたソースファイルを実行中にWebサーバが死んだ場合のフェイルセーフを提供します。 つまり、このソースファイルが変更された場合、 古いバージョンに割り当てられたメモリはTTLに達するまで絶対に要求されないからです。 この機能を無効にするにはゼロを設定して下さい。
apc.mmap_file_mask
string
--enable-mmap
を使ってPHPをコンパイルした場合に、
mmapされたメモリ領域をファイルベースか共有メモリベースにするかを決めるために、
mmapモジュールに渡すmktempスタイルのファイルマスク。
ファイルベースのmmapの場合、
/tmp/apc.XXXXXX
のように設定します
(X
はちょうど6つにして下さい)。
POSIXスタイルの shm_open/mmap を使う場合、
.shm
をマスクのどこかに含めて下さい。
e.g. /apc.shm.XXXXXX
。
匿名のmmapされたメモリを使うために
kernel の /dev/zero
インターフェイスを使う場合、
この値に /dev/zero
も設定できます。
apc.slam_defense
int
とても負荷が高いサーバでは、いつサーバを起動したり、
変更したりしても、同じファイルを同時にキャッシュしようとする
多くのプロセスの競合が発生します。
このオプションは、キャッシュされていないファイルをキャッシュ
しようとする動作をスキップするプロセスの割合を設定します。
たとえば、apc.slam_defense
の値を
75
に設定すると、
キャッシュされていないファイルをキャッシュしないプロセスは75%いることになります。
よって、この設定値を大きくすればするほど、
キャッシュのスラム化を防げることになります。
この機能を無効にするには 0
を設定します。
apc.enable_cli
int
この設定はほとんどの場合、テストかデバッグに使います。 これを設定すると、CLI版PHPでAPCが有効になります。 通常の状態では、CLI リクエストのたびにAPCキャッシュを生成し、 収集し、破棄するのは望ましくありません。しかし、テストシナリオによっては、 CLI版のPHPでAPCを簡単に有効に出来た方が便利な場合があります。
apc.serializer
string
APCにサードパーティーのシリアライザを使わせる場合に使います。
apc.coredump_unmap
bool
SIGSEGV のようなシグナルのシグナルハンドラをAPCで有効にします。 ハンドラでは、シグナルを受け取ったときにコアファイルに書き込みます。 これらのシグナルを受け取った場合、 APC はコアファイルから除外するために共有メモリセグメントをアンマップしようとします。 この設定は致命的なシグナルを受け取ったり、 APCの共有メモリセグメントの数を大きく設定している場合に、 システムの安定性を向上させる可能性があります。
この機能は潜在的に危険です。 致命的なシグナルハンドラで共有メモリセグメントをアンマップすると、 致命的なエラーが発生したときの動作が未定義になる可能性があるからです。
注意:
kernel によっては、コアダンプファイルを生成するときに 様々なタイプの共有メモリを無視する機能を提供するものがあります。 こうしたkernelの実装は、 Apache scoreboard のような重要な共有メモリセグメントも無視するかもしれません。
apc.preload_path
string
オプション。キャッシュデータを起動時に読み込むディレクトリのパスを設定します。
apc.use_request_time
bool
TTL に SAPI リクエストの開始時刻を使います。