APCとmemcachedの比較

森川です。

memcachedのスピードを調べたときにAPCのキャッシュの方が速いというコメントを頂いたので簡単な追加調査をしてみました。

まずは、APCをインストールしてみましょう。といってもpeclがあれば以下のコマンドでインストール可能です。


pecl install APC

APCをインストールしたら、php.iniでapc.soを読み込むように設定します。


extension_dir="/usr/local/lib/php/extensions/no-debug-non-zts-20060613"
extension=apc.so

なお、extension_dirにはapc.soがあるディレクトリを指定しておきましょう。すでにextension_dirが指定されている場合は、指定されたディレクトリにapc.soがあることを確認します。ない場合は、そのディレクトリにコピーします。

あとはWebサーバを再起動します。以下のようにキャッシュ機能を使用することができます。


<?php
$ret = apc_fetch($key);
if ($ret === FALSE) {
  $result = null;
  
  // 実際の処理を記述して$resultに結果を格納する
  
  apc_store($key, $result);
  $ret = $result;
}

スピードの差を測るために、10万件のINSERTとSELECTの時間をチェックしてみると、以下のようになります。


memcache
INSERT: 4.2
SELECT: 3.2
APC
INSERT: 1.3
SELECT: 0.5

書き込んだデータはすべて「sample」という文字列ですが、そのときのメモリ使用量は以下のようになります。


memcache: 5M
APC: 10M

次に、書き込むバイト数を増やす場合は、増えたバイト数分のメモリが使用されます。そのため、1レコードあたりに必ず使用するメモリ量がAPCの方が多いですが、大きいデータを保存する場合は、無視できるでしょう。

Webサーバ単体で使用する場合は、スピードの面からもAPCのキャッシュ機能を使用したほうが、かなり高速ですが、欠点としてWebサーバを再起動するとキャッシュがすべて消えてしまう点があげられます。

稼働中のWebサーバであればそれほど再起動されないとは思いますが、頻繁なアクセスがある場合は再起動直後に大量のキャッシュを作成することになり無駄が発生してしまいます。大量のキャッシュの作成は、APCのapc.slam_defenseを設定することである程度緩和することができます。

複数のサーバでキャッシュ機能を利用する場合は、memcachedを大容量のキャッシュストレージとして使用することが可能です。PHPのMemcacheエクステンションには複数のサーバに対して保存を振り分けることが可能になるからです。ただし、キャッシュの量がそれほど重要にならない場合はAPCの方が高速になるでしょう。