秘密のAPI process.uvCounters() とは何か?



IIJ 大津繁樹 (@jovi0608)

2011年12月14日

このプレゼン資料は http://ohtsu.no.de/ にあります。

FireFox4以上/Chrome 限定です。話者と共にスライドが動きます。

プレゼンで「へぇ~」と思った時は、左上の「へぇ~ボタン」を押して下さい。

東京Node学園 3時限目

自己紹介(About me)

時間がないので省略。

東京ノード学園祭の自己紹介

を参照して下さい。

そもそもの始まり

v0.6に新しく process.uvCounters() という秘密のデバッグカウンターがあるよ。

http://twitter.com/#!/ryah/status/135957186156310528

で、何でしょう?



> node -e 'console.log(process.uvCounters())'
{ eio_init: 0,
  req_init: 0,
  handle_init: 7,
  stream_init: 0,
  tcp_init: 0,
  udp_init: 0,
  pipe_init: 0,
  tty_init: 0,
  prepare_init: 1,
  check_init: 2,
  idle_init: 2,
  async_init: 1,
  timer_init: 1,
  process_init: 0,
  fs_event_init: 0 }

uv_XXX_init()の初期化カウンターを表示かぁ

でもソースを見ると、

node-v0.6.5/deps/uv/src/unix/core.c

312  void uv__req_init(uv_req_t* req) {
313    /* loop->counters.req_init++; */
314    req->type = UV_UNKNOWN_REQ;
315  }

他にもインクリメントされていないカウンターがいっぱい!

じゃ直すべ、


さっそく昨日 merge 済(ありがとう! Ben)

今日の話は node-v0.6.6以降の話です。

(注意)このAPIがpublicかどうかryahに問い合わせ中ですがまだ返事ないです。

カウンターとAPI


使い方:デバッグ


void Work(uv_work_t* req) { ... }
void Done(uv_work_t* req) { ... }
Handle putQueue(const Arguments& args) {
  HandleScope scope;
  callback = Persistent<Function>::New(
    Local<Function>::Cast(args[0]));
 int status = uv_queue_work(uv_default_loop(), &request,
   Work, Done);
 return Undefined();
}
void RegisterModule(Handle<Object> exports) {
  exports->Set(String::NewSymbol("putQueue"),
    FunctionTemplate::New(putQueue)->GetFunction());
}
NODE_MODULE(thread_test, RegisterModule);

ThreadPoolを使ったC++アドオン

使い方:デバッグ



var thread_test = require('./thread_test.node');
var prev = process.uvCounters().req_init;
thread_test.putQueue(function(msg) {
  var now = process.uvCounters().req_init;
  console.log(prev,now,msg);
});

上記コードを試すと、

> node test.js
14 15 'Work Done'

使い方:モニター


require('http').createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
}).listen(1337, "127.0.0.1");
(function monitor() {
  var now = new Date();
  var c = process.uvCounters();
  console.log(now.toLocaleString(),c.tcp_init,c.req_init);
  setTimeout(monitor, 1000);
})();

コンソール出力(一般的に他のリクエストも混じるので注意)

時間 tcp_init req_init
Wed Dec 14 2011 16:24:55 GMT+0900 (JST) 1 15
Wed Dec 14 2011 16:24:56 GMT+0900 (JST) 277 292
Wed Dec 14 2011 16:24:57 GMT+0900 (JST) 1976 1992
Wed Dec 14 2011 16:24:58 GMT+0900 (JST) 4032 4049

demo



まとめ



process.uvCounters() は libuv の handle/request を扱うAPIの各種初期化されたカウンター値を出力します。

Nodeでは珍しく低レイヤーの情報を直接見れ、libuvを使ったC++アドオンモジュールなどの開発を行う場合に役に立つ場合もあるかもしれません。

ただ現状 public な APIでないので使用する際はその辺留意してお願いします。(急な仕様変更や将来使えなくなる場合があります。)

おわり

御清聴ありがとうございました。

このプレゼンは、

0へぇ~」

でした。

(0/20)
0へぇ~

閲覧中