APCの動作 2 キャッシュの削除

前回からの続き

どんどん内容が怪しくなってきているので、引き続きツッコミは歓迎しておりまする。

削除

  • apc_cache_expunge キャッシュの片付けを行う関数
    • メモリの確保に失敗すると呼ばれる
    • 呼ばれるとapc.phpでの「Cache full count」がひとつ増える
      • ttlが定義されていない(0)
        • キャッシュを全てremove_slotで削除する
      • ttlが定義されている
        • アクセス時刻からttl経過していたらremove_slotで削除する
    • 削除するキャッシュはシーケンシャルに探す 多分O(n)
  • remove_slot
    • キャッシュをdeleted_listに追加する
    • 実際の削除は後でまとめて行う*1
    • 色んな場所から呼ばれる
      • apc_cache_clear
      • apc_cache_expunge
      • apc_cache_insert
      • apc_cache_user_insert
      • apc_cache_find_slot
      • apc_cache_user_find
      • apc_cache_user_delete
  • process_pending_removals
    • deleted_listを走査する
      • ref_countが0以下
      • 削除されてからgc_ttl経過している
    • いずれかの条件に当てはまるキャッシュを削除する
      • キャッシュをfree_slotに渡して実際に削除する
    • キャッシュを追加する際に呼び出される
      • apc_cache_insert
      • apc_cache_user_insert

メモ

  • ref_countの役割がよくわからない
  • expungeは必ずしもキャッシュを削除するわけではない
    • ttlが大きかったり全てのキャッシュへのアクセス頻度が高い(メモリの割り当てが少なすぎる)場合は削除されない可能性が高い
      • PHPファイルが読み込まれる度に無駄なループがグルグル回る

*1:即座に行う場合もある