【问题标题】:How to analyze Node.js profile file on Mac?如何在 Mac 上分析 Node.js 配置文件?
【发布时间】:2018-02-14 14:47:13
【问题描述】:

我使用的是 Node.js 8.3。我使用node --prof server.js 来分析我的应用程序。我得到了一些类似 xxxx-v8.log 的文件。

我尝试使用https://www.npmjs.com/package/node-tick-processorhttps://github.com/sidorares/node-tick 来分析文件。我有兴趣查看 CPU 配置文件。

但是输出是这样的,帮助不大:

[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
  65591   59.5%  /usr/lib/system/libsystem_kernel.dylib
  42621   65.0%    /usr/local/bin/node

  16632   15.1%  /usr/local/bin/node
   5544   33.3%    /usr/local/bin/node

   5888    5.3%  /usr/lib/system/libsystem_c.dylib
   5875   99.8%    /usr/local/bin/node

   2702    2.4%  /usr/lib/system/libsystem_pthread.dylib
   2284   84.5%    /usr/local/bin/node


 [Top down (heavy) profile]:
  Note: callees occupying less than 0.1% are not shown.

  inclusive      self           name
  ticks   total  ticks   total
  68106   61.7%  11088   10.1%  /usr/local/bin/node
  42617   38.6%  42617   38.6%    /usr/lib/system/libsystem_kernel.dylib
   5875    5.3%   5875    5.3%    /usr/lib/system/libsystem_c.dylib
   5548    5.0%   5538    5.0%    /usr/local/bin/node
   2284    2.1%   2284    2.1%    /usr/lib/system/libsystem_pthread.dylib
    337    0.3%    337    0.3%    /usr/lib/system/libsystem_platform.dylib
    303    0.3%    303    0.3%    /usr/lib/system/libsystem_malloc.dylib

  22970   20.8%  22970   20.8%  /usr/lib/system/libsystem_kernel.dylib

    418    0.4%    418    0.4%  /usr/lib/system/libsystem_pthread.dylib

还有其他工具可以分析输出文件吗?我想看到一些显示瓶颈功能的东西,或者至少为我找到行号。我试过v8-profiler,它的输出文件需要加载到 Chrome 开发工具上。但格式看起来不同。我不确定我是否还能分析-v8.log 文件。

【问题讨论】:

    标签: node.js profiling


    【解决方案1】:

    您的工具使用绝对没有问题。这里的问题是named JS 函数对 CPU 消耗的贡献太小,无法在沉重的配置文件中看到。请注意您的个人资料输出中的警告(未显示少于 0.1% 的被调用者。)

    考虑我的代码:

    var x = 10;
    function foo() {
      while (true) {
        x++;
      }
    }
    foo();
    

    这是 prof 输出。如您所见,脚本、函数及其行 # 出现,作为主要的 CPU 消耗者。

     [Unknown]:
       ticks  total  nonlib   name
         13    0.3%
    
     [Shared libraries]:
       ticks  total  nonlib   name
         57    1.3%    0.0%  /usr/local/bin/node
          6    0.1%    0.0%  /usr/lib/system/libsystem_kernel.dylib
          2    0.0%    0.0%  /usr/lib/system/libsystem_platform.dylib
          1    0.0%    0.0%  /usr/lib/system/libsystem_pthread.dylib
          1    0.0%    0.0%  /usr/lib/system/libsystem_c.dylib
    
     [JavaScript]:
       ticks  total  nonlib   name
       4177   98.1%   99.7%  LazyCompile: *foo /Users/gireesh/a.js:2:13
          1    0.0%    0.0%  Stub: BinaryOpWithAllocationSiteStub
    
     [C++]:
       ticks  total  nonlib   name
    
     [GC]:
       ticks  total  nonlib   name
          2    0.0%
    
     [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
       4177   98.1%  LazyCompile: *foo /Users/gireesh/a.js:2:13
       4177  100.0%    LazyCompile: *foo /Users/gireesh/a.js:2:13
       4177  100.0%      Function: ~<anonymous> /Users/gireesh/a.js:1:11
       4177  100.0%        Function: ~Module._compile module.js:526:37
       4177  100.0%          Function: ~Module._extensions..js module.js:578:37
       4177  100.0%            Function: ~Module.load module.js:494:33
    

    希望这会有所帮助。

    【讨论】:

    • 这是否意味着我无法根据配置文件改善我的应用程序性能?我不是 Node 专家。这种 CPU 使用率可能是由于在使用直接访问 V8 引擎的 Node.js 方法时做了一些不恰当的事情造成的。我现在要放弃了。在这个阶段看不到如何改进我的应用程序。
    • 请不要这么快就放弃!使用-j 标记到tick 处理器,看看你的JS 配置文件已经进入高亮状态,丢弃VM、编译器和其他运行时状态。
    • 谢谢,但我在node-tick-processor node-tick 中看不到-j 选项。不知道如何正确使用它。此外,如果我需要更改的功能占用不到 0.1% 的 CPU,那么我继续改进它是没有意义的。除非有什么诡计能把真正的罪魁祸首隐藏在我的视线之外。
    • 抱歉耽搁了,这里是信息:bash$ node_modules/node-tick-processor/bin/node-tick-processor --help Cmdline args: [options] [log-file-name ] 默认日志文件名为“v8.log”。选项:-j,--js 仅显示来自 JS VM 状态的刻度 -g,--gc 仅显示来自 GC VM 状态的刻度 -c,--compiler 仅显示来自 COMPILER VM 状态的刻度 -o,--other 仅显示刻度from OTHER VM state -e, --external 仅显示来自EXTERNAL VM state github.com/drewfish/node-tick-processor/blob/master/bin/…的滴答声
    • 感谢您的帮助。但是我尝试过将-j 选项与node-tick-processor 一起使用,结果与以前基本相同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-25
    • 2015-07-14
    • 1970-01-01
    相关资源
    最近更新 更多