2017-02-08 3 views
4

私のNode.js(私たちはv6.9.5を実行しています)のアプリケーションは、80%を超えるCPU使用率を持っています(v4でも発生します)。いくつかの基本的なプロファイリングを行った後、子プロセスの多くを生み出していることが表示されます:Node.jsアプリは `spawn`のためにCPU使用率が高いですが、どのようにすべての呼び出しをログに記録できますか?

[Summary]: 
    ticks total nonlib name 
    345 6.7% 6.9% JavaScript 
    4451 86.7% 89.1% C++ 
    82 1.6% 1.6% GC 
    136 2.6%   Shared libraries 
    201 3.9%   Unaccounted 

---------- 

[C++]: 
ticks total nonlib name 
    2606 50.8% 52.2% node::ProcessWrap::Spawn(v8::FunctionCallbackInfo<v8::Value> const&) 
    319 6.2% 6.4% node::ContextifyScript::New(v8::FunctionCallbackInfo<v8::Value> const&) 
    284 5.5% 5.7% syscall 
    111 2.2% 2.2% write 
    31 0.6% 0.6% void node::StreamBase::JSMethod<node::StreamWrap, &(int 

私は我々のアプリ固有のchild_process.spawn/exec/execFile呼び出しのすべてにロギングを追加したが、なぜそれらのどれも説明していませんCPUはそれに多くの時間を費やしています。

私たちが使用しているnode_modulesの中にすべてchild_processのすべての呼び出しを記録したいと思います。何らかのバグ、コールバックの過度の実行、その他の悪用私たちの側で

私は最初に、追加されたロギングを伴うchild_processラッパーモジュールを作成すると考えていました。そして、私たちの依存関係がNode.jsのネイティブモジュールを使用することを期待しています。残念ながら依存関係はネイティブモジュールを使い続けます。

質問:

  • 私は、プロセスのすべてのspawnのコールのロギングを追加することができますどのように?それとも、アプリのどの部分がスポーンを引き起こしているのかをより詳細に知る良い方法がありますか?場合

私は完全にオフだ:

  • ティック比較的非常に多くのCPUを消費するnode::ProcessWrap::Spawn(v8::FunctionCallbackInfo<v8::Value> const&)のための別の理由があるかもしれません、child_process通話以外の?

何か手がかりがあります!

答えて

0

ノードを--traceフラグで開始できます。これにより、組み込みのメソッドトレースがオンになり、メソッド呼び出しごとに1行が、コール深度、呼び出し名、スクリプトの場所、パラメータ、呼び出し元の情報、呼び出し先の情報などとともにコンソールに出力されます。呼び出し。

実際には、トレースのインスタンス数をspawnとカウントして、どれだけの呼び出しが行われたかを判断します。次に、各スポーンコールの前に、コール深度チェーンを逆方向にたどって、アプリケーション内でどのようにどこでスポーンコールが発生したのかを把握するためのコール階層を表示します。

希望すると便利です。

関連する問題