SQLと配列にすべき

PHP Akelosで製造したサイト、アクセス急増につきチューニング。memcacheするには、ActiveRecordは大きすぎる件。

物理的なモノは増やせないので、せめて仮想専用サーバ上に移動。
そして、memcachedを使ってみました。

しかし、いくらmemcachedを使っても「全然キャッシュにヒットしない」という問題が生じる。というか、キャッシュしようとしたActiveRecordインスタンスがでかすぎる様子で、どんどんキャッシュが追いやられてしまう状態に。。。

そこで、

PHPオブジェクトのメモリ使用量を調べる方法

という旨を、おしえてついったーしてみたのだけれど、レスがつくほどの人脈はナイのであった。
(ココ本当に教えてほしい、どうかお願いします、お願いします!)

とりあえず、デカさの比較、という意味でこんな方法で比較してみました。

 function objsize($obj){
  return strlen( serialize($obj) );
 }

これは断じて、「メモリ量」の比較ではないのですが、大きさを「なんとなく認識」するにはいいかも。

 echo objsize(1);  // => 4
 echo objsize("1"); // => 8

などとなる。

さて、これで、同じデータを扱うActiveRecordと配列の大きさを比較してみると(Akelosで生SQLを扱う方法はこちら)、

 //ActiveRecordの配列。
 echo objsize( $User->findAll() ); // => 684324

 //配列の配列。
 echo objsize(
  $User->_executeSql("select * from users")->GetArray()
 ); // => 62511

なんと、10倍もデカい(ように感じて悶える)。

ということで、SQL&配列にすべき!

一覧表示系の画面では、すべて配列取得に変更して、必要なカラムだけ抽出して、取得した配列はmemcachedへ放り込む。
という作戦にしました。

どうだ、ハックだろ!というか、O-Rマッパ以前の普通のスタイルに戻しただけだな。実際のところ、この対処で、負荷試験的にはキャパシティが3倍くらいになった。

疾風のごとく設計&実装できてしまうActiveRecordの優位性を否定するつもりはないけれど、やはりサービスインする時点では、特に参照機能は、SQLと配列での実装に切り替えておくべき。

という自分への教訓でした。

あと、

Apacheから、いらないモジュールは全部削除した。

MySQLのquery_cache_sizeの割り当ても忘れない。

これらもかなり重要。


コメント
ymnk
2008/05/26
>PHPオブジェクトのメモリ使用量を調べる方法
>という旨を、おしえてついったーしてみたのだけれど、レスがつくほどの人脈はナイのであった。
>(ココ本当に教えてほしい、どうかお願いします、お願いします!)

直接的な方法ではありませんが、例えば、
$User->findAll()
の実行の前後で memory_get_usage() の値を
比べてみるのはどうでしょう?
武田ソフト
2008/05/27
ymnkさん、ありがとうございます!(訊いてみるもんだなぁ)
memory_get_usageは初めて知り、勉強になりました。
「キャッシュコスト」というよりは「生成コスト」に近いですし、そのほうが現実的な測量だと思いました。
ymnk
2008/05/27
あっ、でも、ポストした後に思ったんですが、
"memcachedを使っても「全然キャッシュにヒットしない」"
という趣旨では、serializeした後の大きさを比較するのが
一番ですね...
武田ソフト
2008/05/27
きっかけの趣旨はそうでしたが、やっぱり「こんなでかいものを生成するコストが、アクセスのたびにかかっている」という認識がおかげさまでできました。

ちなみに生成コストで5倍くらい違いました。

追記メモ:memcached -vv とすると、キャッシュで使うメモリ量を表示できる。ここではstrlen(selialize)の結果とほぼ同じ。
じょむにー
2008/05/28
日記とは関係のないネタですが、cacti導入してみました。会社で立てた研修用テストサーバに突っ込んだので今見れませんけどもorz

CentOS5で試したのですが、yum使ってしまえば簡単に終わってしまったので拍子抜け、、

snmpの設定が必要ですが、MRTGより簡単なので導入してみてはどうでしょう?

参考URL:http://centossrv.com/rrdtool-cacti.shtml
武田ソフト
2008/05/28
じょむにーさん、やっぱりcacti良かった?
こちらでも試してみます、ありがとうございます。

MRTG使ってたときはソレ自体が負荷になって、「テメーが負荷かけてんのにテメーがアラートを上げる」みたいなことになった記憶がありますw

コメントしてください
お名前:
入力しなければ「匿名さん」。20字以内。

メール:
入力しても表示しません

URL:
入力すればリンクが貼れます


コメント: