端くれプログラマの備忘録 PHP [PHP] OPCacheが割り当てメモリを使い切った場合の挙動

[PHP] OPCacheが割り当てメモリを使い切った場合の挙動

PHPのOPcacheに割り当てたメモリを使い切った場合、以下のような挙動が発生します。


1. 新しいスクリプトのキャッシュが作成されない

  • OPcacheは、新しいスクリプトをキャッシュするためのメモリが不足している場合、キャッシュに追加するのを諦めます。
  • そのスクリプトはキャッシュされず、代わりにディスクから直接読み込まれ、毎回パース・コンパイルされるため、パフォーマンスが低下します。

2. エラーログの記録

  • OPcacheのメモリが不足すると、エラーログに警告が記録されます。
    • 例:
      Zend OPcache can't allocate memory for additional files

3. キャッシュされたスクリプトの削除は行われない

  • OPcacheは、一度キャッシュされたスクリプトを自動的に削除してメモリを空ける機能を持っていません。
  • そのため、メモリ不足が発生すると、キャッシュに新しいスクリプトを追加できなくなり、明示的なリセットが必要です。

4. パフォーマンスへの影響

  • メモリが不足すると、新しいスクリプトがキャッシュされないため、キャッシュのヒット率が低下します。
  • 結果的にPHPのパフォーマンスが低下し、リクエスト処理速度が遅くなる可能性があります。

5. デバッグ方法

  • メモリ使用状況は、opcache_get_status()関数を使って確認できます。
    php print_r(opcache_get_status());
    出力例には、memory_usagefree_memoryが含まれます。

解決策

1. メモリサイズを増やす

    • opcache.memory_consumptionの値を増やしてOPcacheに割り当てるメモリを増加させます。
      ini opcache.memory_consumption=128
      (デフォルトは128MB)

    2. キャッシュされるファイル数の調整

      • opcache.max_accelerated_filesを適切な値に設定します(デフォルトは10,000)。
      • これを増やすと、多くのファイルをキャッシュできますが、メモリ消費量も増えます。

      3. 不要なスクリプトのキャッシュを回避

        • opcache.blacklist_filenameを使用して、キャッシュする必要のないスクリプトを除外します。

        4. OPcacheを定期的にリセット

          • 長期間の稼働でメモリ不足が発生しやすい場合は、定期的にopcache_reset()を呼び出してキャッシュをクリアします。

          これらの対策を取ることで、OPcacheがメモリ不足になった場合の影響を最小限に抑えることができます。