php.ini の設定により動作が変化します。
大半のインストール環境では、APCu はデフォルトの設定で問題ありません。 しかし、本格的なユーザーは以下のパラメータのチューニングを考慮すべきです。
APCuを設定するには、ひとつ決断が必要です。
どれくらいのメモリをAPCuに割り当てるのかということです。
この値を制御するのは apc.shm_size です。
以下のこれに関するセクションを注意深く読んで下さい。
サーバーがいったん起動したら、
拡張モジュールにバンドルされている apc.php
スクリプトをドキュメントルートのどこかにコピーし、ブラウザから見てみましょう。
apcu の内部動作を詳細に分析した情報が見られるからです。
gd が有効になっている場合、面白いグラフも見られるでしょう。
apcu が動作している場合、(左側の) Cache full count
の数が、キャッシュの容量が一杯になり、
メモリを開放するためにエントリを強制的に掃除しなければならなかった回数を示しています。
強制的に掃除している間、apc.ttl が指定されている場合、
APCu はまず期限切れのエントリを削除しようとします。
つまり、TTL が期限切れになったか、
TTL が設定されずに apc.ttl 秒間アクセスがないエントリです。
apc.ttl が指定されていないか、
期限切れのエントリを削除しても十分な容量を確保できない場合、
APCu はキャッシュ全体を削除してしまいます。
強制的に掃除しなければならなかった回数は、 上手に設定されているキャッシュであれば最小にすべきです。 キャッシュが頻繁に一杯になり、強制的に開放される場合、 スクリプトのパフォーマンスに悪影響が出てしまいます。 この数値を最小にする一番簡単な方法は、APCu により多くのメモリを割り当てることです。
APCu が mmap (メモリマッピング) のサポートを有効にしてコンパイルされている場合、
APCu はメモリセグメントをひとつしか使いません。
一方で、SHM (SysV共有メモリ) を有効にしてビルドした場合は、複数のメモリセグメントを使います。
SHM は /proc/sys/kernel/shmmax で最大値を持っていますが、MMAP にはそれがありません。
一般的には、MMAP のサポートを有効にすることをおすすめします。
なぜなら、MMAPはWebサーバーが再起動したときのメモリの再要求の速度が速く、
全体として起動時のメモリ割り当ての負荷が減るからです。
| 名前 | デフォルト | 変更可能 | 変更履歴 |
|---|---|---|---|
| apc.enabled | 1 | INI_SYSTEM |
|
| apc.shm_segments | 1 | INI_SYSTEM |
|
| apc.shm_size | "32M" | INI_SYSTEM |
|
| apc.entries_hint | 512 * apc.shm_size | INI_SYSTEM |
APcu 5.1.25 より前のバージョンでは、この値のデフォルト値は 4096 でした。 |
| apc.ttl | 0 | INI_SYSTEM |
|
| apc.gc_ttl | 3600 | INI_SYSTEM |
|
| apc.mmap_file_mask | NULL | INI_SYSTEM |
|
| apc.slam_defense | 0 | INI_SYSTEM |
|
| apc.enable_cli | 0 | INI_SYSTEM |
|
| apc.use_request_time | 0 | INI_ALL |
APCu 5.1.19 より前のバージョンでは、デフォルト値は 1 でした。 |
| apc.serializer | "php" | INI_SYSTEM |
APCu 5.1.15 より前のバージョンでは、デフォルト値は "default" でした。 |
| apc.coredump_unmap | 0 | INI_SYSTEM |
|
| apc.preload_path | NULL | INI_SYSTEM |
以下に設定ディレクティブに関する 簡単な説明を示します。
apc.enabled
bool
apc.enabled を0に設定できます。
これはAPCがPHPに静的にコンパイルされている場合に役に立ちます。
なぜなら、これ以外にAPCを無効にする方法がないからです。
(DSO としてコンパイルされている場合、
php.ini の extension の行をコメントアウトすれば済みます)
apc.shm_segments
int
apc.shm_size
にシステムが許可できるできるだけ高い値を設定している場合、
この値を増やすことでAPCがメモリ不足になることを避けられるかもしれません。
apc.shm_size
string
apc.entries_hint
int
apc.ttl
int
apc.ttl 秒より古いデータであっても
まだ読み取れてしまうことがあり得るので注意してください。
この設定は、TTLが明示的に指定されたキャッシュエントリに対しては意味がありません。
apc.gc_ttl
int
0 を設定すると、時間ベースの削除機能は無効になり、リファレンスカウントがゼロになったときにのみ削除されます。
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
bool
apc.slam_defense の値を 1
に設定すると、確率的な仕組みを使うことで、
複数のプロセスが同時に同じファイルをキャッシュするのを防ぐのを助けます。
同じキーが短期間に異なるプロセスからキャッシュされようとすると、
現在のプロセスがキャッシュをスラム化させるのを防ぐため、
キャッシュをスキップします。
apc.enable_cli
int
apc.serializer
string
apc.coredump_unmap
bool
この機能は潜在的に危険です。 致命的なシグナルハンドラで共有メモリセグメントをアンマップすると、 致命的なエラーが発生したときの動作が未定義になる可能性があるからです。
注意: kernel によっては、コアダンプファイルを生成するときに 様々なタイプの共有メモリを無視する機能を提供するものがあります。 こうしたkernelの実装は、 Apache scoreboard のような重要な共有メモリセグメントも無視するかもしれません。
apc.preload_path
string
apc.use_request_time
bool