DB_Tableを利用しながらコネクションを切ったらどうなるか調べてみた

DB_Tableを利用しながらコネクションを切ったらどうなるか調べてみた。

立ち上げっぱなしになるデーモンでは、インスタンスの生成にコストがかかるので、mysqlのコネクションを張りっぱなしでやっていた。

でもそうなるとさすがに待ち受け側でコネクション数がかなりいっぱいになってしまうので切ってやらないといけない状況に。

某所で、”LL(Lightweight Languagage) なんて再接続のコスト安いんだから、javaみたいにコネクションプーリングとか考えずに毎度毎度つないじゃえばいいんだよ”、というアドバイスを小耳に挟んだ物で。

で、利用していると、DB_Tableでは最初に突っ込んであげたMDB2のインスタンスがdisconnect()されてても、なんか適当につなぎ直してくれるらしい。

そこでまずは再接続にどれぐらいのコストがかかるか検証してみた。

$dsn = 'mysql://dbuser:dbpass@dbserv/db';
$conn =& MDB2::connect($dsn);
$tbl = new hoge_DBTable($conn, 'db.hoge', 'safe');

define('MAX_COUNT', 10000);
$starttime = microtime(true);
for($i=0; $i < MAX_COUNT; $i++){
$sql = array('select'=>'data');
if(PEAR::isError($rows = $tbl->select($sql))){
die;
}
//var_dump($rows);
}
echo ($res1 = microtime(true) - $starttime)."\n";
$starttime = microtime(true);
for($i=0; $i < MAX_COUNT; $i++){
$conn->disconnect();
$sql = array('select'=>'data');
if(PEAR::isError($rows = $tbl->select($sql))){
die;
}
}
echo ($res2 = microtime(true) - $starttime)."\n";
echo $res2/$res1 . "\n";

で、これの結果


5.72950482368  // つなぎっぱなしで10000回
111.679533958 // 切りまくって10000回
19.4920045266 // 時間的な比率

かなり時間がかかってしまった。

とくにクライアント側ではなくてサーバ側の負担が大きくて、CPU使用率が50%を超えてる状況。場合によってはこれがサーバの負担になることも十分考えられる。

コメントを残す