LearnBoost-Socket.IO-nodeのプロファイリング失敗
http://d.hatena.ne.jp/ndruger/20101107/1289114972 でLearnBoost-Socket.IO-nodeを試してみたが、websocketを利用しても妙にレスポンスが遅くなっている。
wiresharkで見ると、1つのTCPのパケットに複数のsend()の内容が入っている。Socket.ioのコードでまとめているのかと思ったけど、コードを見るとframeの印の追加だけで基本的にまとめてないので、Socket.ioのどこかの処理が重いため、Node.jsかその下位にて、パケットがまとめられていると予想。
Node.jsはv8のプロファイリングが使えるので、とりあえず取ってみる。
v8のインストール&ビルド&プロファイリングのテスト
http://code.google.com/intl/ja/apis/v8/build.html
http://code.google.com/p/v8/wiki/V8Profiler
svnでチェックアウトして、
sconsをダウンロード&インストール&プロファイリングのテスト
$ scons prof=on
$ scons d8
$ ./d8 --prof test.js
test.jsは適当な奴
cygwin
$ tools/windows-tick-processor.bat v8.log
debian
$ tools/linux-tick-processor v8.log
両方成功
cygwinでNode.jsのプロファイリング
$ node --prof --log-snapshot-positions pingpong.js
$ tools\windows-tick-processor.bat C:\soft\net\Apache2.2\htdocs\websocket_pingpong\v8.log
下記でエラーが出るのでとりあえず除く
code-creation,Function,0x7feddd60,94,"str. .str.split. .map.join. sys:195"
出力されない。cygwinのパスを修正しても同じ。
このままがんばってもcygwinでのnode.jsは茨の道っぽいので、とりあえずdebianで進める方針に変更。
debianでNode.jsのプロファイリング
$ node --prof --log-snapshot-positions pingpong.js
$ tools/linux-tick-processor /var/www/websocket_pingpong/v8.log
結果
- socket.io未使用版
- socket.io使用版
socket.io使用版は、node::Write()が占める割合がざっくりと下がっている。LearnBoost-Socket.IO-nodeの関数は現れてないので、LearnBoost-Socket.IO-nodeの多数の箇所から読んでいるBuild in methodが重いってことか?
とりあえず今日はここまで。後はv8のプロファイルの読み方をもう少し確認してから。
(2010/11/17追記) "A builtin from the snapshot"の解決
node.jsでのv8コンパイルは、Snapshot-based VM build(未理解)をしているらしい。
プロファイル時に--log-snapshot-positionsを付けると、ログにdeserializeしたobjectが出される
linux-tick-processorにて、--snapshot-logでVMビルド時のスナップショットログを指定すると、それが読めるようになるらしい。
$ /data/source/ref/v8/tools/linux-tick-processor --snapshot-log={node-v0.2.4の場所/build/default/obj/release/snapshot.log}
これで、"A builtin from the snapshot"は消えた。
(2010/11/17追記) "Builtin: LazyCompile"の解決失敗
"Builtin: LazyCompile"の後に関数が出ない。
parseInt()をループする処理を追加してプロファイルを取ったら、parseInt()はプロファイル結果に出力されていたので、v8のjs関数が出力されないわけではないため、どうやらv8/node.jsのc/c++の関数っぽい。
Node.jsのconfigureを"--without-snapshot --debug"のオプション付きでビルドしても同じ。
oprofileでc/c++関数を特定しようとしたが、JIT対応は0.9.4で、debian packageは0.9.3。
一旦中断する。