ラベル APC の投稿を表示しています。 すべての投稿を表示
ラベル APC の投稿を表示しています。 すべての投稿を表示

2012年3月22日木曜日

PHP 5.4.0 + APC 3.1.9でapacheが再起動できないらしい



PHP5.4.0の動作検証など行っていますが、
一見問題ないように見えます。
とはいえ、まだリリースしたばかりなのでいろいろあるものですね。

かゆいところで、Apacheが再起動(restart or graceful)できないという現象がありました。
ちなみに、停止(stop)、起動(start)は問題なくできます。
そんな環境はこちら


  • Cent OS 6.2

  • Apache HTTP Server 2.2.22

  • PHP 5.4.0 + APC 3.1.9



再起動すると次のログが出力されhttpdが起動しません。


[Thu Mar 22 10:32:38 2012] [notice] seg fault or similar nasty error detected in the parent process


stop、startでは問題なくhttpdの起動と停止ができます。
また、apcを外すとこちらも問題なかったためやはりapcが原因のようです。
念のため、pecl apcのリポジトリから最新版をインストールしてみました。

pecl apcをリポジトリからインストール




svn co http://svn.php.net/repository/pecl/apc/trunk/ apc-trunk
cd apc-trunk
phpize
./configure --enable-apc --with-php-config=/usr/local/php/bin/php-config
make
make install


すんなり再起動できました。
インストールしたapcの情報をphpinfo()で確認すると、













APC Supportenabled
Version3.1.9
APC DebuggingDisabled
MMAP SupportEnabled
MMAP File Maskno value
Locking typepthread mutex Locks
Serialization Supportphp
Revision$Revision: 324326 $
Build DateMar 22 2012 11:34:52

バージョンに変更はないですが、開発版なのでいろいろ違うのかと。

なんらかの事情?で、力技で乗り切るには、
apachectlに次の内容を追記します。

restart)
echo 'apache httpd stop'
$HTTPD -k stop
echo 'sleep 3'
sleep 3
echo 'apache httpd start'
$HTTPD -k start
ERROR=$?
;;


まあ、使わないと思いますが。




2011年11月21日月曜日

apc_fetch() VS Memcached::get() - ローカル環境キャッシュパフォーマンス比較



ローカル環境でのキャッシュは、APCとMemcachedでどちらを使うか?
apc_fetchが手軽に利用できるのでこちらを使ってみましたが、
memcachedでいいんじゃないかと・・・気になったので計測してみました。
ただし、CLI環境です。
テスト環境(DELL PowerEdge R200改)









CPUIntel Xeon CPU X3360 2.83GHz (4core)
メモリ8GB
HDD1TB (Hitachi HDT721010SLA360)
OSCentOS 6.0 (2.6.32-71.29.1.el6.x86_64)


apcの設定



apc.enabled=On
apc.enable_cli=On
apc.shm_size="128M"



比較に使用したソースコード(PHP)


$id = 'testtest';
$test_data = array();
$mem = new Memcached();
$mem->addServer('/tmp/memcached.socket',0);

for ($i = 0; $i < 1000; $i++) {
$cur_array = array();
for ($j = 0; $j < 10; $j++) {
$cur_array[$j] = '0123456789abcdef';
}
array_push($test_data,$cur_array);
}

apc_store($id,$test_data,1000);
$mem->set($id,$test_data,1000);

$time_start = microtime(true);
for ($i = 0; $i < 10000; $i++) {
$res = apc_fetch($id);
}
$time_end = microtime(true);
$diff_apc = $time_end - $time_start;

$time_start = microtime(true);
for ($i = 0; $i < 10000; $i++) {
$res = $mem->get($id);
}
$time_end = microtime(true);
$diff_mem = $time_end - $time_start;
echo 'APC : ' . $diff_apc . PHP_EOL;
echo 'Mem : ' . $diff_mem . PHP_EOL;



結果









関数平均処理時間(ms)
apc_fetch()10
Memcached::get5

結果は、memcachedが2倍速い
また、new MemcachedとaddServer()を毎回実行した場合でも、
0.5msほどしか影響しませんでした。
5msの違いでも、10000回実行すると50秒差が出ます。
パフォーマンス優先ならmemcachedですね。

ちなみにmemcachedでunix socketを使用していますが、
IPアドレス(127.0.0.1)でのアクセスでも同程度の処理速度となりました。
ローカル環境でtcpポートの枯渇が気になる場合は、unix socketがオススメです。