【问题标题】:nodejs profiling; what can 'Unknown' benodejs 分析; “未知”是什么
【发布时间】:2012-12-22 21:27:23
【问题描述】:

在分析 nodejs 程序时,我发现 61% 的滴答声是由“未知”引起的(见下文)。这会是什么?我应该寻找什么?

gr,

科恩

Statistical profiling result from node, (14907 ticks, 9132 unaccounted, 0 excluded).

 [Unknown]:
   ticks  total  nonlib   name
   9132   61.3%

 [Shared libraries]:
   ticks  total  nonlib   name
   1067    7.2%    0.0%  C:\Windows\SYSTEM32\ntdll.dll
     55    0.4%    0.0%  C:\Windows\system32\kernel32.dll

 [JavaScript]:
   ticks  total  nonlib   name
   1381    9.3%   10.0%  LazyCompile: *RowDataPacket.parse D:\MI\packet.js:9
......

【问题讨论】:

    标签: node.js profiling v8


    【解决方案1】:

    您正在使用 64 位版本的 Node.JS 来运行您的应用程序,并使用 32 位版本的 d8 shell 来处理您的v8.log。 使用带有 ia32 作为 d8 shell 构建目标的 32 位版本的 Node.JS 或带有 x64 作为 d8 shell 构建目标的 64 位版本的 Node.JS 应该可以解决您的问题。

    【讨论】:

      【解决方案2】:

      尝试构建具有分析支持的 v8:

      scons prof=on d8
      

      确保您运行node --prof 的版本与v8 版本相对应

      然后tools/linux-tick-processor path/to/v8.log 应该会显示完整的个人资料信息。

      【讨论】:

      • scons 现在已被弃用,取而代之的是 gyp。
      【解决方案3】:

      您是否正在加载任何已构建依赖项的模块?

      基本上,“未知”的意思是“下落不明”(查看tickprocessor.js 以获得更多解释)。例如,GC 将打印诸如“scavenge,begin,...”之类的消息,但 logreader.js 无法识别。

      了解您使用什么分析库来解析v8.log 文件会有所帮助。

      更新

      node-tick 包一年多没有更新,可能缺少很多最近的prof 命令。尝试改用node-profiler。它是由节点的维护者之一创建的。如果你想要绝对最好的结果,你需要使用node-gyp 来构建它。

      更新

      我已经使用来自node-profiler 的最新版本(master 上的最新版本,而不是最新标签)解析了v8.log 输出,并将结果发布到http://pastebin.com/pdHDPjzE

      请允许我指出几个出现在一半左右的关键条目:

      [GC]:
        ticks  total  nonlib   name
        2063   26.2%
      
      [Bottom up (heavy) profile]
      6578   83.4%  c:\node\node.exe
      1812   27.5%    LazyCompile: ~parse native json.js:55
      1811   99.9%      Function: ~<anonymous> C:\workspace\repositories\asyncnode_MySQL\lib\MySQL_DB.js:41
       736   11.2%    Function: ~Buffer.toString buffer.js:392
      

      因此,所有脚本类型的 26.2% 用于垃圾收集。这比它应该的要高得多。尽管它确实与花在Buffer.toString 上的时间密切相关。如果创建了这么多缓冲区然后转换为字符串,则在它们离开范围时都需要 gc'd。

      我也很好奇为什么LazyCompile 花了这么多时间json.js。或者更重要的是,为什么 json.js 在节点应用程序中甚至是必要的?

      为了帮助您调整应用程序的性能,我在下面提供了一些链接,这些链接可以很好地说明要做什么和寻找什么。

      带有基础知识的漂亮幻灯片:
      https://mkw.st/p/gdd11-berlin-v8-performance-tuning-tricks/#1

      更高级的优化技术示例:
      http://floitsch.blogspot.com/2012/03/optimizing-for-v8-introduction.html

      更好地使用闭包:
      http://mrale.ph/blog/2012/09/23/grokking-v8-closures-for-fun.html

      现在至于为什么您无法获得相同的输出。如果您构建并使用了node-profiler 及其从master 提供的nprof,但它仍然不起作用,那么我认为它与在Windows 上有关。考虑在 GitHub 上提交一个错误,看看他是否会帮助你。

      【讨论】:

      • 我正在使用 npm 'tick' 包
      • 我尝试过使用github.com/bnoordhuis/node-profiler,但结果还是一样。
      • @coen 你能粘贴bin或你的v8.log文件吗?这将是我帮助你的最简单方法。
      猜你喜欢
      • 2014-09-29
      • 2017-08-13
      • 2016-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-30
      • 2020-01-26
      • 2018-08-09
      相关资源
      最近更新 更多