• Node.js调试相关


    如何进行Nodejs性能分析?

     

    nodejs性能最重要的两个部分:CPU耗时查看和内存泄漏排查

     

     

    一,CPU相关

     

    主要思路是两个:借助第三方的工具,以及借助v8自带的性能分析工具

     

    借助第三方的工具

     

    主要思路是:先生成cpuprofile,然后借助第三方工具生成可视化的图或者是文件。

     

    1,如何生成cpuprofile

     

    v8-profiler

     

    这是一个npm包,用法也很简单,引入后直接调用api:startProfiling,然后结束时调用stopProfiling,会生成一个profile对象,它支持export导出,再利用fs包去生成文件即可,最后删除这个对象,这个写出的文件就是cpuprofile文件了,可以配置指定请求URL去获取它。

     

    2,如何分析cpuprofile

     

    1. Chrome自带的DevTools工具
      1. 在More tools里有一个Javascript Profiler工具,然后load我们刚刚生成的cpuprofile文件即可。
      2. 通过默认的Tree选项,会按照调用栈排列展示。
      3. 然后勾选Total Time,按照函数及函数内部所有调用函数的时间总和进行排序,就可以定位到CPU耗时较多的方法了,从而就能定位到问题代码。

     

    (2) flamegraph

     

        这是一个npm包,用来生成火焰图,它是一个svg文件,用法也很简单,通过命令行直接生成即可

     

     (这里补充一下火焰图的知识点)

            (1) 每一个小块代表函数在栈中的位置;

            (2) Y轴代表栈的深度,顶部的小块表示占据CPU的函数,每一个小块下面是它的祖先,也就是父函数;

            (3) X轴没有什么特殊含义,跟时间轴无关,只是字母顺序排列;

            (4) 小块的宽度代表CPU的使用时间,小块越宽,CPU耗时越久,这也是我们需要重点关注的,如果性能较优的情况下,火焰图应该只有一小部分密密麻麻的小块,挤在一起靠边上。

     

    (3) v8-analytics

     

      这也是一个npm包,可以通过命令行查看执行时间大于某个时间(比如200ms)的函数

     

     

    借助V8Tick Processor

     

    主要思路是:先生成v8.log文件,然后对它进行分析

     

    1,如何生成v8.log

    V8内置了一个性能分析工具Tick Processor,可以记录JavaScript,C,C++代码的堆栈信息,可以通过  —prof 命令开启,就会生成一个v8.log文件。

     

    2,如何分析?

    1. 通过 —prof-process 命令去分析这个log文件,就可以看到每个函数的执行时间了。
    2. V8提供了一个可视化工具来查看生成的v8日志,在v8的GitHub仓库里,直接clone下来即可查看;

     

     

     

     

    二,内存

     

    如何查看内存?

     

    主要思路是:分析heapdump,通过生成heapsnapshot快照,再对快照进行分析。

     

    1,如何生成heapsnapshot快照?

     

    利用heapdump包,用法也很简单,直接引入即可,服务启动后就会在根目录下生成一个heapsnapshot文件了。

     

    2,如何分析?

    1. 利用Chrome DevToolsMemory面板

        (1) 通过load生成的heapsnapshot文件,选择Summary模式,就是按构造函数名分类;

        (2) 选中Retained Size,按照对象自身及内部包含的所有引用对象的大小总和进行排序,即可看到占比较大的对象,这也就是GC之后能回收的内存大小。

     

    如何分析内存泄漏?

     

    首先我们要明白为什么会造成内存泄漏?

    一般是因为闭包所占的内存空间没有被及时回收所导致的。

    在同一个函数内部闭包作用域只有一个,所有闭包共享,遇到闭包时会创建一个闭包作用域的内存空间,后续再遇到闭包,就会往之前创建过的闭包作用域里添加变量,函数执行完毕后回收没有用到的变量,而留下的就是导致内存泄漏的变量了。

     

    1,利用 memwatch-next 工具搭配heapdump使用,通过监听stats(每次GC都会触发stats)事件以及leak(连续5次GC后内存都上升就会触发)事件。启动时打印一次heapsnapshot快照,然后触发leak事件后callback里再打印一次快照。

     

    2,利用Chrome DevTools加载两次快照,选择Comparison比较试图,就可发现内存泄漏时增加的函数了,再根据刚刚上面提到的分析过程,定位到具体对象;

  • 相关阅读:
    ajaxfileupload.js类实现异步文件上传
    设计模式代理
    状态码的分析
    图片的格式的分析、 图片优化
    BFC
    css3 的新属性
    二列布局、三列布局总结
    position的定义
    new Vue 发生了什么
    数据驱动
  • 原文地址:https://www.cnblogs.com/yanchenyu/p/13563209.html
Copyright © 2020-2023  润新知