我正在运行nodejs 4.4.7 LTS
我按照https://nodejs.org/en/docs/guides/simple-profiling/所述运行探查器:
node --prof app.js
然后:
node --prof-process isolate-something-v8.log > processed.txt
我是否遗漏了探究者或其他什么东西?
代码是什么:
NodeJS应用程序是socket.io服务器,将数据从WEB发送到C ++应用程序,而不是。
您可以从下面的结果中看到,这里有大量未计入的抽搐。在这种情况下,可能导致这种情况以及如何知道我的应用程序的瓶颈是什么?什么可以解决?
Code move event for unknown code: 0x61047523c0
Code move event for unknown code: 0x6104bf74a0
Statistical profiling result from isolate-000001E1507CF2D0-v8.log, (211705 ticks, 210634 unaccounted, 0 excluded).
[Shared libraries]:
ticks total nonlib name
[JavaScript]:
ticks total nonlib name
71 0.0% 0.0% LazyCompile: *stringToBuffer *SOMETHING*\socket.io\node_modules\engine.io\node_modules\engine.io-parser\lib\index.js:359:24
59 0.0% 0.0% LazyCompile: listOnTimeout timers.js:56:23
50 0.0% 0.0% LazyCompile: *wrapper timers.js:274:19
43 0.0% 0.0% Stub: StringAddStub_CheckNone_NotTenured
.
.
.
[C++]:
ticks total nonlib name
[Summary]:
ticks total nonlib name
1071 0.5% 0.5% JavaScript
0 0.0% 0.0% C++
202 0.1% 0.1% GC
0 0.0% Shared libraries
210634 99.5% Unaccounted
[C++ entry points]:
ticks cpp total name
[Bottom up (heavy) profile]:
Note: percentage shows a share of a particular caller in the total
amount of its parent calls.
Callers occupying less than 2.0% are not shown.
ticks parent name
210634 99.5% UNKNOWN
答案 0 :(得分:1)
始终更新到您正在使用的任何软件的最新稳定版本,Node.js 4.4.7已有几年了。
Mike Ralphson博客" Node.js - a tale of two bugs" :
"使用完全相同版本的Node.js运行这两个命令非常重要。
不幸的是,当我试图配置转换单个文件(显示执行时间增加约100%)时,Node.js 7.x和v8.0.0-test20170511830c4bf319几乎所有时间都显示为未计入:...
我已经用尽了我的Node.js调试技巧,我问我可以做些什么来尝试生成一个最小的测试用例,如果有任何主要的反模式可能会导致Node.js 7和8.
我在这个阶段确信问题出现在ajv(用于验证swagger2openapi中的JSON模式的库)或should.js(我正在使用的BDD测试/断言库)中。
Ben Noordhuis在问题中补充说,以下命令将提供更深入的分析信息,特别是关于哪些功能被去优化,以及原因:
$ node8 --trace_opt --trace_deopt swagger2openapi petstore.json
这指出了should.js中的两行:
;;; deoptimize at <D:\nodejs\swagger2openapi\node_modules\should\cjs\should.js:152:14>, no cache
;;; deoptimize at <D:\nodejs\swagger2openapi\node_modules\should\cjs\should.js:68:14>, no cache
这有助于缩小范围,我很快就提出了一个最小的测试用例,显示了退步的行为。
var should = require('should'); //11.2.0
for (var i=0;i<10000;i++) {
i.should.not.be.type('string');
}
Node.js撰稿人Anna Henningsen报道说这是可以重现的。
...
他还提出尝试将修补程序反向移植到v8 6.0中,以便它可以包含在Node.js的当前版本流中。然而,这一努力似乎停滞不前,但好消息是修复已经在Node.js 9.0的夜间构建中,其中包括v8 6.1。
计划是使用v8 6.1发布Node.js 8.7,这应该已经解决了我的所有问题,但是,在Node.js 8.7中必须禁用v8转义分析时发现了一个问题 - 可能会造成这个版本没有我希望的那么快。来自v8 6.2的修复程序是否会在进入LTS(长期支持)之前进入Node.js 8.x仍然是一个猜想,但我给你留下了我的Node.js用例的比较时序6.11 .4,8.6.0,8.7.0和9.0.0-夜间。
...
如果您在开发环境中使用基于异常的断言工具,或者依赖于抛出的错误堆栈跟踪的任何性能关键代码,或者只是想知道自Node.js 6.x以来您的性能在哪里,你一定要考虑升级到Node.js 8.7。
更新您的工具链和Nodejs。
生成一个最小的测试用例来证明错误的存在与否。
阅读您正在使用的软件的错误报告,博客和已知问题。
我之前遇到过与gcc类似的问题,未知并且不够深入或进入共享库,我使用详细调试(-ggdb IIRC)重新编译了我的整个工具链,因此我可以看到所有内容。剥离容易去除多余的。这个特定的解决方案对于 me 很有用,因为我参与了测试和错误报告,虽然它很容易拥有多个版本的工具链,但可能对普通用户没用。