我的Node.js (我们正在运行v6.9.5)应用程序的CPU使用率通常超过80% (也发生在v4上)。在做了一些基本的分析之后,它似乎产生了许多子进程:
[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会花这么多时间在上面。
现在,我想将child_process的所有调用记录在我们使用的所有node_modules中,以防有一个模块由于某些错误、过度急切地执行回调或其他错误而发送过多的调用。
最初,我想通过添加日志来创建child_process包装器模块,并希望我们的依赖项将使用它来支持Node.js的本机模块,不幸的是,依赖项似乎一直在使用本机模块。
问题:
spawn调用上添加日志记录?或者是否有更好的方法来更深入地了解我们的应用程序的哪一部分是导致产卵的原因?万一我完全离开了
node::ProcessWrap::Spawn(v8::FunctionCallbackInfo<v8::Value> const&)来说,除了child_process调用之外,还有什么不同的原因来消耗如此多的CPU代码呢?任何线索都是感激的!
发布于 2017-03-26 17:27:16
您可以使用--跟踪标志启动节点。这将导致内置的方法跟踪被打开,每个方法调用将在控制台中打印一行,并将调用深度、调用名称、脚本位置、参数、调用者的信息、被调用者的信息等与调用的上下文相关联。
因此,您实际上需要计算跟踪中spawn实例的数量,以确定调用了多少次。第二,在每个派生调用之前,您将在调用深度链中向后遍历,以查看调用的传家宝,以确定我们在应用程序中如何和在何处发起派生调用。
希望这能有所帮助!
https://stackoverflow.com/questions/42117186
复制相似问题