nodejs分析未知和未记录的结果

时间:2016-07-01 12:43:10

标签: node.js sockets tcp

我正在运行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

1 个答案:

答案 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 很有用,因为我参与了测试和错误报告,虽然它很容易拥有多个版本的工具链,但可能对普通用户没用。