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使用版は、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。

一旦中断する。