APC導入後、Unable to allocate memory for pool エラーが出る場合の対処法
Webエンジニアが知っておきたいインフラの基本 ~インフラの設計から構成、監視、チューニングまで~を読んで、遅まきながら管理しているサーバに APC を導入してみました。体感的にも処理が早くなっていい感じだったのですが、しばらくしてログに
[xx-Jun-2015 xx:xx:xx UTC] PHP Warning: Unknown: Unable to allocate memory for pool. in Unknown on line 0
のエラーが続々と記録されるようになりました。
どうやら原因は、APC の設定で追加した
apc.ttl=3600
の部分だったようで、上記の設定を追加すると、設定した時間(3600秒)が経過するまでキャッシュされているエントリが滞留してしまい、apc.shm_size で設定している容量を超えてしまうと、それ以上のメモリを確保できなくなり、上記のエラーが発生するようです。
したがって、対処法としては、apc.shm_size を十分に大きくするか、apc.ttl をメモリがいっぱいにならない程度に小さくするかのいずれかとなります。apc.ttl を小さくしすぎてしまうと、キャッシュしている意味がなくなるため、調整が難しそうですが
apc.ttl=0
とすることで、メモリ上限に達した時点でキャッシュの破棄がなされる(逆に上限に達しない限りずっと残り続ける)ので、とりあえずはこの設定で様子を見ればよいと思います(ちなみに、apc.ttl=0 がデフォルトの設定で、あえていじらなければ問題は起きなかった、というのは内緒)。