LoginSignup
4
4

More than 5 years have passed since last update.

APCU の apc.ttl の動き

Posted at

まとめ

  • メモリがいっぱいになると TTL が切れてるエントリが全部クリアされる
    • apc.ttl=0 だと TTL が無限なのでクリアされることはない
  • それでもメモリが足りなければキャッシュがすべてクリアされる
  • TTL が切れていてもメモリがいっぱいにならない限りエントリは有効なまま

詳細

// 100KB ぐらいの文字列をキャッシュしつつ apcu のステータスを表示
$str = str_repeat('x', 1024*100);
for ($i=0; $i<10; $i++) {
    apcu_store("a.$i", $str);
    print_r([$i => apcu_sma_info(true) + apcu_cache_info(true)]);
}

CLI で apcu を有効に、TTL に Request time は使わずに現在時刻を使う、サイズ 1M、TTL 1秒で実行。

php -d apc.enable_cli=1 -d apc.use_request_time=0 -d apc.shm_size=1M -d apc.ttl=1 z.php

メモリがいっぱいになった時点でキャッシュのすべてのエントリがクリアされる(出力を見やすくするために抜粋)。

    [8] => Array
            [seg_size] => 1048440
            [avail_mem] => 82488
            [num_slots] => 4099
            [ttl] => 1
            [num_entries] => 9
            [expunges] => 0

    [9] => Array
            [seg_size] => 1048440
            [avail_mem] => 911800
            [num_slots] => 4099
            [ttl] => 1
            [num_entries] => 1
            [expunges] => 1

$str = str_repeat('x', 1024*100);

// 500 KB ぐらいキャッシュする
for ($i=0; $i<5; $i++) {
    apcu_store("a.$i", $str);
}

// apc.ttl=1 なので TTL 切れになる
sleep(3);

// エントリをフェッチ
for ($j=0; $j<$i; $j++) {
    apcu_fetch("a.$j");
}

// さらに 400 KB ぐらいキャッシュしつつステータス表示
for (; $i<9; $i++) {
    apcu_store("a.$i", $str);
    print_r([$i => apcu_sma_info(true) + apcu_cache_info(true)]);
}

// エントリをフェッチ
for ($j=0; $j<$i; $j++) {
    apcu_fetch("a.$j");
}

// さらに 100 KB ぐらいキャッシュしつつステータス表示
for (; $i<10; $i++) {
    apcu_store("a.$i", $str);
    print_r([$i => apcu_sma_info(true) + apcu_cache_info(true)]);
}

// エントリをフェッチ
for ($j=0; $j<$i; $j++) {
    apcu_fetch("a.$j");
}

// 最後にステータス表示
print_r([$i => apcu_sma_info(true) + apcu_cache_info(true)]);

↑と同じように実行する。

php -d apc.enable_cli=1 -d apc.use_request_time=0 -d apc.shm_size=1M -d apc.ttl=1 z.php

メモリがいっぱいになったときに TTL が切れてるエントリがザクッと消えている。

TTL が切れていてもメモリがいっぱいになるまでは有効なキャッシュとして残ったまま(途中で TTL が切れたキャッシュを fetch しているのにそのときは num_misses が増えていない)。

    [5] => Array
            [seg_size] => 1048440
            [avail_mem] => 393480
            [ttl] => 1
            [num_hits] => 5
            [num_misses] => 0
            [num_inserts] => 6
            [num_entries] => 6
            [expunges] => 0

    [6] => Array
            [seg_size] => 1048440
            [avail_mem] => 289816
            [ttl] => 1
            [num_hits] => 5
            [num_misses] => 0
            [num_inserts] => 7
            [num_entries] => 7
            [expunges] => 0

    [7] => Array
            [seg_size] => 1048440
            [avail_mem] => 186152
            [ttl] => 1
            [num_hits] => 5
            [num_misses] => 0
            [num_inserts] => 8
            [num_entries] => 8
            [expunges] => 0

    [8] => Array
            [seg_size] => 1048440
            [avail_mem] => 82488
            [ttl] => 1
            [num_hits] => 5
            [num_misses] => 0
            [num_inserts] => 9
            [num_entries] => 9
            [expunges] => 0

    [9] => Array
            [seg_size] => 1048440
            [avail_mem] => 497144
            [ttl] => 1
            [num_hits] => 14
            [num_misses] => 0
            [num_inserts] => 10
            [num_entries] => 5
            [expunges] => 0

    [10] => Array
            [seg_size] => 1048440
            [avail_mem] => 497144
            [ttl] => 1
            [num_hits] => 19
            [num_misses] => 5
            [num_inserts] => 10
            [num_entries] => 5
            [expunges] => 0

おまけ

単位をつけるとき m だと分じゃなくてメガ。

php -d apc.enable_cli=1 -d apc.ttl=1s -r 'print_r(apcu_cache_info(true));' | grep ttl
#=>     [ttl] => 1

php -d apc.enable_cli=1 -d apc.ttl=1m -r 'print_r(apcu_cache_info(true));' | grep ttl
#=>     [ttl] => 1048576

php -d apc.enable_cli=1 -d apc.ttl=1h -r 'print_r(apcu_cache_info(true));' | grep ttl
#=>     [ttl] => 1

php -d apc.enable_cli=1 -d apc.ttl=1k -r 'print_r(apcu_cache_info(true));' | grep ttl
#=>     [ttl] => 1024

php -d apc.enable_cli=1 -d apc.ttl=1g -r 'print_r(apcu_cache_info(true));' | grep ttl
#=>     [ttl] => 1073741824
4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4